int knapsack(int a[], int K, int m, int **A) {
  int i, j, x, y;
  for (i = 0; i < m; i++) {
    for (j = 0; j < K * m; j++) {
      A[i][j] = 0;
    }
  }
  for (j = 0; j < m; j++) {
    A[0][a[j]] = 0;
  }
  for (i = 0; i < m; i++) {
    A[1][a[i]] = a[i];
  }
  for (i = 1; i <= m; i++) {
    for (j = 0; j <= K; j++) {
      x = A[i - 1][j];
      if (j >= a[i - 1])
        y = A[i - 1][j - a[i - 1]] + a[i - 1];
      else
        y = 0;
      if (x > y && x <= K)
        A[i][j] = x;
      else
        A[i][j] = y;
      if (A[i][j] == K)
        return K;
    }
  }
  return A[m][K];
}


x86 assembly (clang, -O0):
<knapsack>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1176 <knapsack+0x76>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x14(%rbp),%ecx
imul   -0x18(%rbp),%ecx
cmp    %ecx,%eax
jge    1163 <knapsack+0x63>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    112c <knapsack+0x2c>
jmp    1168 <knapsack+0x68>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1119 <knapsack+0x19>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11b1 <knapsack+0xb1>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    -0x10(%rbp),%rcx
movslq -0x28(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movl   $0x0,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    117d <knapsack+0x7d>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11f4 <knapsack+0xf4>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rax
mov    -0x10(%rbp),%rcx
movslq -0x24(%rbp),%rsi
movslq (%rcx,%rsi,4),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11b8 <knapsack+0xb8>
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jg     132d <knapsack+0x22d>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     131a <knapsack+0x21a>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
jl     1290 <knapsack+0x190>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x28(%rbp),%ecx
mov    -0x10(%rbp),%rdx
mov    -0x24(%rbp),%esi
sub    $0x1,%esi
movslq %esi,%rsi
sub    (%rdx,%rsi,4),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x30(%rbp)
jmp    1297 <knapsack+0x197>
movl   $0x0,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    12ca <knapsack+0x1ca>
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     12ca <knapsack+0x1ca>
mov    -0x2c(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    12e0 <knapsack+0x1e0>
mov    -0x30(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x14(%rbp),%eax
jne    1307 <knapsack+0x207>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1343 <knapsack+0x243>
jmp    130c <knapsack+0x20c>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    120e <knapsack+0x10e>
jmp    131f <knapsack+0x21f>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11fb <knapsack+0xfb>
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<knapsack>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rcx,%rbp
mov    %esi,%eax
test   %edx,%edx
jle    13a0 <knapsack+0x290>
mov    %rdi,%r13
mov    %edx,%r15d
mov    %rax,0x20(%rsp)
imul   %eax,%r15d
lea    0x0(,%r15,4),%rbx
mov    %rdx,0x18(%rsp)
mov    %edx,%r12d
lea    -0x1(%r12),%rax
mov    %r12d,%ecx
and    $0x3,%ecx
mov    %rcx,0x8(%rsp)
mov    %rax,(%rsp)
cmp    $0x3,%rax
mov    %r12,0x10(%rsp)
jae    11d2 <knapsack+0xc2>
xor    %r14d,%r14d
mov    %rbp,%r12
cmpq   $0x0,0x8(%rsp)
je     11a0 <knapsack+0x90>
lea    (%r12,%r14,8),%r14
xor    %ebp,%ebp
jmp    118b <knapsack+0x7b>
nop
add    $0x1,%rbp
cmp    %rbp,0x8(%rsp)
je     11a0 <knapsack+0x90>
test   %r15d,%r15d
jle    1180 <knapsack+0x70>
mov    (%r14,%rbp,8),%rdi
xor    %esi,%esi
mov    %rbx,%rdx
call   1030 <memset@plt>
jmp    1180 <knapsack+0x70>
mov    0x18(%rsp),%rdx
test   %edx,%edx
mov    0x20(%rsp),%rax
mov    %r12,%rbp
mov    0x10(%rsp),%r8
jle    13a0 <knapsack+0x290>
mov    0x0(%rbp),%rbp
mov    %r8d,%ecx
and    $0x3,%ecx
cmpq   $0x3,(%rsp)
jae    1230 <knapsack+0x120>
xor    %ebx,%ebx
jmp    127d <knapsack+0x16d>
and    $0xfffffffc,%r12d
xor    %r14d,%r14d
jmp    11ed <knapsack+0xdd>
nopl   0x0(%rax,%rax,1)
add    $0x4,%r14
cmp    %r14,%r12
je     116c <knapsack+0x5c>
test   %r15d,%r15d
jle    11e0 <knapsack+0xd0>
mov    0x0(%rbp,%r14,8),%rdi
xor    %esi,%esi
mov    %rbx,%rdx
call   1030 <memset@plt>
mov    0x8(%rbp,%r14,8),%rdi
xor    %esi,%esi
mov    %rbx,%rdx
call   1030 <memset@plt>
mov    0x10(%rbp,%r14,8),%rdi
xor    %esi,%esi
mov    %rbx,%rdx
call   1030 <memset@plt>
mov    0x18(%rbp,%r14,8),%rdi
xor    %esi,%esi
mov    %rbx,%rdx
call   1030 <memset@plt>
jmp    11e0 <knapsack+0xd0>
mov    %r8d,%esi
and    $0xfffffffc,%esi
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movslq 0x0(%r13,%rbx,4),%rdi
movl   $0x0,0x0(%rbp,%rdi,4)
movslq 0x4(%r13,%rbx,4),%rdi
movl   $0x0,0x0(%rbp,%rdi,4)
movslq 0x8(%r13,%rbx,4),%rdi
movl   $0x0,0x0(%rbp,%rdi,4)
movslq 0xc(%r13,%rbx,4),%rdi
movl   $0x0,0x0(%rbp,%rdi,4)
add    $0x4,%rbx
cmp    %rbx,%rsi
jne    1240 <knapsack+0x130>
test   %rcx,%rcx
je     12a5 <knapsack+0x195>
lea    0x0(,%rbx,4),%rbx
add    %r13,%rbx
xor    %esi,%esi
nop
movslq (%rbx,%rsi,4),%rdi
movl   $0x0,0x0(%rbp,%rdi,4)
add    $0x1,%rsi
cmp    %rsi,%rcx
jne    1290 <knapsack+0x180>
test   %edx,%edx
mov    %r12,%rbp
jle    13a0 <knapsack+0x290>
mov    0x8(%rbp),%rbp
mov    %r8d,%ecx
and    $0x3,%ecx
cmpq   $0x3,(%rsp)
jae    12c5 <knapsack+0x1b5>
xor    %edi,%edi
jmp    12fd <knapsack+0x1ed>
and    $0xfffffffc,%r8d
xor    %edi,%edi
nopl   0x0(%rax,%rax,1)
movslq 0x0(%r13,%rdi,4),%rsi
mov    %esi,0x0(%rbp,%rsi,4)
movslq 0x4(%r13,%rdi,4),%rsi
mov    %esi,0x0(%rbp,%rsi,4)
movslq 0x8(%r13,%rdi,4),%rsi
mov    %esi,0x0(%rbp,%rsi,4)
movslq 0xc(%r13,%rdi,4),%rsi
mov    %esi,0x0(%rbp,%rsi,4)
add    $0x4,%rdi
cmp    %rdi,%r8
jne    12d0 <knapsack+0x1c0>
test   %rcx,%rcx
je     1321 <knapsack+0x211>
lea    0x0(,%rdi,4),%rbx
add    %r13,%rbx
xor    %esi,%esi
nop
movslq (%rbx,%rsi,4),%rdi
mov    %edi,0x0(%rbp,%rdi,4)
add    $0x1,%rsi
cmp    %rsi,%rcx
jne    1310 <knapsack+0x200>
test   %edx,%edx
mov    %r12,%rbp
jle    13a0 <knapsack+0x290>
lea    0x1(%rax),%r9d
lea    0x1(%rdx),%r8d
mov    $0x1,%r11d
jmp    134c <knapsack+0x23c>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r11
cmp    %r8,%r11
mov    %r12,%rbp
je     13a0 <knapsack+0x290>
test   %eax,%eax
js     1340 <knapsack+0x230>
mov    %r12,%rcx
mov    -0x8(%r12,%r11,8),%rdi
mov    (%r12,%r11,8),%r10
xor    %ebp,%ebp
xchg   %ax,%ax
movslq -0x4(%r13,%r11,4),%rcx
xor    %ebx,%ebx
cmp    %rcx,%rbp
jl     137e <knapsack+0x26e>
mov    %rcx,%rbx
shl    $0x2,%rbx
mov    %rdi,%rsi
sub    %rbx,%rsi
mov    (%rsi,%rbp,4),%ebx
add    %ecx,%ebx
mov    (%rdi,%rbp,4),%ecx
cmp    %ebx,%ecx
mov    %ecx,%esi
cmovle %ebx,%esi
cmp    %eax,%ecx
cmovg  %ebx,%esi
mov    %esi,(%r10,%rbp,4)
cmp    %eax,%esi
je     13ae <knapsack+0x29e>
add    $0x1,%rbp
cmp    %rbp,%r9
jne    1360 <knapsack+0x250>
jmp    1340 <knapsack+0x230>
movslq %edx,%rcx
mov    0x0(%rbp,%rcx,8),%rdx
movslq %eax,%rcx
mov    (%rdx,%rcx,4),%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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