void kernel_ludcmp(int n, double A[2000 + 0][2000 + 0], double b[2000 + 0],
                   double x[2000 + 0], double y[2000 + 0]) {
  int i, j, k;
  double w;
#pragma scop
  for (i = 0; i < n; i++) {
    for (j = 0; j < i; j++) {
      w = A[i][j];
      for (k = 0; k < j; k++) {
        w -= A[i][k] * A[k][j];
      }
      A[i][j] = w / A[j][j];
    }
    for (j = i; j < n; j++) {
      w = A[i][j];
      for (k = 0; k < i; k++) {
        w -= A[i][k] * A[k][j];
      }
      A[i][j] = w;
    }
  }
  for (i = 0; i < n; i++) {
    w = b[i];
    for (j = 0; j < i; j++)
      w -= A[i][j] * y[j];
    y[i] = w;
  }
  for (i = n - 1; i >= 0; i--) {
    w = y[i];
    for (j = i + 1; j < n; j++)
      w -= A[i][j] * x[j];
    x[i] = w / A[i][i];
  }
#pragma endscop
}


x86 assembly (clang, -O0):
<kernel_ludcmp>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1319 <kernel_ludcmp+0x219>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1226 <kernel_ludcmp+0x126>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    11dd <kernel_ludcmp+0xdd>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1164 <kernel_ludcmp+0x64>
movsd  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1131 <kernel_ludcmp+0x31>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1306 <kernel_ludcmp+0x206>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    12d8 <kernel_ludcmp+0x1d8>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    125f <kernel_ludcmp+0x15f>
movsd  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    122c <kernel_ludcmp+0x12c>
jmp    130b <kernel_ludcmp+0x20b>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    111e <kernel_ludcmp+0x1e>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    13d0 <kernel_ludcmp+0x2d0>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    13b0 <kernel_ludcmp+0x2b0>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1345 <kernel_ludcmp+0x245>
movsd  -0x40(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1320 <kernel_ludcmp+0x220>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jl     14a4 <kernel_ludcmp+0x3a4>
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1469 <kernel_ludcmp+0x369>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    13fe <kernel_ludcmp+0x2fe>
movsd  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x3e80,%rcx,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x2c(%rbp)
jmp    13d9 <kernel_ludcmp+0x2d9>
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_ludcmp>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %edi,%edi
jle    144d <kernel_ludcmp+0x34d>
mov    %edi,%r9d
lea    0x8(%rsi),%rax
xor    %r10d,%r10d
mov    %rsi,%r11
jmp    1147 <kernel_ludcmp+0x47>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%r10
add    $0x3e80,%rax
add    $0x8,%r11
cmp    %r9,%r10
je     12d9 <kernel_ludcmp+0x1d9>
test   %r10,%r10
je     1220 <kernel_ludcmp+0x120>
mov    %rsi,%r14
xor    %r12d,%r12d
jmp    118a <kernel_ludcmp+0x8a>
nopl   0x0(%rax,%rax,1)
lea    (%r15,%r12,8),%rbx
imul   $0x3e80,%r12,%rbp
add    %rsi,%rbp
divsd  0x0(%rbp,%r12,8),%xmm0
movsd  %xmm0,(%rbx)
add    $0x1,%r12
add    $0x8,%r14
cmp    %r10,%r12
je     1220 <kernel_ludcmp+0x120>
imul   $0x3e80,%r10,%r15
add    %rsi,%r15
movsd  (%r15,%r12,8),%xmm0
test   %r12,%r12
je     1160 <kernel_ludcmp+0x60>
cmp    $0x1,%r12
jne    11b0 <kernel_ludcmp+0xb0>
xor    %ebx,%ebx
jmp    11f0 <kernel_ludcmp+0xf0>
nopl   0x0(%rax)
mov    %r12,%r13
and    $0xfffffffffffffffe,%r13
mov    %r14,%rbp
xor    %ebx,%ebx
nopl   0x0(%rax)
movsd  -0x8(%rax,%rbx,8),%xmm1
mulsd  0x0(%rbp),%xmm1
movsd  (%rax,%rbx,8),%xmm2
subsd  %xmm1,%xmm0
mulsd  0x3e80(%rbp),%xmm2
subsd  %xmm2,%xmm0
add    $0x2,%rbx
add    $0x7d00,%rbp
cmp    %rbx,%r13
jne    11c0 <kernel_ludcmp+0xc0>
test   $0x1,%r12b
je     1160 <kernel_ludcmp+0x60>
movsd  (%r15,%rbx,8),%xmm1
imul   $0x3e80,%rbx,%rbx
add    %rsi,%rbx
mulsd  (%rbx,%r12,8),%xmm1
subsd  %xmm1,%xmm0
jmp    1160 <kernel_ludcmp+0x60>
nopl   0x0(%rax)
mov    %r10,%r13
and    $0xfffffffffffffffe,%r13
mov    %r11,%r14
mov    %r10,%r15
jmp    1249 <kernel_ludcmp+0x149>
nop
lea    (%r12,%r15,8),%rbx
movsd  %xmm0,(%rbx)
add    $0x1,%r15
add    $0x8,%r14
cmp    %r9,%r15
je     1130 <kernel_ludcmp+0x30>
imul   $0x3e80,%r10,%r12
add    %rsi,%r12
movsd  (%r12,%r15,8),%xmm0
test   %r10,%r10
je     1230 <kernel_ludcmp+0x130>
cmp    $0x1,%r10
jne    1270 <kernel_ludcmp+0x170>
xor    %ebx,%ebx
jmp    12b0 <kernel_ludcmp+0x1b0>
nopl   0x0(%rax,%rax,1)
mov    %r14,%rbp
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
movsd  -0x8(%rax,%rbx,8),%xmm1
mulsd  0x0(%rbp),%xmm1
movsd  (%rax,%rbx,8),%xmm2
subsd  %xmm1,%xmm0
mulsd  0x3e80(%rbp),%xmm2
subsd  %xmm2,%xmm0
add    $0x2,%rbx
add    $0x7d00,%rbp
cmp    %rbx,%r13
jne    1280 <kernel_ludcmp+0x180>
test   $0x1,%r10b
je     1230 <kernel_ludcmp+0x130>
movsd  (%r12,%rbx,8),%xmm1
imul   $0x3e80,%rbx,%rbx
add    %rsi,%rbx
mulsd  (%rbx,%r15,8),%xmm1
subsd  %xmm1,%xmm0
jmp    1230 <kernel_ludcmp+0x130>
test   %edi,%edi
jle    144d <kernel_ludcmp+0x34d>
lea    0x8(%rsi),%rax
xor    %r10d,%r10d
jmp    1305 <kernel_ludcmp+0x205>
nopw   0x0(%rax,%rax,1)
movsd  %xmm0,(%r8,%r10,8)
add    $0x1,%r10
add    $0x3e80,%rax
cmp    %r9,%r10
je     137e <kernel_ludcmp+0x27e>
movsd  (%rdx,%r10,8),%xmm0
test   %r10,%r10
je     12f0 <kernel_ludcmp+0x1f0>
cmp    $0x1,%r10
jne    1320 <kernel_ludcmp+0x220>
xor    %ebx,%ebx
jmp    1359 <kernel_ludcmp+0x259>
nopw   0x0(%rax,%rax,1)
mov    %r10,%rbp
and    $0xfffffffffffffffe,%rbp
xor    %ebx,%ebx
nopl   0x0(%rax)
movsd  -0x8(%rax,%rbx,8),%xmm1
movsd  (%rax,%rbx,8),%xmm2
mulsd  (%r8,%rbx,8),%xmm1
mulsd  0x8(%r8,%rbx,8),%xmm2
subsd  %xmm1,%xmm0
subsd  %xmm2,%xmm0
add    $0x2,%rbx
cmp    %rbx,%rbp
jne    1330 <kernel_ludcmp+0x230>
test   $0x1,%r10b
je     12f0 <kernel_ludcmp+0x1f0>
imul   $0x3e80,%r10,%rbp
add    %rsi,%rbp
movsd  0x0(%rbp,%rbx,8),%xmm1
mulsd  (%r8,%rbx,8),%xmm1
subsd  %xmm1,%xmm0
jmp    12f0 <kernel_ludcmp+0x1f0>
test   %edi,%edi
jle    144d <kernel_ludcmp+0x34d>
lea    0x8(%rsi),%r10
add    $0xffffffff,%edi
xor    %edx,%edx
mov    %r9,%r11
jmp    13c4 <kernel_ludcmp+0x2c4>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
imul   $0x3e80,%rax,%rbx
add    %rsi,%rbx
divsd  (%rbx,%rax,8),%xmm0
movsd  %xmm0,(%rcx,%rax,8)
add    $0x1,%edx
add    $0xffffffff,%edi
cmp    $0x1,%r14
jle    144d <kernel_ludcmp+0x34d>
mov    %r11,%r14
add    $0xffffffffffffffff,%r11
mov    %r11d,%eax
movsd  (%r8,%rax,8),%xmm0
cmp    %r9,%r14
jge    13a0 <kernel_ludcmp+0x2a0>
test   $0x1,%dl
jne    13f0 <kernel_ludcmp+0x2f0>
mov    %r14,%rbx
cmp    $0x1,%edx
je     13a0 <kernel_ludcmp+0x2a0>
jmp    1413 <kernel_ludcmp+0x313>
nopl   0x0(%rax,%rax,1)
imul   $0x3e80,%rax,%rbx
add    %rsi,%rbx
movsd  (%rbx,%r14,8),%xmm1
mulsd  (%rcx,%r14,8),%xmm1
subsd  %xmm1,%xmm0
lea    0x1(%r14),%rbx
cmp    $0x1,%edx
je     13a0 <kernel_ludcmp+0x2a0>
mov    %edi,%ebp
imul   $0x3e80,%rbp,%rbp
add    %r10,%rbp
nop
movsd  -0x8(%rbp,%rbx,8),%xmm1
movsd  0x0(%rbp,%rbx,8),%xmm2
mulsd  (%rcx,%rbx,8),%xmm1
mulsd  0x8(%rcx,%rbx,8),%xmm2
subsd  %xmm1,%xmm0
subsd  %xmm2,%xmm0
add    $0x2,%rbx
cmp    %ebx,%r9d
jne    1420 <kernel_ludcmp+0x320>
jmp    13a0 <kernel_ludcmp+0x2a0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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