void update(double nx, double ny, double u1[][100], double u2[][100]) {
  int ix, iy;
  for (ix = 0; ix <= 100 - 1; ix++) {
    u1[100 - 1][ix] = u2[100 - 1][ix];
    u1[0][ix] = u2[0][ix];
  }
  for (iy = 0; iy <= 100 - 1; iy++) {
    u1[iy][0] = u2[iy][0];
    u1[iy][100 - 1] = u2[iy][100 - 1];
  }
  for (ix = 1; ix < 100 - 1; ++ix) {
    for (iy = 1; iy < 100 - 1; ++iy) {
      u1[ix][iy] = u2[ix][iy] +
                   nx * (u2[ix + 1][iy] + u2[ix - 1][iy] - 2 * u2[ix][iy]) +
                   ny * (u2[ix][iy + 1] + u2[ix][iy - 1] - 2 * u2[ix][iy]);
    }
  }
}


x86 assembly (clang, -O0):
<update>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x63,-0x24(%rbp)
jg     1171 <update+0x71>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  0x13560(%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,0x13560(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    111d <update+0x1d>
movl   $0x0,-0x28(%rbp)
cmpl   $0x63,-0x28(%rbp)
jg     11f0 <update+0xf0>
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movsd  0x318(%rax),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movsd  %xmm0,0x318(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1178 <update+0x78>
movl   $0x1,-0x24(%rbp)
cmpl   $0x63,-0x24(%rbp)
jge    1349 <update+0x249>
movl   $0x1,-0x28(%rbp)
cmpl   $0x63,-0x28(%rbp)
jge    1336 <update+0x236>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x8(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movslq -0x28(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm3
addsd  %xmm3,%xmm3
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x10(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm3
addsd  %xmm3,%xmm3
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1208 <update+0x108>
jmp    133b <update+0x23b>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11f7 <update+0xf7>
pop    %rbp
ret

x86 assembly (clang, -O2):
<update>:
push   %rbx
lea    0x13880(%rsi),%rax
cmp    %rdi,%rax
jbe    1169 <update+0x69>
lea    0x13880(%rdi),%rax
cmp    %rsi,%rax
jbe    1169 <update+0x69>
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movsd  0x13560(%rsi,%rax,8),%xmm2
movsd  %xmm2,0x13560(%rdi,%rax,8)
movsd  (%rsi,%rax,8),%xmm2
movsd  %xmm2,(%rdi,%rax,8)
movsd  0x13568(%rsi,%rax,8),%xmm2
movsd  %xmm2,0x13568(%rdi,%rax,8)
movsd  0x8(%rsi,%rax,8),%xmm2
movsd  %xmm2,0x8(%rdi,%rax,8)
add    $0x2,%rax
cmp    $0x64,%rax
jne    1120 <update+0x20>
jmp    11fe <update+0xfe>
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movups 0x13560(%rsi,%rax,8),%xmm2
movups %xmm2,0x13560(%rdi,%rax,8)
movups (%rsi,%rax,8),%xmm2
movups %xmm2,(%rdi,%rax,8)
movups 0x13570(%rsi,%rax,8),%xmm2
movups %xmm2,0x13570(%rdi,%rax,8)
movups 0x10(%rsi,%rax,8),%xmm2
movups %xmm2,0x10(%rdi,%rax,8)
movups 0x13580(%rsi,%rax,8),%xmm2
movups %xmm2,0x13580(%rdi,%rax,8)
movups 0x20(%rsi,%rax,8),%xmm2
movups %xmm2,0x20(%rdi,%rax,8)
movups 0x13590(%rsi,%rax,8),%xmm2
movups %xmm2,0x13590(%rdi,%rax,8)
movups 0x30(%rsi,%rax,8),%xmm2
movups %xmm2,0x30(%rdi,%rax,8)
movups 0x135a0(%rsi,%rax,8),%xmm2
movups %xmm2,0x135a0(%rdi,%rax,8)
movups 0x40(%rsi,%rax,8),%xmm2
movups %xmm2,0x40(%rdi,%rax,8)
add    $0xa,%rax
cmp    $0x64,%rax
jne    1170 <update+0x70>
xor    %eax,%eax
movsd  (%rsi,%rax,1),%xmm2
movsd  %xmm2,(%rdi,%rax,1)
movsd  0x318(%rsi,%rax,1),%xmm2
movsd  %xmm2,0x318(%rdi,%rax,1)
movsd  0x320(%rsi,%rax,1),%xmm2
movsd  %xmm2,0x320(%rdi,%rax,1)
movsd  0x638(%rsi,%rax,1),%xmm2
movsd  %xmm2,0x638(%rdi,%rax,1)
add    $0x640,%rax
cmp    $0x13880,%rax
jne    1200 <update+0x100>
movapd %xmm0,%xmm2
unpcklpd %xmm0,%xmm2
movapd %xmm1,%xmm3
unpcklpd %xmm1,%xmm3
lea    0x648(%rsi),%rax
lea    0x328(%rdi),%rcx
mov    $0x1,%r8d
xor    %r9d,%r9d
movsd  0xd92(%rip),%xmm8
movapd 0xd79(%rip),%xmm9
jmp    12ab <update+0x1ab>
nopl   0x0(%rax)
add    $0x1,%r9
add    $0x320,%rax
add    $0x320,%rcx
cmp    $0x63,%r8
je     13d1 <update+0x2d1>
imul   $0x320,%r9,%r10
lea    (%rsi,%r10,1),%r11
add    $0x958,%r11
imul   $0x320,%r8,%rdx
add    $0x1,%r8
lea    (%rdi,%rdx,1),%rbx
add    $0x8,%rbx
cmp    %r11,%rbx
jae    1360 <update+0x260>
lea    (%rsi,%r10,1),%rbx
add    $0x8,%rbx
add    %rdi,%rdx
add    $0x318,%rdx
cmp    %rdx,%rbx
jae    1360 <update+0x260>
mov    $0xffffffffffffff9e,%rdx
nopw   0x0(%rax,%rax,1)
movsd  0x310(%rax,%rdx,8),%xmm4
addsd  -0x330(%rax,%rdx,8),%xmm4
ff ff
movsd  -0x10(%rax,%rdx,8),%xmm5
movsd  -0x8(%rax,%rdx,8),%xmm6
movapd %xmm5,%xmm7
mulsd  %xmm8,%xmm7
addsd  %xmm7,%xmm4
mulsd  %xmm0,%xmm4
addsd  %xmm5,%xmm4
addsd  -0x18(%rax,%rdx,8),%xmm6
addsd  %xmm7,%xmm6
mulsd  %xmm1,%xmm6
addsd  %xmm4,%xmm6
movsd  %xmm6,0x310(%rcx,%rdx,8)
inc    %rdx
jne    1300 <update+0x200>
jmp    1290 <update+0x190>
nopl   0x0(%rax,%rax,1)
mov    $0xffffffffffffff9e,%rdx
nopw   0x0(%rax,%rax,1)
movupd -0x10(%rax,%rdx,8),%xmm6
movupd 0x310(%rax,%rdx,8),%xmm7
movupd -0x330(%rax,%rdx,8),%xmm4
ff ff
addpd  %xmm7,%xmm4
movapd %xmm6,%xmm7
mulpd  %xmm9,%xmm7
addpd  %xmm7,%xmm4
mulpd  %xmm2,%xmm4
addpd  %xmm6,%xmm4
movupd -0x8(%rax,%rdx,8),%xmm6
movupd -0x18(%rax,%rdx,8),%xmm5
addpd  %xmm6,%xmm5
addpd  %xmm7,%xmm5
mulpd  %xmm3,%xmm5
addpd  %xmm4,%xmm5
movupd %xmm5,0x310(%rcx,%rdx,8)
add    $0x2,%rdx
jne    1370 <update+0x270>
jmp    1290 <update+0x190>
pop    %rbx
ret

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

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