void kernel(double point[150L + 2][150L + 2][150L + 2],
            double new_point[150L + 2][150L + 2][150L + 2]) {
  long int t, i, j, k;
#pragma scop
  for (t = 0; t < 100L; t++) {
    for (i = 1; i < 150L + 1; i++) {
      for (j = 1; j < 150L + 1; j++) {
        for (k = 1; k < 150L + 1; k++) {
          new_point[i][j][k] =
              0.125 * (point[i + 1][j][k] - 2.0 * point[i][j][k] +
                       point[i - 1][j][k]) +
              0.125 * (point[i][j + 1][k] - 2.0 * point[i][j][k] +
                       point[i][j - 1][k]) +
              0.125 * (point[i][j][k - 1] - 2.0 * point[i][j][k] +
                       point[i][j][k + 1]) +
              point[i][j][k];
        }
      }
    }
    for (i = 1; i < 150L + 1; i++) {
      for (j = 1; j < 150L + 1; j++) {
        for (k = 1; k < 150L + 1; k++) {
          point[i][j][k] = new_point[i][j][k];
        }
      }
    }
  }
#pragma endscop
}


x86 assembly (clang, -O0):
<kernel>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movq   $0x0,-0x18(%rbp)
cmpq   $0x64,-0x18(%rbp)
jge    145f <kernel+0x35f>
movq   $0x1,-0x20(%rbp)
cmpq   $0x97,-0x20(%rbp)
jge    1384 <kernel+0x284>
movq   $0x1,-0x28(%rbp)
cmpq   $0x97,-0x28(%rbp)
jge    136e <kernel+0x26e>
movq   $0x1,-0x30(%rbp)
cmpq   $0x97,-0x30(%rbp)
jge    1358 <kernel+0x258>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x1,%rcx
imul   $0x2d200,%rcx,%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  %xmm0,%xmm0
subsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x1,%rcx
imul   $0x2d200,%rcx,%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
imul   $0x4c0,%rcx,%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  %xmm0,%xmm0
subsd  %xmm0,%xmm2
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
mov    -0x28(%rbp),%rcx
sub    $0x1,%rcx
imul   $0x4c0,%rcx,%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm2
movsd  0xd99(%rip),%xmm0
mulsd  %xmm2,%xmm0
movsd  0xd8d(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
addsd  %xmm2,%xmm2
subsd  %xmm2,%xmm0
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
addsd  0x8(%rax,%rcx,8),%xmm0
movsd  0xd07(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1153 <kernel+0x53>
jmp    135d <kernel+0x25d>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    113d <kernel+0x3d>
jmp    1373 <kernel+0x273>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1127 <kernel+0x27>
movq   $0x1,-0x20(%rbp)
cmpq   $0x97,-0x20(%rbp)
jge    1449 <kernel+0x349>
movq   $0x1,-0x28(%rbp)
cmpq   $0x97,-0x28(%rbp)
jge    1433 <kernel+0x333>
movq   $0x1,-0x30(%rbp)
cmpq   $0x97,-0x30(%rbp)
jge    141d <kernel+0x31d>
mov    -0x10(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
imul   $0x2d200,-0x20(%rbp),%rcx
add    %rcx,%rax
imul   $0x4c0,-0x28(%rbp),%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    13b8 <kernel+0x2b8>
jmp    1422 <kernel+0x322>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13a2 <kernel+0x2a2>
jmp    1438 <kernel+0x338>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    138c <kernel+0x28c>
jmp    144e <kernel+0x34e>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1114 <kernel+0x14>
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rsi,%r12
lea    0x5a8c8(%rdi),%rax
mov    %rax,-0x30(%rsp)
lea    0x2d6c8(%rsi),%rax
mov    %rax,-0x38(%rsp)
lea    0x2d6c0(%rsi),%rax
mov    %rax,-0x40(%rsp)
lea    0x2d6f8(%rdi),%rax
mov    %rax,-0x48(%rsp)
lea    0x2d6c0(%rdi),%rax
mov    %rax,-0x50(%rsp)
lea    0x2d6f8(%rsi),%rax
mov    %rax,-0x58(%rsp)
xor    %eax,%eax
movsd  0xec0(%rip),%xmm8
movsd  0xec0(%rip),%xmm1
movapd 0xe90(%rip),%xmm2
movapd 0xe98(%rip),%xmm3
jmp    1193 <kernel+0x93>
nopw   0x0(%rax,%rax,1)
mov    -0x28(%rsp),%rax
add    $0x1,%rax
cmp    $0x64,%rax
je     1599 <kernel+0x499>
mov    %rax,-0x28(%rsp)
mov    $0x1,%r15d
mov    -0x38(%rsp),%r9
mov    -0x30(%rsp),%r8
xor    %r11d,%r11d
jmp    11d2 <kernel+0xd2>
nopl   (%rax)
add    $0x1,%r11
add    $0x2d200,%r8
add    $0x2d200,%r9
mov    %r13,%r15
cmp    $0x97,%r13
je     1390 <kernel+0x290>
lea    0x2(%r11),%r14
lea    0x1(%r15),%r13
mov    %r9,%rbx
mov    %r8,%rcx
mov    $0x1,%r10d
jmp    1207 <kernel+0x107>
nopl   0x0(%rax,%rax,1)
add    $0x4c0,%rcx
add    $0x4c0,%rbx
cmp    $0x97,%r10
je     11b0 <kernel+0xb0>
imul   $0x2d200,%r14,%rax
add    %rdi,%rax
imul   $0x4c0,%r10,%rdx
add    $0x1,%r10
lea    (%rdx,%rax,1),%rbp
add    $0x4b8,%rbp
imul   $0x2d200,%r15,%rsi
add    %r12,%rsi
lea    (%rdx,%rsi,1),%rax
add    $0x8,%rax
cmp    %rbp,%rax
jae    12f0 <kernel+0x1f0>
imul   $0x2d200,%r11,%rax
add    %rdi,%rax
add    %rdx,%rax
add    $0x8,%rax
add    %rsi,%rdx
add    $0x4b8,%rdx
cmp    %rdx,%rax
jae    12f0 <kernel+0x1f0>
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movsd  -0x2d200(%rcx,%rdx,8),%xmm0
fd ff
movapd %xmm0,%xmm4
mulsd  %xmm8,%xmm4
movsd  (%rcx,%rdx,8),%xmm5
addsd  %xmm4,%xmm5
addsd  -0x5a400(%rcx,%rdx,8),%xmm5
fa ff
movsd  -0x2cd40(%rcx,%rdx,8),%xmm6
fd ff
addsd  %xmm4,%xmm6
addsd  -0x2d6c0(%rcx,%rdx,8),%xmm6
fd ff
mulsd  %xmm1,%xmm6
mulsd  %xmm1,%xmm5
addsd  %xmm6,%xmm5
addsd  -0x2d208(%rcx,%rdx,8),%xmm4
fd ff
addsd  -0x2d1f8(%rcx,%rdx,8),%xmm4
fd ff
mulsd  %xmm1,%xmm4
addsd  %xmm5,%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,(%rbx,%rdx,8)
add    $0x1,%rdx
cmp    $0x96,%rdx
jne    1270 <kernel+0x170>
jmp    11f0 <kernel+0xf0>
nopl   0x0(%rax,%rax,1)
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movupd (%rcx,%rdx,8),%xmm4
movupd -0x2d200(%rcx,%rdx,8),%xmm5
fd ff
movapd %xmm5,%xmm6
mulpd  %xmm2,%xmm6
addpd  %xmm6,%xmm4
movupd -0x5a400(%rcx,%rdx,8),%xmm7
fa ff
addpd  %xmm4,%xmm7
movupd -0x2cd40(%rcx,%rdx,8),%xmm4
fd ff
addpd  %xmm6,%xmm4
movupd -0x2d6c0(%rcx,%rdx,8),%xmm0
fd ff
addpd  %xmm4,%xmm0
mulpd  %xmm3,%xmm0
mulpd  %xmm3,%xmm7
addpd  %xmm0,%xmm7
movupd -0x2d208(%rcx,%rdx,8),%xmm0
fd ff
addpd  %xmm6,%xmm0
movupd -0x2d1f8(%rcx,%rdx,8),%xmm4
fd ff
addpd  %xmm0,%xmm4
mulpd  %xmm3,%xmm4
addpd  %xmm7,%xmm4
addpd  %xmm5,%xmm4
movupd %xmm4,(%rbx,%rdx,8)
add    $0x2,%rdx
cmp    $0x96,%rdx
jne    1300 <kernel+0x200>
jmp    11f0 <kernel+0xf0>
xchg   %ax,%ax
mov    $0x1,%eax
mov    %rax,-0x60(%rsp)
mov    -0x40(%rsp),%rbp
mov    -0x50(%rsp),%rbx
mov    -0x58(%rsp),%r10
mov    -0x48(%rsp),%r9
jmp    13fa <kernel+0x2fa>
mov    -0x60(%rsp),%rax
add    $0x1,%rax
mov    -0x20(%rsp),%r9
add    $0x2d200,%r9
mov    -0x18(%rsp),%r10
add    $0x2d200,%r10
mov    -0x10(%rsp),%rbx
add    $0x2d200,%rbx
mov    -0x8(%rsp),%rbp
add    $0x2d200,%rbp
mov    %rax,-0x60(%rsp)
cmp    $0x97,%rax
je     1180 <kernel+0x80>
mov    %rbp,-0x8(%rsp)
mov    %rbx,-0x10(%rsp)
mov    %r10,-0x18(%rsp)
mov    %r9,-0x20(%rsp)
mov    $0x1,%r11d
jmp    144d <kernel+0x34d>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%r11
add    $0x4c0,%r9
add    $0x4c0,%r10
add    $0x4c0,%rbx
add    $0x4c0,%rbp
cmp    $0x97,%r11
je     13b0 <kernel+0x2b0>
imul   $0x2d200,-0x60(%rsp),%rax
mov    %r12,%rsi
lea    (%r12,%rax,1),%rcx
imul   $0x4c0,%r11,%rdx
lea    (%rdx,%rcx,1),%r15
add    $0x4b8,%r15
lea    (%rdx,%rcx,1),%r12
add    $0x8,%r12
add    %rdi,%rax
lea    (%rdx,%rax,1),%r8
add    $0x4b8,%r8
lea    (%rdx,%rax,1),%r13
add    $0x8,%r13
cmp    %r15,%r13
jae    149d <kernel+0x39d>
mov    $0x1,%r14d
cmp    %r8,%r12
jb     14f6 <kernel+0x3f6>
xor    %ecx,%ecx
nop
movupd -0x30(%r10,%rcx,8),%xmm0
movupd -0x20(%r10,%rcx,8),%xmm4
movupd %xmm0,-0x30(%r9,%rcx,8)
movupd %xmm4,-0x20(%r9,%rcx,8)
cmp    $0x90,%rcx
je     14f0 <kernel+0x3f0>
movupd -0x10(%r10,%rcx,8),%xmm0
movupd (%r10,%rcx,8),%xmm4
movupd %xmm0,-0x10(%r9,%rcx,8)
movupd %xmm4,(%r9,%rcx,8)
add    $0x8,%rcx
jmp    14a0 <kernel+0x3a0>
cs nopw 0x0(%rax,%rax,1)
nop
mov    $0x95,%r14d
cmp    %r8,%r12
setb   %al
cmp    %r15,%r13
setb   %r8b
and    %al,%r8b
lea    (%rbx,%r14,8),%rax
lea    0x0(,%r14,8),%rdx
add    %rbp,%rdx
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movsd  (%rdx,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
add    $0x1,%rcx
cmp    $0x2,%rcx
jne    1520 <kernel+0x420>
test   %r8b,%r8b
mov    %rsi,%r12
je     1420 <kernel+0x320>
add    %rcx,%r14
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  0x0(%rbp,%r14,8),%xmm0
movsd  %xmm0,(%rbx,%r14,8)
movsd  0x8(%rbp,%r14,8),%xmm0
movsd  %xmm0,0x8(%rbx,%r14,8)
movsd  0x10(%rbp,%r14,8),%xmm0
movsd  %xmm0,0x10(%rbx,%r14,8)
movsd  0x18(%rbp,%r14,8),%xmm0
movsd  %xmm0,0x18(%rbx,%r14,8)
add    $0x4,%r14
cmp    $0x97,%r14
jne    1550 <kernel+0x450>
jmp    1420 <kernel+0x320>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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