void grayscale(unsigned char *image32, unsigned char *image8,
               unsigned int width, unsigned int height) {
  unsigned int grayIndex = 0;
  for (int i = 0; i < width * height * 4; i += 4) {
    unsigned char avgVal =
        (unsigned char)((306 * (int)image32[i] + 601 * image32[i + 1] +
                         117 * image32[i + 2]) /
                        1024);
    image8[grayIndex] = avgVal;
    grayIndex++;
  }
}


x86 assembly (clang, -O0):
<grayscale>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    -0x14(%rbp),%ecx
imul   -0x18(%rbp),%ecx
shl    $0x2,%ecx
cmp    %ecx,%eax
jae    11a5 <grayscale+0xa5>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
imul   $0x132,%eax,%eax
mov    -0x8(%rbp),%rcx
mov    -0x20(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
imul   $0x259,%ecx,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
mov    -0x20(%rbp),%edx
add    $0x2,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
imul   $0x75,%ecx,%ecx
add    %ecx,%eax
mov    $0x400,%ecx
cltd
idiv   %ecx
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%dl
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x20(%rbp)
jmp    1120 <grayscale+0x20>
pop    %rbp
ret

x86 assembly (clang, -O2):
<grayscale>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
imul   %ecx,%edx
shl    $0x2,%edx
test   %edx,%edx
je     1190 <grayscale+0x90>
add    $0xffffffff,%edx
mov    %edx,%r11d
shr    $0x2,%r11d
add    $0x1,%r11d
cmp    $0x20,%edx
jb     113d <grayscale+0x3d>
lea    (%rdi,%r11,4),%rax
add    $0xffffffffffffffff,%rax
cmp    %rsi,%rax
jbe    119b <grayscale+0x9b>
lea    (%rsi,%r11,1),%rax
cmp    %rdi,%rax
jbe    119b <grayscale+0x9b>
xor    %r8d,%r8d
xor    %r10d,%r10d
lea    (%r8,%rdi,1),%rax
add    $0x2,%rax
add    %r10,%rsi
sub    %r10,%r11
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl -0x2(%rax,%rcx,4),%edx
imul   $0x132,%edx,%edx
movzbl -0x1(%rax,%rcx,4),%edi
imul   $0x259,%edi,%edi
add    %edx,%edi
movzbl (%rax,%rcx,4),%edx
imul   $0x75,%edx,%edx
add    %edi,%edx
shr    $0xa,%edx
mov    %dl,(%rsi,%rcx,1)
add    $0x1,%rcx
cmp    %rcx,%r11
jne    1160 <grayscale+0x60>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
cmp    $0x40,%edx
jae    11a8 <grayscale+0xa8>
xor    %r10d,%r10d
jmp    1504 <grayscale+0x404>
mov    %r11d,%eax
and    $0xf,%eax
test   %rax,%rax
mov    $0x10,%ecx
cmovne %rax,%rcx
mov    %r11,%r10
mov    %rcx,%rax
mov    %rcx,-0x10(%rsp)
sub    %rcx,%r10
mov    %rdi,-0x18(%rsp)
lea    0x3e(%rdi),%rdx
lea    -0x1(%r10),%rax
mov    %rax,-0x8(%rsp)
mov    $0xffffffffffffffff,%rcx
pxor   %xmm11,%xmm11
movdqa 0xe11(%rip),%xmm8
movdqa 0xe18(%rip),%xmm9
movdqa 0xe1f(%rip),%xmm10
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl -0x3a(%rdx,%rcx,4),%ebx
movzbl -0x32(%rdx,%rcx,4),%ebp
movzbl -0x2a(%rdx,%rcx,4),%r14d
movzbl -0x22(%rdx,%rcx,4),%r15d
movzbl -0x1a(%rdx,%rcx,4),%r12d
movzbl -0x12(%rdx,%rcx,4),%r13d
movzbl -0xa(%rdx,%rcx,4),%eax
movzbl -0x2(%rdx,%rcx,4),%r8d
movzbl -0x2e(%rdx,%rcx,4),%r9d
shl    $0x8,%r9d
or     %ebp,%r9d
movzbl -0x36(%rdx,%rcx,4),%ebp
shl    $0x8,%ebp
or     %ebx,%ebp
movd   %ebp,%xmm6
pinsrw $0x1,%r9d,%xmm6
movzbl 0x2(%rdx,%rcx,4),%ebp
shl    $0x8,%ebp
or     %r8d,%ebp
movzbl -0x6(%rdx,%rcx,4),%ebx
shl    $0x8,%ebx
or     %eax,%ebx
movd   %ebx,%xmm7
pinsrw $0x1,%ebp,%xmm7
punpcklbw %xmm11,%xmm7
movzbl -0xe(%rdx,%rcx,4),%eax
shl    $0x8,%eax
or     %r13d,%eax
movzbl -0x16(%rdx,%rcx,4),%ebp
shl    $0x8,%ebp
or     %r12d,%ebp
movd   %ebp,%xmm1
pinsrw $0x1,%eax,%xmm1
punpcklbw %xmm11,%xmm1
movzbl -0x1e(%rdx,%rcx,4),%eax
shl    $0x8,%eax
or     %r15d,%eax
movzbl -0x26(%rdx,%rcx,4),%ebp
shl    $0x8,%ebp
or     %r14d,%ebp
movd   %ebp,%xmm2
pinsrw $0x1,%eax,%xmm2
punpcklbw %xmm11,%xmm2
punpcklbw %xmm11,%xmm6
movzbl -0x39(%rdx,%rcx,4),%edi
movzbl -0x31(%rdx,%rcx,4),%ebx
movzbl -0x29(%rdx,%rcx,4),%r14d
movzbl -0x21(%rdx,%rcx,4),%r8d
movzbl -0x19(%rdx,%rcx,4),%r9d
movzbl -0x11(%rdx,%rcx,4),%r15d
movzbl -0x9(%rdx,%rcx,4),%r12d
movzbl -0x1(%rdx,%rcx,4),%eax
movzbl -0x2d(%rdx,%rcx,4),%ebp
shl    $0x8,%ebp
or     %ebx,%ebp
movzbl -0x35(%rdx,%rcx,4),%ebx
shl    $0x8,%ebx
or     %edi,%ebx
movd   %ebx,%xmm4
pinsrw $0x1,%ebp,%xmm4
movzbl 0x3(%rdx,%rcx,4),%edi
shl    $0x8,%edi
or     %eax,%edi
movzbl -0x5(%rdx,%rcx,4),%eax
shl    $0x8,%eax
or     %r12d,%eax
movd   %eax,%xmm5
pinsrw $0x1,%edi,%xmm5
punpcklbw %xmm11,%xmm5
punpcklwd %xmm7,%xmm5
movzbl -0xd(%rdx,%rcx,4),%eax
shl    $0x8,%eax
or     %r15d,%eax
movzbl -0x15(%rdx,%rcx,4),%edi
shl    $0x8,%edi
or     %r9d,%edi
movd   %edi,%xmm7
pinsrw $0x1,%eax,%xmm7
punpcklbw %xmm11,%xmm7
punpcklwd %xmm1,%xmm7
movzbl -0x1d(%rdx,%rcx,4),%eax
shl    $0x8,%eax
or     %r8d,%eax
movzbl -0x25(%rdx,%rcx,4),%edi
shl    $0x8,%edi
or     %r14d,%edi
movd   %edi,%xmm1
pinsrw $0x1,%eax,%xmm1
punpcklbw %xmm11,%xmm1
punpcklwd %xmm2,%xmm1
punpcklbw %xmm11,%xmm4
punpcklwd %xmm6,%xmm4
pmaddwd %xmm8,%xmm4
pmaddwd %xmm8,%xmm1
pmaddwd %xmm8,%xmm7
pmaddwd %xmm8,%xmm5
movzbl -0x38(%rdx,%rcx,4),%edi
movzbl -0x30(%rdx,%rcx,4),%ebx
movzbl -0x28(%rdx,%rcx,4),%r14d
movzbl -0x20(%rdx,%rcx,4),%r8d
movzbl -0x18(%rdx,%rcx,4),%r9d
movzbl -0x10(%rdx,%rcx,4),%r15d
movzbl -0x8(%rdx,%rcx,4),%r12d
movzbl (%rdx,%rcx,4),%eax
movzbl -0x2c(%rdx,%rcx,4),%ebp
shl    $0x8,%ebp
or     %ebx,%ebp
movzbl -0x34(%rdx,%rcx,4),%ebx
shl    $0x8,%ebx
or     %edi,%ebx
movd   %ebx,%xmm6
pinsrw $0x1,%ebp,%xmm6
movzbl 0x4(%rdx,%rcx,4),%edi
shl    $0x8,%edi
or     %eax,%edi
movzbl -0x4(%rdx,%rcx,4),%eax
shl    $0x8,%eax
or     %r12d,%eax
movd   %eax,%xmm2
pinsrw $0x1,%edi,%xmm2
punpcklbw %xmm11,%xmm2
punpcklwd %xmm11,%xmm2
movzbl -0xc(%rdx,%rcx,4),%eax
shl    $0x8,%eax
or     %r15d,%eax
movzbl -0x14(%rdx,%rcx,4),%edi
shl    $0x8,%edi
or     %r9d,%edi
movd   %edi,%xmm3
pinsrw $0x1,%eax,%xmm3
punpcklbw %xmm11,%xmm3
punpcklwd %xmm11,%xmm3
movzbl -0x1c(%rdx,%rcx,4),%eax
shl    $0x8,%eax
or     %r8d,%eax
movzbl -0x24(%rdx,%rcx,4),%edi
shl    $0x8,%edi
or     %r14d,%edi
movd   %edi,%xmm0
pinsrw $0x1,%eax,%xmm0
punpcklbw %xmm11,%xmm0
punpcklwd %xmm11,%xmm0
punpcklbw %xmm11,%xmm6
punpcklwd %xmm11,%xmm6
pmaddwd %xmm9,%xmm6
paddd  %xmm4,%xmm6
pmaddwd %xmm9,%xmm0
paddd  %xmm1,%xmm0
pmaddwd %xmm9,%xmm3
paddd  %xmm7,%xmm3
pmaddwd %xmm9,%xmm2
paddd  %xmm5,%xmm2
psrld  $0xa,%xmm6
psrld  $0xa,%xmm0
psrld  $0xa,%xmm3
psrld  $0xa,%xmm2
pand   %xmm10,%xmm2
pand   %xmm10,%xmm3
packuswb %xmm2,%xmm3
pand   %xmm10,%xmm0
pand   %xmm10,%xmm6
packuswb %xmm0,%xmm6
packuswb %xmm3,%xmm6
movdqu %xmm6,0x1(%rsi,%rcx,1)
add    $0x10,%rcx
cmp    %rcx,-0x8(%rsp)
jne    1210 <grayscale+0x110>
cmpl   $0x8,-0x10(%rsp)
ja     14ff <grayscale+0x3ff>
lea    0x0(,%r10,4),%r8
mov    -0x18(%rsp),%rdi
jmp    1143 <grayscale+0x43>
mov    -0x18(%rsp),%rdi
mov    %r11d,%eax
and    $0x7,%eax
test   %rax,%rax
mov    $0x8,%ecx
cmovne %rax,%rcx
mov    %r10,%rdx
mov    %r11,%r10
sub    %rcx,%r10
lea    0x0(,%r10,4),%r8
lea    0x1e(%rdi),%rcx
pxor   %xmm0,%xmm0
movdqa 0xac9(%rip),%xmm1
movdqa 0xad1(%rip),%xmm2
movdqa 0xad9(%rip),%xmm3
nopw   0x0(%rax,%rax,1)
movzbl -0x1e(%rcx,%rdx,4),%eax
movzbl -0x16(%rcx,%rdx,4),%ebx
movzbl -0xe(%rcx,%rdx,4),%r9d
movzbl -0x6(%rcx,%rdx,4),%r14d
movzbl -0x12(%rcx,%rdx,4),%ebp
shl    $0x8,%ebp
or     %ebx,%ebp
movzbl -0x1a(%rcx,%rdx,4),%ebx
shl    $0x8,%ebx
or     %eax,%ebx
movd   %ebx,%xmm6
pinsrw $0x1,%ebp,%xmm6
movzbl -0x2(%rcx,%rdx,4),%eax
shl    $0x8,%eax
or     %r14d,%eax
movzbl -0xa(%rcx,%rdx,4),%ebx
shl    $0x8,%ebx
or     %r9d,%ebx
movd   %ebx,%xmm7
pinsrw $0x1,%eax,%xmm7
punpcklbw %xmm0,%xmm7
punpcklbw %xmm0,%xmm6
movzbl -0x1d(%rcx,%rdx,4),%eax
movzbl -0x15(%rcx,%rdx,4),%ebx
movzbl -0xd(%rcx,%rdx,4),%r9d
movzbl -0x5(%rcx,%rdx,4),%r14d
movzbl -0x11(%rcx,%rdx,4),%ebp
shl    $0x8,%ebp
or     %ebx,%ebp
movzbl -0x19(%rcx,%rdx,4),%ebx
shl    $0x8,%ebx
or     %eax,%ebx
movd   %ebx,%xmm4
pinsrw $0x1,%ebp,%xmm4
movzbl -0x1(%rcx,%rdx,4),%eax
shl    $0x8,%eax
or     %r14d,%eax
movzbl -0x9(%rcx,%rdx,4),%ebx
shl    $0x8,%ebx
or     %r9d,%ebx
movd   %ebx,%xmm5
pinsrw $0x1,%eax,%xmm5
punpcklbw %xmm0,%xmm5
punpcklwd %xmm7,%xmm5
punpcklbw %xmm0,%xmm4
punpcklwd %xmm6,%xmm4
pmaddwd %xmm1,%xmm4
pmaddwd %xmm1,%xmm5
movzbl -0x1c(%rcx,%rdx,4),%eax
movzbl -0x14(%rcx,%rdx,4),%ebx
movzbl -0xc(%rcx,%rdx,4),%r9d
movzbl -0x4(%rcx,%rdx,4),%r14d
movzbl -0x10(%rcx,%rdx,4),%ebp
shl    $0x8,%ebp
or     %ebx,%ebp
movzbl -0x18(%rcx,%rdx,4),%ebx
shl    $0x8,%ebx
or     %eax,%ebx
movd   %ebx,%xmm6
pinsrw $0x1,%ebp,%xmm6
movzbl (%rcx,%rdx,4),%eax
shl    $0x8,%eax
or     %r14d,%eax
movzbl -0x8(%rcx,%rdx,4),%ebx
shl    $0x8,%ebx
or     %r9d,%ebx
movd   %ebx,%xmm7
pinsrw $0x1,%eax,%xmm7
punpcklbw %xmm0,%xmm7
punpcklwd %xmm0,%xmm7
punpcklbw %xmm0,%xmm6
punpcklwd %xmm0,%xmm6
pmaddwd %xmm2,%xmm6
paddd  %xmm4,%xmm6
pmaddwd %xmm2,%xmm7
paddd  %xmm5,%xmm7
psrld  $0xa,%xmm6
psrld  $0xa,%xmm7
pand   %xmm3,%xmm7
pand   %xmm3,%xmm6
packuswb %xmm7,%xmm6
packuswb %xmm6,%xmm6
movq   %xmm6,(%rsi,%rdx,1)
add    $0x8,%rdx
cmp    %rdx,%r10
jne    1550 <grayscale+0x450>
jmp    1143 <grayscale+0x43>

LLVM IR (-O0):
define void @grayscale(i8* %0, i8* %1, i32 %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8
store i8* %0, i8** %5
store i8* %1, i8** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
store i32 0, i32* %9
store i32 0, i32* %10
br label %12
12: ; preds = %54, %4
%13 = load i32, i32* %10
%14 = load i32, i32* %7
%15 = load i32, i32* %8
%16 = mul i32 %14, %15
%17 = mul i32 %16, 4
%18 = icmp ult i32 %13, %17
br i1 %18, label %19, label %57
19: ; preds = %12
%20 = load i8*, i8** %5
%21 = load i32, i32* %10
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i8, i8* %20, i64 %22
%24 = load i8, i8* %23
%25 = zext i8 %24 to i32
%26 = mul nsw i32 306, %25
%27 = load i8*, i8** %5
%28 = load i32, i32* %10
%29 = add nsw i32 %28, 1
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i8, i8* %27, i64 %30
%32 = load i8, i8* %31
%33 = zext i8 %32 to i32
%34 = mul nsw i32 601, %33
%35 = add nsw i32 %26, %34
%36 = load i8*, i8** %5
%37 = load i32, i32* %10
%38 = add nsw i32 %37, 2
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %36, i64 %39
%41 = load i8, i8* %40
%42 = zext i8 %41 to i32
%43 = mul nsw i32 117, %42
%44 = add nsw i32 %35, %43
%45 = sdiv i32 %44, 1024
%46 = trunc i32 %45 to i8
store i8 %46, i8* %11
%47 = load i8, i8* %11
%48 = load i8*, i8** %6
%49 = load i32, i32* %9
%50 = zext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %48, i64 %50
store i8 %47, i8* %51
%52 = load i32, i32* %9
%53 = add i32 %52, 1
store i32 %53, i32* %9
br label %54
54: ; preds = %19
%55 = load i32, i32* %10
%56 = add nsw i32 %55, 4
store i32 %56, i32* %10
br label %12
57: ; preds = %12
ret void
}

LLVM IR (-O2):
define void @grayscale(i8* nocapture %0, i8* nocapture writeonly %1, i32 %2, i32 %3) {
%5 = shl i32 %2, 2
%6 = mul i32 %5, %3
%7 = icmp eq i32 %6, 0
br i1 %7, label %362, label %8
8: ; preds = %4
%9 = add i32 %6, -1
%10 = lshr i32 %9, 2
%11 = add nuw nsw i32 %10, 1
%12 = zext i32 %11 to i64
%13 = icmp ult i32 %9, 32
br i1 %13, label %240, label %14
14: ; preds = %8
%15 = getelementptr i8, i8* %1, i64 %12
%16 = shl nuw nsw i64 %12, 2
%17 = add nsw i64 %16, -1
%18 = getelementptr i8, i8* %0, i64 %17
%19 = icmp ugt i8* %18, %1
%20 = icmp ugt i8* %15, %0
%21 = and i1 %19, %20
br i1 %21, label %240, label %22
22: ; preds = %14
%23 = icmp ult i32 %9, 64
br i1 %23, label %243, label %24
24: ; preds = %22
%25 = and i64 %12, 15
%26 = icmp eq i64 %25, 0
%27 = select i1 %26, i64 16, i64 %25
%28 = sub nsw i64 %12, %27
br label %29
29: ; preds = %29, %24
%30 = phi i64 [ 0, %24 ], [ %235, %29 ]
%31 = shl i64 %30, 2
%32 = or i64 %31, 4
%33 = or i64 %31, 8
%34 = or i64 %31, 12
%35 = or i64 %31, 16
%36 = or i64 %31, 20
%37 = or i64 %31, 24
%38 = or i64 %31, 28
%39 = or i64 %31, 32
%40 = or i64 %31, 36
%41 = or i64 %31, 40
%42 = or i64 %31, 44
%43 = or i64 %31, 48
%44 = or i64 %31, 52
%45 = or i64 %31, 56
%46 = or i64 %31, 60
%47 = getelementptr inbounds i8, i8* %0, i64 %31
%48 = getelementptr inbounds i8, i8* %0, i64 %32
%49 = getelementptr inbounds i8, i8* %0, i64 %33
%50 = getelementptr inbounds i8, i8* %0, i64 %34
%51 = getelementptr inbounds i8, i8* %0, i64 %35
%52 = getelementptr inbounds i8, i8* %0, i64 %36
%53 = getelementptr inbounds i8, i8* %0, i64 %37
%54 = getelementptr inbounds i8, i8* %0, i64 %38
%55 = getelementptr inbounds i8, i8* %0, i64 %39
%56 = getelementptr inbounds i8, i8* %0, i64 %40
%57 = getelementptr inbounds i8, i8* %0, i64 %41
%58 = getelementptr inbounds i8, i8* %0, i64 %42
%59 = getelementptr inbounds i8, i8* %0, i64 %43
%60 = getelementptr inbounds i8, i8* %0, i64 %44
%61 = getelementptr inbounds i8, i8* %0, i64 %45
%62 = getelementptr inbounds i8, i8* %0, i64 %46
%63 = load i8, i8* %47
%64 = load i8, i8* %48
%65 = load i8, i8* %49
%66 = load i8, i8* %50
%67 = load i8, i8* %51
%68 = load i8, i8* %52
%69 = load i8, i8* %53
%70 = load i8, i8* %54
%71 = load i8, i8* %55
%72 = load i8, i8* %56
%73 = load i8, i8* %57
%74 = load i8, i8* %58
%75 = load i8, i8* %59
%76 = load i8, i8* %60
%77 = load i8, i8* %61
%78 = load i8, i8* %62
%79 = insertelement <16 x i8> poison, i8 %63, i64 0
%80 = insertelement <16 x i8> %79, i8 %64, i64 1
%81 = insertelement <16 x i8> %80, i8 %65, i64 2
%82 = insertelement <16 x i8> %81, i8 %66, i64 3
%83 = insertelement <16 x i8> %82, i8 %67, i64 4
%84 = insertelement <16 x i8> %83, i8 %68, i64 5
%85 = insertelement <16 x i8> %84, i8 %69, i64 6
%86 = insertelement <16 x i8> %85, i8 %70, i64 7
%87 = insertelement <16 x i8> %86, i8 %71, i64 8
%88 = insertelement <16 x i8> %87, i8 %72, i64 9
%89 = insertelement <16 x i8> %88, i8 %73, i64 10
%90 = insertelement <16 x i8> %89, i8 %74, i64 11
%91 = insertelement <16 x i8> %90, i8 %75, i64 12
%92 = insertelement <16 x i8> %91, i8 %76, i64 13
%93 = insertelement <16 x i8> %92, i8 %77, i64 14
%94 = insertelement <16 x i8> %93, i8 %78, i64 15
%95 = zext <16 x i8> %94 to <16 x i32>
%96 = mul nuw nsw <16 x i32> %95, <i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306>
%97 = or i64 %31, 1
%98 = or i64 %31, 5
%99 = or i64 %31, 9
%100 = or i64 %31, 13
%101 = or i64 %31, 17
%102 = or i64 %31, 21
%103 = or i64 %31, 25
%104 = or i64 %31, 29
%105 = or i64 %31, 33
%106 = or i64 %31, 37
%107 = or i64 %31, 41
%108 = or i64 %31, 45
%109 = or i64 %31, 49
%110 = or i64 %31, 53
%111 = or i64 %31, 57
%112 = or i64 %31, 61
%113 = getelementptr inbounds i8, i8* %0, i64 %97
%114 = getelementptr inbounds i8, i8* %0, i64 %98
%115 = getelementptr inbounds i8, i8* %0, i64 %99
%116 = getelementptr inbounds i8, i8* %0, i64 %100
%117 = getelementptr inbounds i8, i8* %0, i64 %101
%118 = getelementptr inbounds i8, i8* %0, i64 %102
%119 = getelementptr inbounds i8, i8* %0, i64 %103
%120 = getelementptr inbounds i8, i8* %0, i64 %104
%121 = getelementptr inbounds i8, i8* %0, i64 %105
%122 = getelementptr inbounds i8, i8* %0, i64 %106
%123 = getelementptr inbounds i8, i8* %0, i64 %107
%124 = getelementptr inbounds i8, i8* %0, i64 %108
%125 = getelementptr inbounds i8, i8* %0, i64 %109
%126 = getelementptr inbounds i8, i8* %0, i64 %110
%127 = getelementptr inbounds i8, i8* %0, i64 %111
%128 = getelementptr inbounds i8, i8* %0, i64 %112
%129 = load i8, i8* %113
%130 = load i8, i8* %114
%131 = load i8, i8* %115
%132 = load i8, i8* %116
%133 = load i8, i8* %117
%134 = load i8, i8* %118
%135 = load i8, i8* %119
%136 = load i8, i8* %120
%137 = load i8, i8* %121
%138 = load i8, i8* %122
%139 = load i8, i8* %123
%140 = load i8, i8* %124
%141 = load i8, i8* %125
%142 = load i8, i8* %126
%143 = load i8, i8* %127
%144 = load i8, i8* %128
%145 = insertelement <16 x i8> poison, i8 %129, i64 0
%146 = insertelement <16 x i8> %145, i8 %130, i64 1
%147 = insertelement <16 x i8> %146, i8 %131, i64 2
%148 = insertelement <16 x i8> %147, i8 %132, i64 3
%149 = insertelement <16 x i8> %148, i8 %133, i64 4
%150 = insertelement <16 x i8> %149, i8 %134, i64 5
%151 = insertelement <16 x i8> %150, i8 %135, i64 6
%152 = insertelement <16 x i8> %151, i8 %136, i64 7
%153 = insertelement <16 x i8> %152, i8 %137, i64 8
%154 = insertelement <16 x i8> %153, i8 %138, i64 9
%155 = insertelement <16 x i8> %154, i8 %139, i64 10
%156 = insertelement <16 x i8> %155, i8 %140, i64 11
%157 = insertelement <16 x i8> %156, i8 %141, i64 12
%158 = insertelement <16 x i8> %157, i8 %142, i64 13
%159 = insertelement <16 x i8> %158, i8 %143, i64 14
%160 = insertelement <16 x i8> %159, i8 %144, i64 15
%161 = zext <16 x i8> %160 to <16 x i32>
%162 = mul nuw nsw <16 x i32> %161, <i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601>
%163 = add nuw nsw <16 x i32> %162, %96
%164 = or i64 %31, 2
%165 = or i64 %31, 6
%166 = or i64 %31, 10
%167 = or i64 %31, 14
%168 = or i64 %31, 18
%169 = or i64 %31, 22
%170 = or i64 %31, 26
%171 = or i64 %31, 30
%172 = or i64 %31, 34
%173 = or i64 %31, 38
%174 = or i64 %31, 42
%175 = or i64 %31, 46
%176 = or i64 %31, 50
%177 = or i64 %31, 54
%178 = or i64 %31, 58
%179 = or i64 %31, 62
%180 = getelementptr inbounds i8, i8* %0, i64 %164
%181 = getelementptr inbounds i8, i8* %0, i64 %165
%182 = getelementptr inbounds i8, i8* %0, i64 %166
%183 = getelementptr inbounds i8, i8* %0, i64 %167
%184 = getelementptr inbounds i8, i8* %0, i64 %168
%185 = getelementptr inbounds i8, i8* %0, i64 %169
%186 = getelementptr inbounds i8, i8* %0, i64 %170
%187 = getelementptr inbounds i8, i8* %0, i64 %171
%188 = getelementptr inbounds i8, i8* %0, i64 %172
%189 = getelementptr inbounds i8, i8* %0, i64 %173
%190 = getelementptr inbounds i8, i8* %0, i64 %174
%191 = getelementptr inbounds i8, i8* %0, i64 %175
%192 = getelementptr inbounds i8, i8* %0, i64 %176
%193 = getelementptr inbounds i8, i8* %0, i64 %177
%194 = getelementptr inbounds i8, i8* %0, i64 %178
%195 = getelementptr inbounds i8, i8* %0, i64 %179
%196 = load i8, i8* %180
%197 = load i8, i8* %181
%198 = load i8, i8* %182
%199 = load i8, i8* %183
%200 = load i8, i8* %184
%201 = load i8, i8* %185
%202 = load i8, i8* %186
%203 = load i8, i8* %187
%204 = load i8, i8* %188
%205 = load i8, i8* %189
%206 = load i8, i8* %190
%207 = load i8, i8* %191
%208 = load i8, i8* %192
%209 = load i8, i8* %193
%210 = load i8, i8* %194
%211 = load i8, i8* %195
%212 = insertelement <16 x i8> poison, i8 %196, i64 0
%213 = insertelement <16 x i8> %212, i8 %197, i64 1
%214 = insertelement <16 x i8> %213, i8 %198, i64 2
%215 = insertelement <16 x i8> %214, i8 %199, i64 3
%216 = insertelement <16 x i8> %215, i8 %200, i64 4
%217 = insertelement <16 x i8> %216, i8 %201, i64 5
%218 = insertelement <16 x i8> %217, i8 %202, i64 6
%219 = insertelement <16 x i8> %218, i8 %203, i64 7
%220 = insertelement <16 x i8> %219, i8 %204, i64 8
%221 = insertelement <16 x i8> %220, i8 %205, i64 9
%222 = insertelement <16 x i8> %221, i8 %206, i64 10
%223 = insertelement <16 x i8> %222, i8 %207, i64 11
%224 = insertelement <16 x i8> %223, i8 %208, i64 12
%225 = insertelement <16 x i8> %224, i8 %209, i64 13
%226 = insertelement <16 x i8> %225, i8 %210, i64 14
%227 = insertelement <16 x i8> %226, i8 %211, i64 15
%228 = zext <16 x i8> %227 to <16 x i32>
%229 = mul nuw nsw <16 x i32> %228, <i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117>
%230 = add nuw nsw <16 x i32> %163, %229
%231 = lshr <16 x i32> %230, <i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10>
%232 = trunc <16 x i32> %231 to <16 x i8>
%233 = getelementptr inbounds i8, i8* %1, i64 %30
%234 = bitcast i8* %233 to <16 x i8>*
store <16 x i8> %232, <16 x i8>* %234
%235 = add nuw i64 %30, 16
%236 = icmp eq i64 %235, %28
br i1 %236, label %237, label %29
237: ; preds = %29
%238 = shl nsw i64 %28, 2
%239 = icmp ult i64 %27, 9
br i1 %239, label %240, label %243
240: ; preds = %250, %14, %8, %237
%241 = phi i64 [ 0, %8 ], [ 0, %14 ], [ %238, %237 ], [ %249, %250 ]
%242 = phi i64 [ 0, %8 ], [ 0, %14 ], [ %28, %237 ], [ %248, %250 ]
br label %363
243: ; preds = %22, %237
%244 = phi i64 [ %28, %237 ], [ 0, %22 ]
%245 = and i64 %12, 7
%246 = icmp eq i64 %245, 0
%247 = select i1 %246, i64 8, i64 %245
%248 = sub nsw i64 %12, %247
%249 = shl nsw i64 %248, 2
br label %250
250: ; preds = %250, %243
%251 = phi i64 [ %244, %243 ], [ %360, %250 ]
%252 = shl i64 %251, 2
%253 = add i64 %252, 4
%254 = add i64 %252, 8
%255 = add i64 %252, 12
%256 = add i64 %252, 16
%257 = add i64 %252, 20
%258 = add i64 %252, 24
%259 = add i64 %252, 28
%260 = getelementptr inbounds i8, i8* %0, i64 %252
%261 = getelementptr inbounds i8, i8* %0, i64 %253
%262 = getelementptr inbounds i8, i8* %0, i64 %254
%263 = getelementptr inbounds i8, i8* %0, i64 %255
%264 = getelementptr inbounds i8, i8* %0, i64 %256
%265 = getelementptr inbounds i8, i8* %0, i64 %257
%266 = getelementptr inbounds i8, i8* %0, i64 %258
%267 = getelementptr inbounds i8, i8* %0, i64 %259
%268 = load i8, i8* %260
%269 = load i8, i8* %261
%270 = load i8, i8* %262
%271 = load i8, i8* %263
%272 = load i8, i8* %264
%273 = load i8, i8* %265
%274 = load i8, i8* %266
%275 = load i8, i8* %267
%276 = insertelement <8 x i8> poison, i8 %268, i64 0
%277 = insertelement <8 x i8> %276, i8 %269, i64 1
%278 = insertelement <8 x i8> %277, i8 %270, i64 2
%279 = insertelement <8 x i8> %278, i8 %271, i64 3
%280 = insertelement <8 x i8> %279, i8 %272, i64 4
%281 = insertelement <8 x i8> %280, i8 %273, i64 5
%282 = insertelement <8 x i8> %281, i8 %274, i64 6
%283 = insertelement <8 x i8> %282, i8 %275, i64 7
%284 = zext <8 x i8> %283 to <8 x i32>
%285 = mul nuw nsw <8 x i32> %284, <i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306, i32 306>
%286 = or i64 %252, 1
%287 = or i64 %253, 1
%288 = or i64 %254, 1
%289 = or i64 %255, 1
%290 = or i64 %256, 1
%291 = or i64 %257, 1
%292 = or i64 %258, 1
%293 = or i64 %259, 1
%294 = getelementptr inbounds i8, i8* %0, i64 %286
%295 = getelementptr inbounds i8, i8* %0, i64 %287
%296 = getelementptr inbounds i8, i8* %0, i64 %288
%297 = getelementptr inbounds i8, i8* %0, i64 %289
%298 = getelementptr inbounds i8, i8* %0, i64 %290
%299 = getelementptr inbounds i8, i8* %0, i64 %291
%300 = getelementptr inbounds i8, i8* %0, i64 %292
%301 = getelementptr inbounds i8, i8* %0, i64 %293
%302 = load i8, i8* %294
%303 = load i8, i8* %295
%304 = load i8, i8* %296
%305 = load i8, i8* %297
%306 = load i8, i8* %298
%307 = load i8, i8* %299
%308 = load i8, i8* %300
%309 = load i8, i8* %301
%310 = insertelement <8 x i8> poison, i8 %302, i64 0
%311 = insertelement <8 x i8> %310, i8 %303, i64 1
%312 = insertelement <8 x i8> %311, i8 %304, i64 2
%313 = insertelement <8 x i8> %312, i8 %305, i64 3
%314 = insertelement <8 x i8> %313, i8 %306, i64 4
%315 = insertelement <8 x i8> %314, i8 %307, i64 5
%316 = insertelement <8 x i8> %315, i8 %308, i64 6
%317 = insertelement <8 x i8> %316, i8 %309, i64 7
%318 = zext <8 x i8> %317 to <8 x i32>
%319 = mul nuw nsw <8 x i32> %318, <i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601, i32 601>
%320 = add nuw nsw <8 x i32> %319, %285
%321 = or i64 %252, 2
%322 = or i64 %253, 2
%323 = or i64 %254, 2
%324 = or i64 %255, 2
%325 = or i64 %256, 2
%326 = or i64 %257, 2
%327 = or i64 %258, 2
%328 = or i64 %259, 2
%329 = getelementptr inbounds i8, i8* %0, i64 %321
%330 = getelementptr inbounds i8, i8* %0, i64 %322
%331 = getelementptr inbounds i8, i8* %0, i64 %323
%332 = getelementptr inbounds i8, i8* %0, i64 %324
%333 = getelementptr inbounds i8, i8* %0, i64 %325
%334 = getelementptr inbounds i8, i8* %0, i64 %326
%335 = getelementptr inbounds i8, i8* %0, i64 %327
%336 = getelementptr inbounds i8, i8* %0, i64 %328
%337 = load i8, i8* %329
%338 = load i8, i8* %330
%339 = load i8, i8* %331
%340 = load i8, i8* %332
%341 = load i8, i8* %333
%342 = load i8, i8* %334
%343 = load i8, i8* %335
%344 = load i8, i8* %336
%345 = insertelement <8 x i8> poison, i8 %337, i64 0
%346 = insertelement <8 x i8> %345, i8 %338, i64 1
%347 = insertelement <8 x i8> %346, i8 %339, i64 2
%348 = insertelement <8 x i8> %347, i8 %340, i64 3
%349 = insertelement <8 x i8> %348, i8 %341, i64 4
%350 = insertelement <8 x i8> %349, i8 %342, i64 5
%351 = insertelement <8 x i8> %350, i8 %343, i64 6
%352 = insertelement <8 x i8> %351, i8 %344, i64 7
%353 = zext <8 x i8> %352 to <8 x i32>
%354 = mul nuw nsw <8 x i32> %353, <i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117>
%355 = add nuw nsw <8 x i32> %320, %354
%356 = lshr <8 x i32> %355, <i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10>
%357 = trunc <8 x i32> %356 to <8 x i8>
%358 = getelementptr inbounds i8, i8* %1, i64 %251
%359 = bitcast i8* %358 to <8 x i8>*
store <8 x i8> %357, <8 x i8>* %359
%360 = add nuw i64 %251, 8
%361 = icmp eq i64 %360, %248
br i1 %361, label %240, label %250
362: ; preds = %363, %4
ret void
363: ; preds = %240, %363
%364 = phi i64 [ %386, %363 ], [ %241, %240 ]
%365 = phi i64 [ %385, %363 ], [ %242, %240 ]
%366 = getelementptr inbounds i8, i8* %0, i64 %364
%367 = load i8, i8* %366
%368 = zext i8 %367 to i32
%369 = mul nuw nsw i32 %368, 306
%370 = or i64 %364, 1
%371 = getelementptr inbounds i8, i8* %0, i64 %370
%372 = load i8, i8* %371
%373 = zext i8 %372 to i32
%374 = mul nuw nsw i32 %373, 601
%375 = add nuw nsw i32 %374, %369
%376 = or i64 %364, 2
%377 = getelementptr inbounds i8, i8* %0, i64 %376
%378 = load i8, i8* %377
%379 = zext i8 %378 to i32
%380 = mul nuw nsw i32 %379, 117
%381 = add nuw nsw i32 %375, %380
%382 = lshr i32 %381, 10
%383 = trunc i32 %382 to i8
%384 = getelementptr inbounds i8, i8* %1, i64 %365
store i8 %383, i8* %384
%385 = add nuw nsw i64 %365, 1
%386 = add nuw nsw i64 %364, 4
%387 = icmp eq i64 %385, %12
br i1 %387, label %362, label %363
}