void ctof_2d(int nodes_coarse, double **u_coarse, double **u_fine) {
  int row_coarse, row_fine;
  int col_coarse, col_fine;
  for (row_coarse = 0; row_coarse < nodes_coarse; row_coarse++) {
    row_fine = 2 * row_coarse;
    for (col_coarse = 0; col_coarse < nodes_coarse; col_coarse++) {
      col_fine = 2 * col_coarse;
      u_fine[row_fine][col_fine] += u_coarse[row_coarse][col_coarse];
    }
    for (col_coarse = 0; col_coarse < nodes_coarse - 1; col_coarse++) {
      col_fine = 2 * col_coarse + 1;
      u_fine[row_fine][col_fine] +=
          0.5 * (u_coarse[row_coarse][col_coarse] +
                 u_coarse[row_coarse][col_coarse + 1]);
    }
  }
  for (row_coarse = 0; row_coarse < nodes_coarse - 1; row_coarse++) {
    row_fine = 2 * row_coarse + 1;
    for (col_coarse = 0; col_coarse < nodes_coarse; col_coarse++) {
      col_fine = 2 * col_coarse;
      u_fine[row_fine][col_fine] +=
          0.5 * (u_coarse[row_coarse][col_coarse] +
                 u_coarse[row_coarse + 1][col_coarse]);
    }
    for (col_coarse = 0; col_coarse < nodes_coarse - 1; col_coarse++) {
      col_fine = 2 * col_coarse + 1;
      u_fine[row_fine][col_fine] +=
          0.25 * (u_coarse[row_coarse][col_coarse] +
                  u_coarse[row_coarse][col_coarse + 1] +
                  u_coarse[row_coarse + 1][col_coarse] +
                  u_coarse[row_coarse + 1][col_coarse + 1]);
    }
  }
  return;
}


x86 assembly (clang, -O0):
<ctof_2d>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1222 <ctof_2d+0x122>
mov    -0x1c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1184 <ctof_2d+0x84>
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1132 <ctof_2d+0x32>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    120f <ctof_2d+0x10f>
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xe14(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    118b <ctof_2d+0x8b>
jmp    1214 <ctof_2d+0x114>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1116 <ctof_2d+0x16>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    13a0 <ctof_2d+0x2a0>
mov    -0x1c(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12c9 <ctof_2d+0x1c9>
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xd5a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    124d <ctof_2d+0x14d>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    138d <ctof_2d+0x28d>
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xc8e(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12d0 <ctof_2d+0x1d0>
jmp    1392 <ctof_2d+0x292>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1229 <ctof_2d+0x129>
pop    %rbp
ret

x86 assembly (clang, -O2):
<ctof_2d>:
push   %r15
push   %r14
push   %r12
push   %rbx
test   %edi,%edi
jle    13ae <ctof_2d+0x2ae>
lea    -0x1(%rdi),%r9d
mov    %edi,%r10d
lea    -0x1(%r10),%r8
mov    %r10d,%r12d
and    $0xfffffffe,%r12d
mov    %r9d,%r11d
and    $0xfffffffe,%r11d
xor    %r15d,%r15d
movsd  0xecd(%rip),%xmm0
jmp    114d <ctof_2d+0x4d>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x1,%r15
cmp    %r10,%r15
je     1281 <ctof_2d+0x181>
mov    %r15,%rcx
shl    $0x4,%rcx
mov    (%rsi,%r15,8),%rax
mov    (%rdx,%rcx,1),%r14
test   %r8,%r8
je     11f0 <ctof_2d+0xf0>
lea    0x10(%r14),%rcx
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movsd  (%rax,%rbx,8),%xmm1
addsd  -0x10(%rcx),%xmm1
movsd  %xmm1,-0x10(%rcx)
movsd  0x8(%rax,%rbx,8),%xmm1
addsd  (%rcx),%xmm1
movsd  %xmm1,(%rcx)
add    $0x2,%rbx
add    $0x20,%rcx
cmp    %rbx,%r12
jne    1170 <ctof_2d+0x70>
test   $0x1,%r10b
je     11b5 <ctof_2d+0xb5>
movsd  (%rax,%rbx,8),%xmm1
shl    $0x4,%rbx
addsd  (%r14,%rbx,1),%xmm1
movsd  %xmm1,(%r14,%rbx,1)
cmp    $0x1,%edi
jne    11d0 <ctof_2d+0xd0>
add    $0x1,%r15
cmp    %r10,%r15
jne    114d <ctof_2d+0x4d>
jmp    13ae <ctof_2d+0x2ae>
nopl   0x0(%rax,%rax,1)
lea    (%r15,%r15,1),%rax
mov    (%rsi,%r15,8),%rbx
mov    (%rdx,%rax,8),%r14
cmp    $0x1,%r9d
jne    1200 <ctof_2d+0x100>
xor    %eax,%eax
jmp    124e <ctof_2d+0x14e>
cs nopw 0x0(%rax,%rax,1)
xor    %ebx,%ebx
test   $0x1,%r10b
jne    11a0 <ctof_2d+0xa0>
jmp    11b5 <ctof_2d+0xb5>
nopw   0x0(%rax,%rax,1)
lea    0x18(%r14),%rcx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
movsd  (%rbx,%rax,8),%xmm1
addsd  0x8(%rbx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  -0x10(%rcx),%xmm1
movsd  %xmm1,-0x10(%rcx)
movsd  0x8(%rbx,%rax,8),%xmm1
addsd  0x10(%rbx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  (%rcx),%xmm1
add    $0x2,%rax
movsd  %xmm1,(%rcx)
add    $0x20,%rcx
cmp    %rax,%r11
jne    1210 <ctof_2d+0x110>
test   $0x1,%r9b
je     1140 <ctof_2d+0x40>
mov    %rax,%rcx
shl    $0x4,%rcx
movsd  (%rbx,%rax,8),%xmm1
addsd  0x8(%rbx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x8(%r14,%rcx,1),%xmm1
movsd  %xmm1,0x8(%r14,%rcx,1)
jmp    1140 <ctof_2d+0x40>
cmp    $0x2,%edi
jl     13ae <ctof_2d+0x2ae>
mov    %r10d,%r15d
and    $0xfffffffe,%r15d
lea    0x0(,%r9,8),%r12
xor    %r14d,%r14d
movsd  0xd64(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    (%r14,%r14,1),%rax
mov    (%rsi,%r14,8),%rdi
mov    0x8(%rsi,%r14,8),%rbx
mov    0x8(%rdx,%rax,8),%r11
test   %r8,%r8
je     13a0 <ctof_2d+0x2a0>
lea    0x10(%r11),%rcx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rdi,%rax,8),%xmm2
addsd  (%rbx,%rax,8),%xmm2
mulsd  %xmm0,%xmm2
addsd  -0x10(%rcx),%xmm2
movsd  %xmm2,-0x10(%rcx)
movsd  0x8(%rdi,%rax,8),%xmm2
addsd  0x8(%rbx,%rax,8),%xmm2
mulsd  %xmm0,%xmm2
addsd  (%rcx),%xmm2
movsd  %xmm2,(%rcx)
add    $0x2,%rax
add    $0x20,%rcx
cmp    %rax,%r15
jne    12e0 <ctof_2d+0x1e0>
test   $0x1,%r10b
je     1341 <ctof_2d+0x241>
movsd  (%rdi,%rax,8),%xmm2
addsd  (%rbx,%rax,8),%xmm2
shl    $0x4,%rax
mulsd  %xmm0,%xmm2
addsd  (%r11,%rax,1),%xmm2
movsd  %xmm2,(%r11,%rax,1)
lea    (%r14,%r14,1),%rdi
add    $0x1,%rdi
mov    (%rsi,%r14,8),%rax
mov    0x8(%rsi,%r14,8),%rcx
add    $0x1,%r14
mov    (%rdx,%rdi,8),%rdi
xor    %ebx,%ebx
nopl   0x0(%rax)
movsd  (%rax,%rbx,1),%xmm2
addsd  0x8(%rax,%rbx,1),%xmm2
addsd  (%rcx,%rbx,1),%xmm2
addsd  0x8(%rcx,%rbx,1),%xmm2
mulsd  %xmm1,%xmm2
addsd  0x8(%rdi,%rbx,2),%xmm2
movsd  %xmm2,0x8(%rdi,%rbx,2)
add    $0x8,%rbx
cmp    %rbx,%r12
jne    1360 <ctof_2d+0x260>
cmp    %r9,%r14
jne    12b0 <ctof_2d+0x1b0>
jmp    13ae <ctof_2d+0x2ae>
nopw   0x0(%rax,%rax,1)
xor    %eax,%eax
test   $0x1,%r10b
jne    1323 <ctof_2d+0x223>
jmp    1341 <ctof_2d+0x241>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

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