void analyse_row(float *data, int N, int M, int *row, int *nN) {
  int i, j;
  for (i = 0; i < N; i++)
    row[i] = 1;
  for (i = 0; i < N; i++) {
    for (j = 1; j < M; j++) {
      row[i] = row[i] && (data[i * M + j] == data[i * M]);
    }
  }
  *nN = 0;
  for (i = 0; i < N; i++) {
    if (row[i] == 1) {
      (*nN)++;
    }
  }
}


x86 assembly (clang, -O0):
<analyse_row>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1146 <analyse_row+0x46>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movl   $0x1,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    111d <analyse_row+0x1d>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11ea <analyse_row+0xea>
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    11d7 <analyse_row+0xd7>
mov    -0x18(%rbp),%rcx
movslq -0x24(%rbp),%rdx
xor    %eax,%eax
cmpl   $0x0,(%rcx,%rdx,4)
mov    %al,-0x29(%rbp)
je     11b6 <analyse_row+0xb6>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x28(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x10(%rbp),%ecx
movslq %ecx,%rcx
ucomiss (%rax,%rcx,4),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
and    $0x1,%al
movzbl %al,%edx
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1160 <analyse_row+0x60>
jmp    11dc <analyse_row+0xdc>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    114d <analyse_row+0x4d>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1237 <analyse_row+0x137>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    1224 <analyse_row+0x124>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    1229 <analyse_row+0x129>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11fb <analyse_row+0xfb>
pop    %rbp
ret

x86 assembly (clang, -O2):
<analyse_row>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %esi,%esi
jle    1301 <analyse_row+0x201>
mov    %esi,%r11d
cmp    $0x8,%esi
jae    1121 <analyse_row+0x21>
xor    %eax,%eax
jmp    1210 <analyse_row+0x110>
mov    %r11d,%eax
and    $0xfffffff8,%eax
lea    -0x8(%rax),%rbx
mov    %rbx,%r10
shr    $0x3,%r10
add    $0x1,%r10
mov    %r10d,%r9d
and    $0x7,%r9d
cmp    $0x38,%rbx
jae    114a <analyse_row+0x4a>
xor    %ebx,%ebx
jmp    11d1 <analyse_row+0xd1>
and    $0xfffffffffffffff8,%r10
xor    %ebx,%ebx
movaps 0xea9(%rip),%xmm0
nopw   0x0(%rax,%rax,1)
movups %xmm0,(%rcx,%rbx,4)
movups %xmm0,0x10(%rcx,%rbx,4)
movups %xmm0,0x20(%rcx,%rbx,4)
movups %xmm0,0x30(%rcx,%rbx,4)
movups %xmm0,0x40(%rcx,%rbx,4)
movups %xmm0,0x50(%rcx,%rbx,4)
movups %xmm0,0x60(%rcx,%rbx,4)
movups %xmm0,0x70(%rcx,%rbx,4)
movups %xmm0,0x80(%rcx,%rbx,4)
movups %xmm0,0x90(%rcx,%rbx,4)
movups %xmm0,0xa0(%rcx,%rbx,4)
movups %xmm0,0xb0(%rcx,%rbx,4)
movups %xmm0,0xc0(%rcx,%rbx,4)
movups %xmm0,0xd0(%rcx,%rbx,4)
movups %xmm0,0xe0(%rcx,%rbx,4)
movups %xmm0,0xf0(%rcx,%rbx,4)
add    $0x40,%rbx
add    $0xfffffffffffffff8,%r10
jne    1160 <analyse_row+0x60>
test   %r9,%r9
je     1203 <analyse_row+0x103>
lea    (%rcx,%rbx,4),%rbp
add    $0x10,%rbp
shl    $0x5,%r9
xor    %ebx,%ebx
movaps 0xe15(%rip),%xmm0
nopl   0x0(%rax,%rax,1)
movups %xmm0,-0x10(%rbp,%rbx,1)
movups %xmm0,0x0(%rbp,%rbx,1)
add    $0x20,%rbx
cmp    %rbx,%r9
jne    11f0 <analyse_row+0xf0>
cmp    %r11,%rax
je     1220 <analyse_row+0x120>
nopl   0x0(%rax,%rax,1)
movl   $0x1,(%rcx,%rax,4)
add    $0x1,%rax
cmp    %rax,%r11
jne    1210 <analyse_row+0x110>
test   %esi,%esi
jle    1301 <analyse_row+0x201>
mov    %esi,-0x4(%rsp)
movslq %edx,%rsi
mov    %esi,%r10d
add    $0xffffffffffffffff,%r10
lea    0x4(%rdi),%r13
lea    0x0(,%rsi,4),%r14
mov    %r10,%r15
and    $0xfffffffffffffffe,%r15
neg    %r15
xor    %r12d,%r12d
jmp    127d <analyse_row+0x17d>
add    %rbx,%rax
movss  (%rdi,%rbx,4),%xmm0
cmpeqss (%rdi,%rax,4),%xmm0
movd   %xmm0,%eax
and    $0x1,%eax
movzbl %al,%ebp
mov    %ebp,(%rcx,%r12,4)
add    $0x1,%r12
add    %r14,%r13
cmp    %r11,%r12
je     130a <analyse_row+0x20a>
cmp    $0x2,%edx
jl     126d <analyse_row+0x16d>
mov    %r12,%rbx
imul   %rsi,%rbx
mov    (%rcx,%r12,4),%ebp
mov    $0x1,%eax
cmp    $0x2,%edx
jne    12b0 <analyse_row+0x1b0>
test   $0x1,%r10b
je     1269 <analyse_row+0x169>
test   %ebp,%ebp
jne    1251 <analyse_row+0x151>
xor    %eax,%eax
jmp    1266 <analyse_row+0x166>
cs nopw 0x0(%rax,%rax,1)
nop
mov    $0x1,%eax
jmp    12d8 <analyse_row+0x1d8>
nopw   0x0(%rax,%rax,1)
xor    %ebp,%ebp
movzbl %bpl,%ebp
lea    (%r15,%rax,1),%r9
add    $0x2,%r9
add    $0x2,%rax
cmp    $0x1,%r9
je     1297 <analyse_row+0x197>
test   %ebp,%ebp
je     12c0 <analyse_row+0x1c0>
movss  -0x4(%r13,%rax,4),%xmm0
ucomiss (%rdi,%rbx,4),%xmm0
jne    12c0 <analyse_row+0x1c0>
jp     12c0 <analyse_row+0x1c0>
movss  (%rdi,%rbx,4),%xmm0
cmpeqss 0x0(%r13,%rax,4),%xmm0
movd   %xmm0,%ebp
and    $0x1,%ebp
jmp    12c2 <analyse_row+0x1c2>
movl   $0x0,(%r8)
jmp    1334 <analyse_row+0x234>
movl   $0x0,(%r8)
mov    -0x4(%rsp),%eax
test   %eax,%eax
jle    1334 <analyse_row+0x234>
cmp    $0x1,%eax
jne    133f <analyse_row+0x23f>
xor    %eax,%eax
xor    %edx,%edx
test   $0x1,%r11b
je     1334 <analyse_row+0x234>
cmpl   $0x1,(%rcx,%rdx,4)
jne    1334 <analyse_row+0x234>
add    $0x1,%eax
mov    %eax,(%r8)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r11d,%esi
and    $0xfffffffe,%esi
xor    %eax,%eax
xor    %edx,%edx
jmp    1359 <analyse_row+0x259>
nopl   0x0(%rax,%rax,1)
add    $0x2,%rdx
cmp    %rdx,%rsi
je     1322 <analyse_row+0x222>
cmpl   $0x1,(%rcx,%rdx,4)
jne    1365 <analyse_row+0x265>
add    $0x1,%eax
mov    %eax,(%r8)
cmpl   $0x1,0x4(%rcx,%rdx,4)
jne    1350 <analyse_row+0x250>
add    $0x1,%eax
mov    %eax,(%r8)
jmp    1350 <analyse_row+0x250>

LLVM IR (-O0):
define void @analyse_row(float* %0, i32 %1, i32 %2, i32* %3, i32* %4) {
%6 = alloca float*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32
%12 = alloca i32
store float* %0, float** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32* %3, i32** %9
store i32* %4, i32** %10
store i32 0, i32* %11
br label %13
13: ; preds = %22, %5
%14 = load i32, i32* %11
%15 = load i32, i32* %7
%16 = icmp slt i32 %14, %15
br i1 %16, label %17, label %25
17: ; preds = %13
%18 = load i32*, i32** %9
%19 = load i32, i32* %11
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i32, i32* %18, i64 %20
store i32 1, i32* %21
br label %22
22: ; preds = %17
%23 = load i32, i32* %11
%24 = add nsw i32 %23, 1
store i32 %24, i32* %11
br label %13
25: ; preds = %13
store i32 0, i32* %11
br label %26
26: ; preds = %71, %25
%27 = load i32, i32* %11
%28 = load i32, i32* %7
%29 = icmp slt i32 %27, %28
br i1 %29, label %30, label %74
30: ; preds = %26
store i32 1, i32* %12
br label %31
31: ; preds = %67, %30
%32 = load i32, i32* %12
%33 = load i32, i32* %8
%34 = icmp slt i32 %32, %33
br i1 %34, label %35, label %70
35: ; preds = %31
%36 = load i32*, i32** %9
%37 = load i32, i32* %11
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i32, i32* %36, i64 %38
%40 = load i32, i32* %39
%41 = icmp ne i32 %40, 0
br i1 %41, label %42, label %60
42: ; preds = %35
%43 = load float*, float** %6
%44 = load i32, i32* %11
%45 = load i32, i32* %8
%46 = mul nsw i32 %44, %45
%47 = load i32, i32* %12
%48 = add nsw i32 %46, %47
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds float, float* %43, i64 %49
%51 = load float, float* %50
%52 = load float*, float** %6
%53 = load i32, i32* %11
%54 = load i32, i32* %8
%55 = mul nsw i32 %53, %54
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds float, float* %52, i64 %56
%58 = load float, float* %57
%59 = fcmp oeq float %51, %58
br label %60
60: ; preds = %42, %35
%61 = phi i1 [ false, %35 ], [ %59, %42 ]
%62 = zext i1 %61 to i32
%63 = load i32*, i32** %9
%64 = load i32, i32* %11
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i32, i32* %63, i64 %65
store i32 %62, i32* %66
br label %67
67: ; preds = %60
%68 = load i32, i32* %12
%69 = add nsw i32 %68, 1
store i32 %69, i32* %12
br label %31
70: ; preds = %31
br label %71
71: ; preds = %70
%72 = load i32, i32* %11
%73 = add nsw i32 %72, 1
store i32 %73, i32* %11
br label %26
74: ; preds = %26
%75 = load i32*, i32** %10
store i32 0, i32* %75
store i32 0, i32* %11
br label %76
76: ; preds = %92, %74
%77 = load i32, i32* %11
%78 = load i32, i32* %7
%79 = icmp slt i32 %77, %78
br i1 %79, label %80, label %95
80: ; preds = %76
%81 = load i32*, i32** %9
%82 = load i32, i32* %11
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds i32, i32* %81, i64 %83
%85 = load i32, i32* %84
%86 = icmp eq i32 %85, 1
br i1 %86, label %87, label %91
87: ; preds = %80
%88 = load i32*, i32** %10
%89 = load i32, i32* %88
%90 = add nsw i32 %89, 1
store i32 %90, i32* %88
br label %91
91: ; preds = %87, %80
br label %92
92: ; preds = %91
%93 = load i32, i32* %11
%94 = add nsw i32 %93, 1
store i32 %94, i32* %11
br label %76
95: ; preds = %76
ret void
}

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