int check_buf(unsigned char *buf, unsigned int size) {
  int m = 256;
  int n = 10;
  int i, k;
  int error_count = 0;
  while (--n > 0) {
    for (i = 0; i < size; i = i + m) {
      m = (i + 256 < size) ? 256 : (size - i);
      for (k = 0; k < m; k++) {
        buf[i + k] = (k & 0xFF);
      }
      for (k = 0; k < m; k++) {
        if (buf[i + k] != (k & 0xFF)) {
          error_count++;
        }
      }
    }
  }
  return error_count;
}


x86 assembly (clang, -O0):
<check_buf>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x100,-0x10(%rbp)
movl   $0xa,-0x14(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jle    1216 <check_buf+0x116>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jae    1211 <check_buf+0x111>
mov    -0x18(%rbp),%eax
add    $0x100,%eax
cmp    -0xc(%rbp),%eax
jae    1163 <check_buf+0x63>
mov    $0x100,%eax
mov    %eax,-0x24(%rbp)
jmp    116c <check_buf+0x6c>
mov    -0xc(%rbp),%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x10(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    11ad <check_buf+0xad>
mov    -0x1c(%rbp),%eax
and    $0xff,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1179 <check_buf+0x79>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    11fe <check_buf+0xfe>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x1c(%rbp),%ecx
and    $0xff,%ecx
cmp    %ecx,%eax
je     11eb <check_buf+0xeb>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11f0 <check_buf+0xf0>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11b4 <check_buf+0xb4>
jmp    1203 <check_buf+0x103>
mov    -0x18(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1139 <check_buf+0x39>
jmp    1120 <check_buf+0x20>
mov    -0x20(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_buf>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
lea    0x70(%rdi),%rax
mov    %rax,-0x10(%rsp)
lea    0x10(%rdi),%rax
mov    %rax,-0x8(%rsp)
lea    0xc(%rdi),%rax
mov    %rax,-0x18(%rsp)
xor    %eax,%eax
mov    $0x9,%r11d
mov    $0x100,%r14d
movdqa 0xf65(%rip),%xmm5
pcmpeqd %xmm14,%xmm14
movdqa 0xf67(%rip),%xmm15
movdqa 0xf6e(%rip),%xmm9
movdqa 0xf75(%rip),%xmm10
movdqa 0xf7d(%rip),%xmm0
movdqa 0xea5(%rip),%xmm3
movdqa 0xead(%rip),%xmm7
movdqa 0xeb4(%rip),%xmm8
movdqa 0xebb(%rip),%xmm11
movdqa 0xec2(%rip),%xmm12
movdqa 0xec9(%rip),%xmm13
movdqa 0xed1(%rip),%xmm2
jmp    11c1 <check_buf+0xc1>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    -0x1(%r11),%ecx
cmp    $0x2,%r11d
mov    %ecx,%r11d
jb     1562 <check_buf+0x462>
test   %esi,%esi
je     11b0 <check_buf+0xb0>
xor    %r15d,%r15d
jmp    11d8 <check_buf+0xd8>
nopw   0x0(%rax,%rax,1)
add    %r12d,%r15d
cmp    %esi,%r15d
jae    11b0 <check_buf+0xb0>
lea    0x100(%r15),%ecx
mov    %esi,%r12d
sub    %r15d,%r12d
cmp    %esi,%ecx
cmovb  %r14d,%r12d
test   %r12d,%r12d
jle    11d0 <check_buf+0xd0>
movslq %r15d,%r9
mov    %r12d,%r10d
cmp    $0x20,%r12d
jae    1210 <check_buf+0x110>
xor    %edx,%edx
jmp    1315 <check_buf+0x215>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %r10d,%edx
and    $0xffffffe0,%edx
lea    -0x20(%rdx),%rcx
mov    %rcx,%rbp
shr    $0x5,%rbp
add    $0x1,%rbp
mov    %ebp,%r8d
and    $0x3,%r8d
cmp    $0x60,%rcx
jae    1241 <check_buf+0x141>
xor    %ecx,%ecx
movdqa 0xdc4(%rip),%xmm6
jmp    12dd <check_buf+0x1dd>
and    $0xfffffffffffffffc,%rbp
mov    -0x10(%rsp),%rcx
lea    (%rcx,%r9,1),%rbx
xor    %ecx,%ecx
movdqa 0xda8(%rip),%xmm6
nopl   0x0(%rax,%rax,1)
movdqa %xmm6,%xmm1
paddb  %xmm3,%xmm1
movdqu %xmm6,-0x70(%rbx,%rcx,1)
movdqu %xmm1,-0x60(%rbx,%rcx,1)
movdqa %xmm6,%xmm1
paddb  %xmm7,%xmm1
movdqa %xmm6,%xmm4
paddb  %xmm8,%xmm4
movdqu %xmm1,-0x50(%rbx,%rcx,1)
movdqu %xmm4,-0x40(%rbx,%rcx,1)
movdqa %xmm6,%xmm1
paddb  %xmm11,%xmm1
movdqa %xmm6,%xmm4
paddb  %xmm12,%xmm4
movdqu %xmm1,-0x30(%rbx,%rcx,1)
movdqu %xmm4,-0x20(%rbx,%rcx,1)
movdqa %xmm6,%xmm1
paddb  %xmm13,%xmm1
movdqa %xmm6,%xmm4
paddb  %xmm2,%xmm4
movdqu %xmm1,-0x10(%rbx,%rcx,1)
movdqu %xmm4,(%rbx,%rcx,1)
sub    $0xffffffffffffff80,%rcx
pxor   0xda9(%rip),%xmm6
add    $0xfffffffffffffffc,%rbp
jne    1260 <check_buf+0x160>
test   %r8,%r8
je     1310 <check_buf+0x210>
add    %r9,%rcx
add    -0x8(%rsp),%rcx
shl    $0x5,%r8
xor    %ebx,%ebx
movdqa %xmm6,%xmm1
paddb  %xmm3,%xmm1
movdqu %xmm6,-0x10(%rcx,%rbx,1)
movdqu %xmm1,(%rcx,%rbx,1)
paddb  %xmm7,%xmm6
add    $0x20,%rbx
cmp    %rbx,%r8
jne    12f0 <check_buf+0x1f0>
cmp    %r10,%rdx
je     132c <check_buf+0x22c>
lea    (%rdi,%r9,1),%rcx
nopl   0x0(%rax)
mov    %dl,(%rcx,%rdx,1)
add    $0x1,%rdx
cmp    %r10,%rdx
jb     1320 <check_buf+0x220>
test   %r12d,%r12d
jle    11d0 <check_buf+0xd0>
cmp    $0x8,%r12d
jae    1342 <check_buf+0x242>
xor    %ebp,%ebp
jmp    1510 <check_buf+0x410>
mov    %r10d,%ebp
and    $0xfffffff8,%ebp
movd   %eax,%xmm8
lea    -0x8(%rbp),%rax
mov    %rax,%r13
shr    $0x3,%r13
add    $0x1,%r13
test   %rax,%rax
je     1539 <check_buf+0x439>
mov    %r13,%rax
and    $0xfffffffffffffffe,%rax
mov    -0x18(%rsp),%rcx
lea    (%rcx,%r9,1),%r8
movdqa %xmm9,%xmm11
pxor   %xmm9,%xmm9
xor    %edx,%edx
movdqa %xmm10,%xmm13
movdqa 0xd01(%rip),%xmm10
nop
movdqa %xmm10,%xmm1
paddb  %xmm5,%xmm1
movd   -0xc(%r8,%rdx,1),%xmm12
movd   -0x8(%r8,%rdx,1),%xmm6
pcmpeqb %xmm1,%xmm6
pcmpeqb %xmm10,%xmm12
pxor   %xmm14,%xmm12
punpcklbw %xmm12,%xmm12
punpcklwd %xmm12,%xmm12
pand   %xmm15,%xmm12
paddd  %xmm8,%xmm12
pxor   %xmm14,%xmm6
punpcklbw %xmm6,%xmm6
punpcklwd %xmm6,%xmm6
pand   %xmm15,%xmm6
paddd  %xmm9,%xmm6
movdqa %xmm10,%xmm1
paddb  %xmm11,%xmm1
movdqa %xmm10,%xmm4
paddb  %xmm13,%xmm4
movd   -0x4(%r8,%rdx,1),%xmm8
pcmpeqb %xmm1,%xmm8
movd   (%r8,%rdx,1),%xmm9
pcmpeqb %xmm4,%xmm9
pxor   %xmm14,%xmm8
punpcklbw %xmm8,%xmm8
punpcklwd %xmm8,%xmm8
pand   %xmm15,%xmm8
paddd  %xmm12,%xmm8
pxor   %xmm14,%xmm9
punpcklbw %xmm9,%xmm9
punpcklwd %xmm9,%xmm9
pand   %xmm15,%xmm9
paddd  %xmm6,%xmm9
add    $0x10,%rdx
paddb  %xmm0,%xmm10
add    $0xfffffffffffffffe,%rax
jne    1390 <check_buf+0x290>
test   $0x1,%r13b
je     14a4 <check_buf+0x3a4>
movdqa %xmm10,%xmm1
paddb  %xmm5,%xmm1
add    %r9,%rdx
movd   (%rdi,%rdx,1),%xmm4
movd   0x4(%rdi,%rdx,1),%xmm6
pcmpeqb %xmm1,%xmm6
pcmpeqb %xmm10,%xmm4
pxor   %xmm14,%xmm4
punpcklbw %xmm4,%xmm4
punpcklwd %xmm4,%xmm4
pand   %xmm15,%xmm4
paddd  %xmm4,%xmm8
pxor   %xmm14,%xmm6
punpcklbw %xmm6,%xmm6
punpcklwd %xmm6,%xmm6
pand   %xmm15,%xmm6
paddd  %xmm6,%xmm9
paddd  %xmm9,%xmm8
pshufd $0xee,%xmm8,%xmm1
paddd  %xmm8,%xmm1
pshufd $0x55,%xmm1,%xmm4
paddd  %xmm1,%xmm4
movd   %xmm4,%eax
cmp    %r10,%rbp
movdqa %xmm11,%xmm9
movdqa %xmm13,%xmm10
movdqa 0xb59(%rip),%xmm8
movdqa 0xb60(%rip),%xmm11
movdqa 0xb28(%rip),%xmm3
movdqa 0xb30(%rip),%xmm7
movdqa 0xb57(%rip),%xmm12
movdqa 0xb5e(%rip),%xmm13
movdqa 0xb66(%rip),%xmm2
je     11d0 <check_buf+0xd0>
add    %rdi,%r9
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xor    %ecx,%ecx
cmp    (%r9,%rbp,1),%bpl
setne  %cl
add    %ecx,%eax
add    $0x1,%rbp
cmp    %r10,%rbp
jb     1520 <check_buf+0x420>
jmp    11d0 <check_buf+0xd0>
movdqa %xmm9,%xmm11
pxor   %xmm9,%xmm9
xor    %edx,%edx
movdqa %xmm10,%xmm13
movdqa 0xb3d(%rip),%xmm10
test   $0x1,%r13b
jne    1456 <check_buf+0x356>
jmp    14a4 <check_buf+0x3a4>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @check_buf(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %3
store i32 %1, i32* %4
store i32 256, i32* %5
store i32 10, i32* %6
store i32 0, i32* %9
br label %10
10: ; preds = %77, %2
%11 = load i32, i32* %6
%12 = add nsw i32 %11, -1
store i32 %12, i32* %6
%13 = icmp sgt i32 %12, 0
br i1 %13, label %14, label %78
14: ; preds = %10
store i32 0, i32* %7
br label %15
15: ; preds = %73, %14
%16 = load i32, i32* %7
%17 = load i32, i32* %4
%18 = icmp ult i32 %16, %17
br i1 %18, label %19, label %77
19: ; preds = %15
%20 = load i32, i32* %7
%21 = add nsw i32 %20, 256
%22 = load i32, i32* %4
%23 = icmp ult i32 %21, %22
br i1 %23, label %24, label %25
24: ; preds = %19
br label %29
25: ; preds = %19
%26 = load i32, i32* %4
%27 = load i32, i32* %7
%28 = sub i32 %26, %27
br label %29
29: ; preds = %25, %24
%30 = phi i32 [ 256, %24 ], [ %28, %25 ]
store i32 %30, i32* %5
store i32 0, i32* %8
br label %31
31: ; preds = %45, %29
%32 = load i32, i32* %8
%33 = load i32, i32* %5
%34 = icmp slt i32 %32, %33
br i1 %34, label %35, label %48
35: ; preds = %31
%36 = load i32, i32* %8
%37 = and i32 %36, 255
%38 = trunc i32 %37 to i8
%39 = load i8*, i8** %3
%40 = load i32, i32* %7
%41 = load i32, i32* %8
%42 = add nsw i32 %40, %41
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i8, i8* %39, i64 %43
store i8 %38, i8* %44
br label %45
45: ; preds = %35
%46 = load i32, i32* %8
%47 = add nsw i32 %46, 1
store i32 %47, i32* %8
br label %31
48: ; preds = %31
store i32 0, i32* %8
br label %49
49: ; preds = %69, %48
%50 = load i32, i32* %8
%51 = load i32, i32* %5
%52 = icmp slt i32 %50, %51
br i1 %52, label %53, label %72
53: ; preds = %49
%54 = load i8*, i8** %3
%55 = load i32, i32* %7
%56 = load i32, i32* %8
%57 = add nsw i32 %55, %56
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8, i8* %54, i64 %58
%60 = load i8, i8* %59
%61 = zext i8 %60 to i32
%62 = load i32, i32* %8
%63 = and i32 %62, 255
%64 = icmp ne i32 %61, %63
br i1 %64, label %65, label %68
65: ; preds = %53
%66 = load i32, i32* %9
%67 = add nsw i32 %66, 1
store i32 %67, i32* %9
br label %68
68: ; preds = %65, %53
br label %69
69: ; preds = %68
%70 = load i32, i32* %8
%71 = add nsw i32 %70, 1
store i32 %71, i32* %8
br label %49
72: ; preds = %49
br label %73
73: ; preds = %72
%74 = load i32, i32* %7
%75 = load i32, i32* %5
%76 = add nsw i32 %74, %75
store i32 %76, i32* %7
br label %15
77: ; preds = %15
br label %10
78: ; preds = %10
%79 = load i32, i32* %9
ret i32 %79
}

LLVM IR (-O2):
define i32 @check_buf(i8* nocapture %0, i32 %1) {
%3 = icmp eq i32 %1, 0
br label %8
4: ; preds = %198, %8
%5 = phi i32 [ %10, %8 ], [ %199, %198 ]
%6 = add nsw i32 %9, -1
%7 = icmp ugt i32 %9, 1
br i1 %7, label %8, label %202
8: ; preds = %2, %4
%9 = phi i32 [ 9, %2 ], [ %6, %4 ]
%10 = phi i32 [ 0, %2 ], [ %5, %4 ]
br i1 %3, label %4, label %11
11: ; preds = %8, %198
%12 = phi i32 [ %199, %198 ], [ %10, %8 ]
%13 = phi i32 [ %200, %198 ], [ 0, %8 ]
%14 = add nsw i32 %13, 256
%15 = icmp ult i32 %14, %1
%16 = sub i32 %1, %13
%17 = select i1 %15, i32 256, i32 %16
%18 = icmp sgt i32 %17, 0
br i1 %18, label %19, label %198
19: ; preds = %11
%20 = sext i32 %13 to i64
%21 = zext i32 %17 to i64
%22 = icmp ult i32 %17, 32
br i1 %22, label %90, label %23
23: ; preds = %19
%24 = and i64 %21, 4294967264
%25 = add nsw i64 %24, -32
%26 = lshr exact i64 %25, 5
%27 = add nuw nsw i64 %26, 1
%28 = and i64 %27, 3
%29 = icmp ult i64 %25, 96
br i1 %29, label %70, label %30
30: ; preds = %23
%31 = and i64 %27, 1152921504606846972
br label %32
32: ; preds = %32, %30
%33 = phi i64 [ 0, %30 ], [ %66, %32 ]
%34 = phi <16 x i8> [ <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, %30 ], [ %67, %32 ]
%35 = phi i64 [ 0, %30 ], [ %68, %32 ]
%36 = add <16 x i8> %34, <i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16>
%37 = add nsw i64 %33, %20
%38 = getelementptr inbounds i8, i8* %0, i64 %37
%39 = bitcast i8* %38 to <16 x i8>*
store <16 x i8> %34, <16 x i8>* %39
%40 = getelementptr inbounds i8, i8* %38, i64 16
%41 = bitcast i8* %40 to <16 x i8>*
store <16 x i8> %36, <16 x i8>* %41
%42 = or i64 %33, 32
%43 = add <16 x i8> %34, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%44 = add <16 x i8> %34, <i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48>
%45 = add nsw i64 %42, %20
%46 = getelementptr inbounds i8, i8* %0, i64 %45
%47 = bitcast i8* %46 to <16 x i8>*
store <16 x i8> %43, <16 x i8>* %47
%48 = getelementptr inbounds i8, i8* %46, i64 16
%49 = bitcast i8* %48 to <16 x i8>*
store <16 x i8> %44, <16 x i8>* %49
%50 = or i64 %33, 64
%51 = add <16 x i8> %34, <i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64>
%52 = add <16 x i8> %34, <i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80>
%53 = add nsw i64 %50, %20
%54 = getelementptr inbounds i8, i8* %0, i64 %53
%55 = bitcast i8* %54 to <16 x i8>*
store <16 x i8> %51, <16 x i8>* %55
%56 = getelementptr inbounds i8, i8* %54, i64 16
%57 = bitcast i8* %56 to <16 x i8>*
store <16 x i8> %52, <16 x i8>* %57
%58 = or i64 %33, 96
%59 = add <16 x i8> %34, <i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96>
%60 = add <16 x i8> %34, <i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112>
%61 = add nsw i64 %58, %20
%62 = getelementptr inbounds i8, i8* %0, i64 %61
%63 = bitcast i8* %62 to <16 x i8>*
store <16 x i8> %59, <16 x i8>* %63
%64 = getelementptr inbounds i8, i8* %62, i64 16
%65 = bitcast i8* %64 to <16 x i8>*
store <16 x i8> %60, <16 x i8>* %65
%66 = add nuw i64 %33, 128
%67 = xor <16 x i8> %34, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
%68 = add i64 %35, 4
%69 = icmp eq i64 %68, %31
br i1 %69, label %70, label %32
70: ; preds = %32, %23
%71 = phi i64 [ 0, %23 ], [ %66, %32 ]
%72 = phi <16 x i8> [ <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, %23 ], [ %67, %32 ]
%73 = icmp eq i64 %28, 0
br i1 %73, label %88, label %74
74: ; preds = %70, %74
%75 = phi i64 [ %84, %74 ], [ %71, %70 ]
%76 = phi <16 x i8> [ %85, %74 ], [ %72, %70 ]
%77 = phi i64 [ %86, %74 ], [ 0, %70 ]
%78 = add <16 x i8> %76, <i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16>
%79 = add nsw i64 %75, %20
%80 = getelementptr inbounds i8, i8* %0, i64 %79
%81 = bitcast i8* %80 to <16 x i8>*
store <16 x i8> %76, <16 x i8>* %81
%82 = getelementptr inbounds i8, i8* %80, i64 16
%83 = bitcast i8* %82 to <16 x i8>*
store <16 x i8> %78, <16 x i8>* %83
%84 = add nuw i64 %75, 32
%85 = add <16 x i8> %76, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%86 = add i64 %77, 1
%87 = icmp eq i64 %86, %28
br i1 %87, label %88, label %74
88: ; preds = %74, %70
%89 = icmp eq i64 %24, %21
br i1 %89, label %92, label %90
90: ; preds = %19, %88
%91 = phi i64 [ 0, %19 ], [ %24, %88 ]
br label %179
92: ; preds = %179, %88
br i1 %18, label %93, label %198
93: ; preds = %92
%94 = sext i32 %13 to i64
%95 = zext i32 %17 to i64
%96 = icmp ult i32 %17, 8
br i1 %96, label %176, label %97
97: ; preds = %93
%98 = and i64 %21, 4294967288
%99 = insertelement <4 x i32> <i32 poison, i32 0, i32 0, i32 0>, i32 %12, i64 0
%100 = add nsw i64 %98, -8
%101 = lshr exact i64 %100, 3
%102 = add nuw nsw i64 %101, 1
%103 = and i64 %102, 1
%104 = icmp eq i64 %100, 0
br i1 %104, label %147, label %105
105: ; preds = %97
%106 = and i64 %102, 4611686018427387902
br label %107
107: ; preds = %107, %105
%108 = phi i64 [ 0, %105 ], [ %143, %107 ]
%109 = phi <4 x i32> [ %99, %105 ], [ %141, %107 ]
%110 = phi <4 x i32> [ zeroinitializer, %105 ], [ %142, %107 ]
%111 = phi <4 x i8> [ <i8 0, i8 1, i8 2, i8 3>, %105 ], [ %144, %107 ]
%112 = phi i64 [ 0, %105 ], [ %145, %107 ]
%113 = add <4 x i8> %111, <i8 4, i8 4, i8 4, i8 4>
%114 = add nsw i64 %108, %94
%115 = getelementptr inbounds i8, i8* %0, i64 %114
%116 = bitcast i8* %115 to <4 x i8>*
%117 = load <4 x i8>, <4 x i8>* %116
%118 = getelementptr inbounds i8, i8* %115, i64 4
%119 = bitcast i8* %118 to <4 x i8>*
%120 = load <4 x i8>, <4 x i8>* %119
%121 = icmp ne <4 x i8> %117, %111
%122 = icmp ne <4 x i8> %120, %113
%123 = zext <4 x i1> %121 to <4 x i32>
%124 = zext <4 x i1> %122 to <4 x i32>
%125 = add <4 x i32> %109, %123
%126 = add <4 x i32> %110, %124
%127 = or i64 %108, 8
%128 = add <4 x i8> %111, <i8 8, i8 8, i8 8, i8 8>
%129 = add <4 x i8> %111, <i8 12, i8 12, i8 12, i8 12>
%130 = add nsw i64 %127, %94
%131 = getelementptr inbounds i8, i8* %0, i64 %130
%132 = bitcast i8* %131 to <4 x i8>*
%133 = load <4 x i8>, <4 x i8>* %132
%134 = getelementptr inbounds i8, i8* %131, i64 4
%135 = bitcast i8* %134 to <4 x i8>*
%136 = load <4 x i8>, <4 x i8>* %135
%137 = icmp ne <4 x i8> %133, %128
%138 = icmp ne <4 x i8> %136, %129
%139 = zext <4 x i1> %137 to <4 x i32>
%140 = zext <4 x i1> %138 to <4 x i32>
%141 = add <4 x i32> %125, %139
%142 = add <4 x i32> %126, %140
%143 = add nuw i64 %108, 16
%144 = add <4 x i8> %111, <i8 16, i8 16, i8 16, i8 16>
%145 = add i64 %112, 2
%146 = icmp eq i64 %145, %106
br i1 %146, label %147, label %107
147: ; preds = %107, %97
%148 = phi <4 x i32> [ undef, %97 ], [ %141, %107 ]
%149 = phi <4 x i32> [ undef, %97 ], [ %142, %107 ]
%150 = phi i64 [ 0, %97 ], [ %143, %107 ]
%151 = phi <4 x i32> [ %99, %97 ], [ %141, %107 ]
%152 = phi <4 x i32> [ zeroinitializer, %97 ], [ %142, %107 ]
%153 = phi <4 x i8> [ <i8 0, i8 1, i8 2, i8 3>, %97 ], [ %144, %107 ]
%154 = icmp eq i64 %103, 0
br i1 %154, label %170, label %155
155: ; preds = %147
%156 = add <4 x i8> %153, <i8 4, i8 4, i8 4, i8 4>
%157 = add nsw i64 %150, %94
%158 = getelementptr inbounds i8, i8* %0, i64 %157
%159 = bitcast i8* %158 to <4 x i8>*
%160 = load <4 x i8>, <4 x i8>* %159
%161 = getelementptr inbounds i8, i8* %158, i64 4
%162 = bitcast i8* %161 to <4 x i8>*
%163 = load <4 x i8>, <4 x i8>* %162
%164 = icmp ne <4 x i8> %160, %153
%165 = icmp ne <4 x i8> %163, %156
%166 = zext <4 x i1> %164 to <4 x i32>
%167 = zext <4 x i1> %165 to <4 x i32>
%168 = add <4 x i32> %151, %166
%169 = add <4 x i32> %152, %167
br label %170
170: ; preds = %147, %155
%171 = phi <4 x i32> [ %148, %147 ], [ %168, %155 ]
%172 = phi <4 x i32> [ %149, %147 ], [ %169, %155 ]
%173 = add <4 x i32> %172, %171
%174 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %173)
%175 = icmp eq i64 %98, %21
br i1 %175, label %198, label %176
176: ; preds = %93, %170
%177 = phi i64 [ 0, %93 ], [ %98, %170 ]
%178 = phi i32 [ %12, %93 ], [ %174, %170 ]
br label %186
179: ; preds = %90, %179
%180 = phi i64 [ %184, %179 ], [ %91, %90 ]
%181 = trunc i64 %180 to i8
%182 = add nsw i64 %180, %20
%183 = getelementptr inbounds i8, i8* %0, i64 %182
store i8 %181, i8* %183
%184 = add nuw nsw i64 %180, 1
%185 = icmp ult i64 %184, %21
br i1 %185, label %179, label %92
186: ; preds = %176, %186
%187 = phi i64 [ %196, %186 ], [ %177, %176 ]
%188 = phi i32 [ %195, %186 ], [ %178, %176 ]
%189 = add nsw i64 %187, %94
%190 = getelementptr inbounds i8, i8* %0, i64 %189
%191 = load i8, i8* %190
%192 = trunc i64 %187 to i8
%193 = icmp ne i8 %191, %192
%194 = zext i1 %193 to i32
%195 = add nsw i32 %188, %194
%196 = add nuw nsw i64 %187, 1
%197 = icmp ult i64 %196, %95
br i1 %197, label %186, label %198
198: ; preds = %186, %170, %11, %92
%199 = phi i32 [ %12, %92 ], [ %12, %11 ], [ %174, %170 ], [ %195, %186 ]
%200 = add nsw i32 %17, %13
%201 = icmp ult i32 %200, %1
br i1 %201, label %11, label %4
202: ; preds = %4
ret i32 %5
}