int uniquePathsWithObstacles(int **obstacleGrid, int obstacleGridRowSize,
                             int obstacleGridColSize) {
  int row, col;
  int reset = 0;
  for (row = 0; row < obstacleGridRowSize; row++) {
    if (reset) {
      obstacleGrid[row][0] = 1;
    } else {
      if (obstacleGrid[row][0] == 1) {
        reset = 1;
      }
    }
  }
  reset = 0;
  for (col = 0; col < obstacleGridColSize; col++) {
    if (reset) {
      obstacleGrid[0][col] = 1;
    } else {
      if (obstacleGrid[0][col] == 1) {
        reset = 1;
      }
    }
  }
  for (row = 0; row < obstacleGridRowSize; row++) {
    int *line = obstacleGrid[row];
    for (col = 0; col < obstacleGridColSize; col++) {
      line[col] ^= 1;
    }
  }
  for (row = 1; row < obstacleGridRowSize; row++) {
    int *last_line = obstacleGrid[row - 1];
    int *line = obstacleGrid[row];
    for (col = 1; col < obstacleGridColSize; col++) {
      if (line[col] != 0) {
        line[col] = line[col - 1] + last_line[col];
      }
    }
  }
  return obstacleGrid[obstacleGridRowSize - 1][obstacleGridColSize - 1];
}


x86 assembly (clang, -O0):
<uniquePathsWithObstacles>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    117d <uniquePathsWithObstacles+0x7d>
cmpl   $0x0,-0x1c(%rbp)
je     1149 <uniquePathsWithObstacles+0x49>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movl   $0x1,(%rax)
jmp    116a <uniquePathsWithObstacles+0x6a>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmpl   $0x1,(%rax)
jne    1165 <uniquePathsWithObstacles+0x65>
movl   $0x1,-0x1c(%rbp)
jmp    116a <uniquePathsWithObstacles+0x6a>
jmp    116f <uniquePathsWithObstacles+0x6f>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111c <uniquePathsWithObstacles+0x1c>
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    11ec <uniquePathsWithObstacles+0xec>
cmpl   $0x0,-0x1c(%rbp)
je     11b8 <uniquePathsWithObstacles+0xb8>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movslq -0x18(%rbp),%rcx
movl   $0x1,(%rax,%rcx,4)
jmp    11d9 <uniquePathsWithObstacles+0xd9>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movslq -0x18(%rbp),%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    11d4 <uniquePathsWithObstacles+0xd4>
movl   $0x1,-0x1c(%rbp)
jmp    11d9 <uniquePathsWithObstacles+0xd9>
jmp    11de <uniquePathsWithObstacles+0xde>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    118b <uniquePathsWithObstacles+0x8b>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1254 <uniquePathsWithObstacles+0x154>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1241 <uniquePathsWithObstacles+0x141>
mov    -0x28(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
xor    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1216 <uniquePathsWithObstacles+0x116>
jmp    1246 <uniquePathsWithObstacles+0x146>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11f3 <uniquePathsWithObstacles+0xf3>
movl   $0x1,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12fd <uniquePathsWithObstacles+0x1fd>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x38(%rbp)
movl   $0x1,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    12ea <uniquePathsWithObstacles+0x1ea>
mov    -0x38(%rbp),%rax
movslq -0x18(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     12d7 <uniquePathsWithObstacles+0x1d7>
mov    -0x38(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x30(%rbp),%rax
movslq -0x18(%rbp),%rcx
add    (%rax,%rcx,4),%edx
mov    -0x38(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    12dc <uniquePathsWithObstacles+0x1dc>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1293 <uniquePathsWithObstacles+0x193>
jmp    12ef <uniquePathsWithObstacles+0x1ef>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    125b <uniquePathsWithObstacles+0x15b>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<uniquePathsWithObstacles>:
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %esi,%r8d
test   %esi,%esi
jle    112f <uniquePathsWithObstacles+0x2f>
cmp    $0x1,%esi
jne    131f <uniquePathsWithObstacles+0x21f>
xor    %eax,%eax
xor    %ebx,%ebx
test   $0x1,%r8b
je     112f <uniquePathsWithObstacles+0x2f>
test   %ebx,%ebx
je     112f <uniquePathsWithObstacles+0x2f>
mov    (%rdi,%rax,8),%rax
movl   $0x1,(%rax)
mov    %edx,%r15d
test   %edx,%edx
jle    1157 <uniquePathsWithObstacles+0x57>
cmp    $0x1,%edx
jne    137e <uniquePathsWithObstacles+0x27e>
xor    %eax,%eax
xor    %ecx,%ecx
test   $0x1,%r15b
je     1157 <uniquePathsWithObstacles+0x57>
test   %ecx,%ecx
je     1157 <uniquePathsWithObstacles+0x57>
mov    (%rdi),%rcx
movl   $0x1,(%rcx,%rax,4)
test   %esi,%esi
jle    1308 <uniquePathsWithObstacles+0x208>
mov    %r15d,%r14d
and    $0xfffffff8,%r14d
lea    -0x8(%r14),%r9
mov    %r9,%r10
shr    $0x3,%r10
add    $0x1,%r10
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
xor    %r12d,%r12d
movaps 0xe7a(%rip),%xmm0
jmp    119d <uniquePathsWithObstacles+0x9d>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r12
cmp    %r8,%r12
je     125c <uniquePathsWithObstacles+0x15c>
test   %edx,%edx
jle    1190 <uniquePathsWithObstacles+0x90>
mov    (%rdi,%r12,8),%rax
cmp    $0x8,%edx
jae    11c0 <uniquePathsWithObstacles+0xc0>
xor    %ecx,%ecx
jmp    1240 <uniquePathsWithObstacles+0x140>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
test   %r9,%r9
je     1252 <uniquePathsWithObstacles+0x152>
mov    %r11,%rbx
xor    %ecx,%ecx
xchg   %ax,%ax
movups (%rax,%rcx,4),%xmm1
movups 0x10(%rax,%rcx,4),%xmm2
movups 0x20(%rax,%rcx,4),%xmm3
movups 0x30(%rax,%rcx,4),%xmm4
xorps  %xmm0,%xmm1
xorps  %xmm0,%xmm2
movups %xmm1,(%rax,%rcx,4)
movups %xmm2,0x10(%rax,%rcx,4)
xorps  %xmm0,%xmm3
xorps  %xmm0,%xmm4
movups %xmm3,0x20(%rax,%rcx,4)
movups %xmm4,0x30(%rax,%rcx,4)
add    $0x10,%rcx
add    $0xfffffffffffffffe,%rbx
jne    11d0 <uniquePathsWithObstacles+0xd0>
test   $0x1,%r10b
je     122a <uniquePathsWithObstacles+0x12a>
movups (%rax,%rcx,4),%xmm1
movups 0x10(%rax,%rcx,4),%xmm2
xorps  %xmm0,%xmm1
xorps  %xmm0,%xmm2
movups %xmm1,(%rax,%rcx,4)
movups %xmm2,0x10(%rax,%rcx,4)
mov    %r14,%rcx
cmp    %r15,%r14
je     1190 <uniquePathsWithObstacles+0x90>
cs nopw 0x0(%rax,%rax,1)
xorb   $0x1,(%rax,%rcx,4)
add    $0x1,%rcx
cmp    %rcx,%r15
jne    1240 <uniquePathsWithObstacles+0x140>
jmp    1190 <uniquePathsWithObstacles+0x90>
xor    %ecx,%ecx
test   $0x1,%r10b
jne    1212 <uniquePathsWithObstacles+0x112>
jmp    122a <uniquePathsWithObstacles+0x12a>
cmp    $0x2,%esi
jl     1308 <uniquePathsWithObstacles+0x208>
mov    (%rdi),%rax
add    $0xffffffffffffffff,%r15
mov    %r15,%r9
and    $0xfffffffffffffffe,%r9
neg    %r9
mov    $0x1,%r10d
jmp    1289 <uniquePathsWithObstacles+0x189>
xchg   %ax,%ax
add    $0x1,%r10
cmp    %r8,%r10
je     1308 <uniquePathsWithObstacles+0x208>
mov    %rax,%r11
mov    (%rdi,%r10,8),%rax
cmp    $0x2,%edx
jl     1280 <uniquePathsWithObstacles+0x180>
mov    $0x1,%ecx
jne    12c0 <uniquePathsWithObstacles+0x1c0>
test   $0x1,%r15b
je     1280 <uniquePathsWithObstacles+0x180>
cmpl   $0x0,(%rax,%rcx,4)
je     1280 <uniquePathsWithObstacles+0x180>
mov    (%r11,%rcx,4),%ebx
add    -0x4(%rax,%rcx,4),%ebx
mov    %ebx,(%rax,%rcx,4)
jmp    1280 <uniquePathsWithObstacles+0x180>
cs nopw 0x0(%rax,%rax,1)
nop
mov    $0x1,%ecx
jmp    12e2 <uniquePathsWithObstacles+0x1e2>
nopw   0x0(%rax,%rax,1)
lea    (%r9,%rcx,1),%rbx
add    $0x2,%rbx
add    $0x2,%rcx
cmp    $0x1,%rbx
je     129c <uniquePathsWithObstacles+0x19c>
cmpl   $0x0,(%rax,%rcx,4)
je     12f3 <uniquePathsWithObstacles+0x1f3>
mov    (%r11,%rcx,4),%ebx
add    -0x4(%rax,%rcx,4),%ebx
mov    %ebx,(%rax,%rcx,4)
cmpl   $0x0,0x4(%rax,%rcx,4)
je     12d0 <uniquePathsWithObstacles+0x1d0>
mov    0x4(%r11,%rcx,4),%ebx
add    (%rax,%rcx,4),%ebx
mov    %ebx,0x4(%rax,%rcx,4)
jmp    12d0 <uniquePathsWithObstacles+0x1d0>
movslq %esi,%rax
mov    -0x8(%rdi,%rax,8),%rax
movslq %edx,%rcx
mov    -0x4(%rax,%rcx,4),%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret
mov    %r8d,%r9d
and    $0xfffffffe,%r9d
xor    %eax,%eax
xor    %ebx,%ebx
jmp    1345 <uniquePathsWithObstacles+0x245>
nopl   0x0(%rax)
xor    %ebx,%ebx
cmpl   $0x1,(%rcx)
sete   %bl
add    $0x2,%rax
cmp    %rax,%r9
je     111b <uniquePathsWithObstacles+0x1b>
mov    (%rdi,%rax,8),%rcx
test   %ebx,%ebx
je     1360 <uniquePathsWithObstacles+0x260>
movl   $0x1,(%rcx)
mov    $0x1,%ebx
jmp    1368 <uniquePathsWithObstacles+0x268>
nopw   0x0(%rax,%rax,1)
xor    %ebx,%ebx
cmpl   $0x1,(%rcx)
sete   %bl
mov    0x8(%rdi,%rax,8),%rcx
test   %ebx,%ebx
je     1330 <uniquePathsWithObstacles+0x230>
movl   $0x1,(%rcx)
mov    $0x1,%ebx
jmp    1338 <uniquePathsWithObstacles+0x238>
mov    %r15d,%r9d
and    $0xfffffffe,%r9d
mov    (%rdi),%rbx
xor    %eax,%eax
xor    %ecx,%ecx
jmp    13a7 <uniquePathsWithObstacles+0x2a7>
xchg   %ax,%ax
xor    %ecx,%ecx
cmpl   $0x1,0x4(%rbx,%rax,4)
sete   %cl
add    $0x2,%rax
cmp    %rax,%r9
je     1143 <uniquePathsWithObstacles+0x43>
test   %ecx,%ecx
je     13c0 <uniquePathsWithObstacles+0x2c0>
movl   $0x1,(%rbx,%rax,4)
mov    $0x1,%ecx
test   %ecx,%ecx
jne    13cd <uniquePathsWithObstacles+0x2cd>
jmp    1390 <uniquePathsWithObstacles+0x290>
nopl   (%rax)
xor    %ecx,%ecx
cmpl   $0x1,(%rbx,%rax,4)
sete   %cl
test   %ecx,%ecx
je     1390 <uniquePathsWithObstacles+0x290>
movl   $0x1,0x4(%rbx,%rax,4)
mov    $0x1,%ecx
jmp    139a <uniquePathsWithObstacles+0x29a>

LLVM IR (-O0):
define i32 @uniquePathsWithObstacles(i32** %0, i32 %1, i32 %2) {
%4 = alloca i32**
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32*
%11 = alloca i32*
%12 = alloca i32*
store i32** %0, i32*** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
store i32 0, i32* %9
store i32 0, i32* %7
br label %13
13: ; preds = %39, %3
%14 = load i32, i32* %7
%15 = load i32, i32* %5
%16 = icmp slt i32 %14, %15
br i1 %16, label %17, label %42
17: ; preds = %13
%18 = load i32, i32* %9
%19 = icmp ne i32 %18, 0
br i1 %19, label %20, label %27
20: ; preds = %17
%21 = load i32**, i32*** %4
%22 = load i32, i32* %7
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds i32*, i32** %21, i64 %23
%25 = load i32*, i32** %24
%26 = getelementptr inbounds i32, i32* %25, i64 0
store i32 1, i32* %26
br label %38
27: ; preds = %17
%28 = load i32**, i32*** %4
%29 = load i32, i32* %7
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i32*, i32** %28, i64 %30
%32 = load i32*, i32** %31
%33 = getelementptr inbounds i32, i32* %32, i64 0
%34 = load i32, i32* %33
%35 = icmp eq i32 %34, 1
br i1 %35, label %36, label %37
36: ; preds = %27
store i32 1, i32* %9
br label %37
37: ; preds = %36, %27
br label %38
38: ; preds = %37, %20
br label %39
39: ; preds = %38
%40 = load i32, i32* %7
%41 = add nsw i32 %40, 1
store i32 %41, i32* %7
br label %13
42: ; preds = %13
store i32 0, i32* %9
store i32 0, i32* %8
br label %43
43: ; preds = %69, %42
%44 = load i32, i32* %8
%45 = load i32, i32* %6
%46 = icmp slt i32 %44, %45
br i1 %46, label %47, label %72
47: ; preds = %43
%48 = load i32, i32* %9
%49 = icmp ne i32 %48, 0
br i1 %49, label %50, label %57
50: ; preds = %47
%51 = load i32**, i32*** %4
%52 = getelementptr inbounds i32*, i32** %51, i64 0
%53 = load i32*, i32** %52
%54 = load i32, i32* %8
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i32, i32* %53, i64 %55
store i32 1, i32* %56
br label %68
57: ; preds = %47
%58 = load i32**, i32*** %4
%59 = getelementptr inbounds i32*, i32** %58, i64 0
%60 = load i32*, i32** %59
%61 = load i32, i32* %8
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i32, i32* %60, i64 %62
%64 = load i32, i32* %63
%65 = icmp eq i32 %64, 1
br i1 %65, label %66, label %67
66: ; preds = %57
store i32 1, i32* %9
br label %67
67: ; preds = %66, %57
br label %68
68: ; preds = %67, %50
br label %69
69: ; preds = %68
%70 = load i32, i32* %8
%71 = add nsw i32 %70, 1
store i32 %71, i32* %8
br label %43
72: ; preds = %43
store i32 0, i32* %7
br label %73
73: ; preds = %98, %72
%74 = load i32, i32* %7
%75 = load i32, i32* %5
%76 = icmp slt i32 %74, %75
br i1 %76, label %77, label %101
77: ; preds = %73
%78 = load i32**, i32*** %4
%79 = load i32, i32* %7
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds i32*, i32** %78, i64 %80
%82 = load i32*, i32** %81
store i32* %82, i32** %10
store i32 0, i32* %8
br label %83
83: ; preds = %94, %77
%84 = load i32, i32* %8
%85 = load i32, i32* %6
%86 = icmp slt i32 %84, %85
br i1 %86, label %87, label %97
87: ; preds = %83
%88 = load i32*, i32** %10
%89 = load i32, i32* %8
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds i32, i32* %88, i64 %90
%92 = load i32, i32* %91
%93 = xor i32 %92, 1
store i32 %93, i32* %91
br label %94
94: ; preds = %87
%95 = load i32, i32* %8
%96 = add nsw i32 %95, 1
store i32 %96, i32* %8
br label %83
97: ; preds = %83
br label %98
98: ; preds = %97
%99 = load i32, i32* %7
%100 = add nsw i32 %99, 1
store i32 %100, i32* %7
br label %73
101: ; preds = %73
store i32 1, i32* %7
br label %102
102: ; preds = %151, %101
%103 = load i32, i32* %7
%104 = load i32, i32* %5
%105 = icmp slt i32 %103, %104
br i1 %105, label %106, label %154
106: ; preds = %102
%107 = load i32**, i32*** %4
%108 = load i32, i32* %7
%109 = sub nsw i32 %108, 1
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i32*, i32** %107, i64 %110
%112 = load i32*, i32** %111
store i32* %112, i32** %11
%113 = load i32**, i32*** %4
%114 = load i32, i32* %7
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds i32*, i32** %113, i64 %115
%117 = load i32*, i32** %116
store i32* %117, i32** %12
store i32 1, i32* %8
br label %118
118: ; preds = %147, %106
%119 = load i32, i32* %8
%120 = load i32, i32* %6
%121 = icmp slt i32 %119, %120
br i1 %121, label %122, label %150
122: ; preds = %118
%123 = load i32*, i32** %12
%124 = load i32, i32* %8
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds i32, i32* %123, i64 %125
%127 = load i32, i32* %126
%128 = icmp ne i32 %127, 0
br i1 %128, label %129, label %146
129: ; preds = %122
%130 = load i32*, i32** %12
%131 = load i32, i32* %8
%132 = sub nsw i32 %131, 1
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds i32, i32* %130, i64 %133
%135 = load i32, i32* %134
%136 = load i32*, i32** %11
%137 = load i32, i32* %8
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds i32, i32* %136, i64 %138
%140 = load i32, i32* %139
%141 = add nsw i32 %135, %140
%142 = load i32*, i32** %12
%143 = load i32, i32* %8
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i32, i32* %142, i64 %144
store i32 %141, i32* %145
br label %146
146: ; preds = %129, %122
br label %147
147: ; preds = %146
%148 = load i32, i32* %8
%149 = add nsw i32 %148, 1
store i32 %149, i32* %8
br label %118
150: ; preds = %118
br label %151
151: ; preds = %150
%152 = load i32, i32* %7
%153 = add nsw i32 %152, 1
store i32 %153, i32* %7
br label %102
154: ; preds = %102
%155 = load i32**, i32*** %4
%156 = load i32, i32* %5
%157 = sub nsw i32 %156, 1
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds i32*, i32** %155, i64 %158
%160 = load i32*, i32** %159
%161 = load i32, i32* %6
%162 = sub nsw i32 %161, 1
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds i32, i32* %160, i64 %163
%165 = load i32, i32* %164
ret i32 %165
}

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