int GSolve(double **a, int n, double *x) {
  int i, j, k, maxrow;
  double tmp;
  for (i = 0; i < n; i++) {
    maxrow = i;
    for (j = i + 1; j < n; j++) {
      if ((a[i][j] < 0 ? -(a[i][j]) : (a[i][j])) >
          (a[i][maxrow] < 0 ? -(a[i][maxrow]) : (a[i][maxrow])))
        maxrow = j;
    }
    for (k = i; k < n + 1; k++) {
      tmp = a[k][i];
      a[k][i] = a[k][maxrow];
      a[k][maxrow] = tmp;
    }
    if ((a[i][i] < 0 ? -(a[i][i]) : (a[i][i])) < 0.00001)
      return (0);
    for (j = i + 1; j < n; j++) {
      for (k = n; k >= i; k--) {
        a[k][j] -= a[k][i] * a[i][j] / a[i][i];
      }
    }
  }
  for (j = n - 1; j >= 0; j--) {
    tmp = 0;
    for (k = j + 1; k < n; k++)
      tmp += a[k][j] * x[k];
    x[j] = (a[n][j] - tmp) / a[j][j];
  }
  return (1);
}


x86 assembly (clang, -O0):
<GSolve>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    141c <GSolve+0x31c>
mov    -0x24(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1250 <GSolve+0x150>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
xorps  %xmm0,%xmm0
ucomisd (%rax,%rcx,8),%xmm0
jbe    1191 <GSolve+0x91>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    11ab <GSolve+0xab>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
xorps  %xmm0,%xmm0
ucomisd (%rax,%rcx,8),%xmm0
jbe    1209 <GSolve+0x109>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    1223 <GSolve+0x123>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jbe    123d <GSolve+0x13d>
mov    -0x28(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1242 <GSolve+0x142>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1131 <GSolve+0x31>
mov    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    12d3 <GSolve+0x1d3>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1256 <GSolve+0x156>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
xorps  %xmm0,%xmm0
ucomisd (%rax,%rcx,8),%xmm0
jbe    1327 <GSolve+0x227>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1341 <GSolve+0x241>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm1
movsd  0xcb2(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1364 <GSolve+0x264>
movl   $0x0,-0x4(%rbp)
jmp    14df <GSolve+0x3df>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1409 <GSolve+0x309>
mov    -0x14(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jl     13f6 <GSolve+0x2f6>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x2c(%rbp)
jmp    137f <GSolve+0x27f>
jmp    13fb <GSolve+0x2fb>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    136d <GSolve+0x26d>
jmp    140e <GSolve+0x30e>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1116 <GSolve+0x16>
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jl     14d8 <GSolve+0x3d8>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    148e <GSolve+0x38e>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1440 <GSolve+0x340>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    1425 <GSolve+0x325>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<GSolve>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    $0x1,%eax
test   %esi,%esi
jle    13cd <GSolve+0x2cd>
lea    0x1(%rsi),%r14d
mov    %esi,%r8d
lea    0x1(%r8),%r9
mov    $0x1,%r10d
xor    %r11d,%r11d
movapd 0xecd(%rip),%xmm0
xorpd  %xmm1,%xmm1
movapd 0xec1(%rip),%xmm2
movsd  0xec9(%rip),%xmm3
mov    %rdi,%r15
jmp    1165 <GSolve+0x65>
nopl   0x0(%rax)
add    $0x1,%r10
add    $0x8,%r15
add    $0xffffffffffffffff,%r14
cmp    %r8,%r11
je     12a6 <GSolve+0x1a6>
mov    %r11,%r13
add    $0x1,%r11
cmp    %r8,%r11
jae    11e0 <GSolve+0xe0>
mov    (%rdi,%r13,8),%r12
mov    %r10,%rbx
mov    %r13d,%ebp
jmp    118b <GSolve+0x8b>
nopl   (%rax)
add    $0x1,%rbx
mov    %ecx,%ebp
cmp    %rbx,%r8
je     11e3 <GSolve+0xe3>
movsd  (%r12,%rbx,8),%xmm4
movapd %xmm4,%xmm5
xorpd  %xmm0,%xmm5
movapd %xmm4,%xmm6
cmpltsd %xmm1,%xmm6
andpd  %xmm6,%xmm5
andnpd %xmm4,%xmm6
orpd   %xmm5,%xmm6
movslq %ebp,%rcx
movsd  (%r12,%rcx,8),%xmm4
movapd %xmm4,%xmm5
xorpd  %xmm0,%xmm5
movapd %xmm4,%xmm7
cmpltsd %xmm1,%xmm7
andpd  %xmm7,%xmm5
andnpd %xmm4,%xmm7
orpd   %xmm5,%xmm7
ucomisd %xmm7,%xmm6
mov    %ebx,%ecx
ja     1180 <GSolve+0x80>
mov    %ebp,%ecx
jmp    1180 <GSolve+0x80>
mov    %r13d,%ecx
movslq %ecx,%rcx
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
mov    (%r15,%rbx,8),%rbp
movsd  0x0(%rbp,%r13,8),%xmm4
movsd  0x0(%rbp,%rcx,8),%xmm5
movsd  %xmm5,0x0(%rbp,%r13,8)
movsd  %xmm4,0x0(%rbp,%rcx,8)
add    $0x1,%rbx
cmp    %rbx,%r14
jne    11f0 <GSolve+0xf0>
mov    (%rdi,%r13,8),%r12
movsd  (%r12,%r13,8),%xmm4
movapd %xmm4,%xmm5
xorpd  %xmm2,%xmm5
movapd %xmm4,%xmm6
cmpltsd %xmm1,%xmm6
andpd  %xmm6,%xmm5
andnpd %xmm4,%xmm6
orpd   %xmm5,%xmm6
ucomisd %xmm6,%xmm3
ja     129f <GSolve+0x19f>
cmp    %r8,%r11
jae    1150 <GSolve+0x50>
mov    %r10,%rbx
mov    %r9,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    -0x8(%rdi,%rcx,8),%rbp
movsd  0x0(%rbp,%r13,8),%xmm4
mulsd  (%r12,%rbx,8),%xmm4
divsd  (%r12,%r13,8),%xmm4
movsd  0x0(%rbp,%rbx,8),%xmm5
subsd  %xmm4,%xmm5
movsd  %xmm5,0x0(%rbp,%rbx,8)
add    $0xffffffffffffffff,%rcx
cmp    %r13,%rcx
jg     1260 <GSolve+0x160>
add    $0x1,%rbx
cmp    %r8,%rbx
jne    1250 <GSolve+0x150>
jmp    1150 <GSolve+0x50>
xor    %eax,%eax
jmp    13cd <GSolve+0x2cd>
test   %esi,%esi
jle    13cd <GSolve+0x2cd>
lea    (%rdi,%r8,8),%r15
mov    (%rdi,%r8,8),%r9
mov    %r8,%r10
neg    %r10
lea    (%rdx,%r8,8),%r13
xor    %r11d,%r11d
mov    %r8,%rbx
jmp    1302 <GSolve+0x202>
nopl   0x0(%rax,%rax,1)
movsd  (%r9,%rbx,8),%xmm1
subsd  %xmm0,%xmm1
mov    (%rdi,%rbx,8),%rcx
divsd  (%rcx,%rbx,8),%xmm1
movsd  %xmm1,(%rdx,%rbx,8)
add    $0x1,%r11d
add    $0x1,%r10
add    $0xfffffffffffffff8,%r13
add    $0xfffffffffffffff8,%r15
cmp    $0x1,%r14
jle    13cd <GSolve+0x2cd>
mov    %rbx,%r14
add    $0xffffffffffffffff,%rbx
xorpd  %xmm0,%xmm0
cmp    %r8,%r14
jge    12d0 <GSolve+0x1d0>
lea    -0x1(%r11),%r12d
test   $0x3,%r11b
je     135a <GSolve+0x25a>
mov    %r11d,%ebp
and    $0x3,%ebp
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
mov    (%r15,%rcx,8),%rsi
movsd  (%rsi,%rbx,8),%xmm1
mulsd  0x0(%r13,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
add    $0x1,%rcx
cmp    %ecx,%ebp
jne    1330 <GSolve+0x230>
sub    %r10,%rcx
cmp    $0x3,%r12d
jae    1370 <GSolve+0x270>
jmp    12d0 <GSolve+0x1d0>
xorpd  %xmm0,%xmm0
mov    %r14,%rcx
cmp    $0x3,%r12d
jb     12d0 <GSolve+0x1d0>
nopl   0x0(%rax,%rax,1)
mov    (%rdi,%rcx,8),%rsi
mov    0x8(%rdi,%rcx,8),%rbp
movsd  (%rsi,%rbx,8),%xmm1
mulsd  (%rdx,%rcx,8),%xmm1
addsd  %xmm0,%xmm1
movsd  0x0(%rbp,%rbx,8),%xmm2
mulsd  0x8(%rdx,%rcx,8),%xmm2
addsd  %xmm1,%xmm2
mov    0x10(%rdi,%rcx,8),%rsi
movsd  (%rsi,%rbx,8),%xmm1
mulsd  0x10(%rdx,%rcx,8),%xmm1
mov    0x18(%rdi,%rcx,8),%rsi
movsd  (%rsi,%rbx,8),%xmm0
mulsd  0x18(%rdx,%rcx,8),%xmm0
addsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
add    $0x4,%rcx
cmp    %ecx,%r8d
jne    1370 <GSolve+0x270>
jmp    12d0 <GSolve+0x1d0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @GSolve(double** %0, i32 %1, double* %2) {
%4 = alloca i32
%5 = alloca double**
%6 = alloca i32
%7 = alloca double*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca double
store double** %0, double*** %5
store i32 %1, i32* %6
store double* %2, double** %7
store i32 0, i32* %8
br label %13
13: ; preds = %242, %3
%14 = load i32, i32* %8
%15 = load i32, i32* %6
%16 = icmp slt i32 %14, %15
br i1 %16, label %17, label %245
17: ; preds = %13
%18 = load i32, i32* %8
store i32 %18, i32* %11
%19 = load i32, i32* %8
%20 = add nsw i32 %19, 1
store i32 %20, i32* %9
br label %21
21: ; preds = %96, %17
%22 = load i32, i32* %9
%23 = load i32, i32* %6
%24 = icmp slt i32 %22, %23
br i1 %24, label %25, label %99
25: ; preds = %21
%26 = load double**, double*** %5
%27 = load i32, i32* %8
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds double*, double** %26, i64 %28
%30 = load double*, double** %29
%31 = load i32, i32* %9
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds double, double* %30, i64 %32
%34 = load double, double* %33
%35 = fcmp olt double %34, 0.000000e+00
br i1 %35, label %36, label %47
36: ; preds = %25
%37 = load double**, double*** %5
%38 = load i32, i32* %8
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds double*, double** %37, i64 %39
%41 = load double*, double** %40
%42 = load i32, i32* %9
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds double, double* %41, i64 %43
%45 = load double, double* %44
%46 = fneg double %45
br label %57
47: ; preds = %25
%48 = load double**, double*** %5
%49 = load i32, i32* %8
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds double*, double** %48, i64 %50
%52 = load double*, double** %51
%53 = load i32, i32* %9
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds double, double* %52, i64 %54
%56 = load double, double* %55
br label %57
57: ; preds = %47, %36
%58 = phi double [ %46, %36 ], [ %56, %47 ]
%59 = load double**, double*** %5
%60 = load i32, i32* %8
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds double*, double** %59, i64 %61
%63 = load double*, double** %62
%64 = load i32, i32* %11
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds double, double* %63, i64 %65
%67 = load double, double* %66
%68 = fcmp olt double %67, 0.000000e+00
br i1 %68, label %69, label %80
69: ; preds = %57
%70 = load double**, double*** %5
%71 = load i32, i32* %8
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds double*, double** %70, i64 %72
%74 = load double*, double** %73
%75 = load i32, i32* %11
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds double, double* %74, i64 %76
%78 = load double, double* %77
%79 = fneg double %78
br label %90
80: ; preds = %57
%81 = load double**, double*** %5
%82 = load i32, i32* %8
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds double*, double** %81, i64 %83
%85 = load double*, double** %84
%86 = load i32, i32* %11
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds double, double* %85, i64 %87
%89 = load double, double* %88
br label %90
90: ; preds = %80, %69
%91 = phi double [ %79, %69 ], [ %89, %80 ]
%92 = fcmp ogt double %58, %91
br i1 %92, label %93, label %95
93: ; preds = %90
%94 = load i32, i32* %9
store i32 %94, i32* %11
br label %95
95: ; preds = %93, %90
br label %96
96: ; preds = %95
%97 = load i32, i32* %9
%98 = add nsw i32 %97, 1
store i32 %98, i32* %9
br label %21
99: ; preds = %21
%100 = load i32, i32* %8
store i32 %100, i32* %10
br label %101
101: ; preds = %142, %99
%102 = load i32, i32* %10
%103 = load i32, i32* %6
%104 = add nsw i32 %103, 1
%105 = icmp slt i32 %102, %104
br i1 %105, label %106, label %145
106: ; preds = %101
%107 = load double**, double*** %5
%108 = load i32, i32* %10
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds double*, double** %107, i64 %109
%111 = load double*, double** %110
%112 = load i32, i32* %8
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds double, double* %111, i64 %113
%115 = load double, double* %114
store double %115, double* %12
%116 = load double**, double*** %5
%117 = load i32, i32* %10
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds double*, double** %116, i64 %118
%120 = load double*, double** %119
%121 = load i32, i32* %11
%122 = sext i32 %121 to i64
%123 = getelementptr inbounds double, double* %120, i64 %122
%124 = load double, double* %123
%125 = load double**, double*** %5
%126 = load i32, i32* %10
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds double*, double** %125, i64 %127
%129 = load double*, double** %128
%130 = load i32, i32* %8
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds double, double* %129, i64 %131
store double %124, double* %132
%133 = load double, double* %12
%134 = load double**, double*** %5
%135 = load i32, i32* %10
%136 = sext i32 %135 to i64
%137 = getelementptr inbounds double*, double** %134, i64 %136
%138 = load double*, double** %137
%139 = load i32, i32* %11
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds double, double* %138, i64 %140
store double %133, double* %141
br label %142
142: ; preds = %106
%143 = load i32, i32* %10
%144 = add nsw i32 %143, 1
store i32 %144, i32* %10
br label %101
145: ; preds = %101
%146 = load double**, double*** %5
%147 = load i32, i32* %8
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds double*, double** %146, i64 %148
%150 = load double*, double** %149
%151 = load i32, i32* %8
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds double, double* %150, i64 %152
%154 = load double, double* %153
%155 = fcmp olt double %154, 0.000000e+00
br i1 %155, label %156, label %167
156: ; preds = %145
%157 = load double**, double*** %5
%158 = load i32, i32* %8
%159 = sext i32 %158 to i64
%160 = getelementptr inbounds double*, double** %157, i64 %159
%161 = load double*, double** %160
%162 = load i32, i32* %8
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds double, double* %161, i64 %163
%165 = load double, double* %164
%166 = fneg double %165
br label %177
167: ; preds = %145
%168 = load double**, double*** %5
%169 = load i32, i32* %8
%170 = sext i32 %169 to i64
%171 = getelementptr inbounds double*, double** %168, i64 %170
%172 = load double*, double** %171
%173 = load i32, i32* %8
%174 = sext i32 %173 to i64
%175 = getelementptr inbounds double, double* %172, i64 %174
%176 = load double, double* %175
br label %177
177: ; preds = %167, %156
%178 = phi double [ %166, %156 ], [ %176, %167 ]
%179 = fcmp olt double %178, 1.000000e-05
br i1 %179, label %180, label %181
180: ; preds = %177
store i32 0, i32* %4
br label %308
181: ; preds = %177
%182 = load i32, i32* %8
%183 = add nsw i32 %182, 1
store i32 %183, i32* %9
br label %184
184: ; preds = %238, %181
%185 = load i32, i32* %9
%186 = load i32, i32* %6
%187 = icmp slt i32 %185, %186
br i1 %187, label %188, label %241
188: ; preds = %184
%189 = load i32, i32* %6
store i32 %189, i32* %10
br label %190
190: ; preds = %234, %188
%191 = load i32, i32* %10
%192 = load i32, i32* %8
%193 = icmp sge i32 %191, %192
br i1 %193, label %194, label %237
194: ; preds = %190
%195 = load double**, double*** %5
%196 = load i32, i32* %10
%197 = sext i32 %196 to i64
%198 = getelementptr inbounds double*, double** %195, i64 %197
%199 = load double*, double** %198
%200 = load i32, i32* %8
%201 = sext i32 %200 to i64
%202 = getelementptr inbounds double, double* %199, i64 %201
%203 = load double, double* %202
%204 = load double**, double*** %5
%205 = load i32, i32* %8
%206 = sext i32 %205 to i64
%207 = getelementptr inbounds double*, double** %204, i64 %206
%208 = load double*, double** %207
%209 = load i32, i32* %9
%210 = sext i32 %209 to i64
%211 = getelementptr inbounds double, double* %208, i64 %210
%212 = load double, double* %211
%213 = fmul double %203, %212
%214 = load double**, double*** %5
%215 = load i32, i32* %8
%216 = sext i32 %215 to i64
%217 = getelementptr inbounds double*, double** %214, i64 %216
%218 = load double*, double** %217
%219 = load i32, i32* %8
%220 = sext i32 %219 to i64
%221 = getelementptr inbounds double, double* %218, i64 %220
%222 = load double, double* %221
%223 = fdiv double %213, %222
%224 = load double**, double*** %5
%225 = load i32, i32* %10
%226 = sext i32 %225 to i64
%227 = getelementptr inbounds double*, double** %224, i64 %226
%228 = load double*, double** %227
%229 = load i32, i32* %9
%230 = sext i32 %229 to i64
%231 = getelementptr inbounds double, double* %228, i64 %230
%232 = load double, double* %231
%233 = fsub double %232, %223
store double %233, double* %231
br label %234
234: ; preds = %194
%235 = load i32, i32* %10
%236 = add nsw i32 %235, -1
store i32 %236, i32* %10
br label %190
237: ; preds = %190
br label %238
238: ; preds = %237
%239 = load i32, i32* %9
%240 = add nsw i32 %239, 1
store i32 %240, i32* %9
br label %184
241: ; preds = %184
br label %242
242: ; preds = %241
%243 = load i32, i32* %8
%244 = add nsw i32 %243, 1
store i32 %244, i32* %8
br label %13
245: ; preds = %13
%246 = load i32, i32* %6
%247 = sub nsw i32 %246, 1
store i32 %247, i32* %9
br label %248
248: ; preds = %304, %245
%249 = load i32, i32* %9
%250 = icmp sge i32 %249, 0
br i1 %250, label %251, label %307
251: ; preds = %248
store double 0.000000e+00, double* %12
%252 = load i32, i32* %9
%253 = add nsw i32 %252, 1
store i32 %253, i32* %10
br label %254
254: ; preds = %275, %251
%255 = load i32, i32* %10
%256 = load i32, i32* %6
%257 = icmp slt i32 %255, %256
br i1 %257, label %258, label %278
258: ; preds = %254
%259 = load double**, double*** %5
%260 = load i32, i32* %10
%261 = sext i32 %260 to i64
%262 = getelementptr inbounds double*, double** %259, i64 %261
%263 = load double*, double** %262
%264 = load i32, i32* %9
%265 = sext i32 %264 to i64
%266 = getelementptr inbounds double, double* %263, i64 %265
%267 = load double, double* %266
%268 = load double*, double** %7
%269 = load i32, i32* %10
%270 = sext i32 %269 to i64
%271 = getelementptr inbounds double, double* %268, i64 %270
%272 = load double, double* %271
%273 = load double, double* %12
%274 = call double @llvm.fmuladd.f64(double %267, double %272, double %273)
store double %274, double* %12
br label %275
275: ; preds = %258
%276 = load i32, i32* %10
%277 = add nsw i32 %276, 1
store i32 %277, i32* %10
br label %254
278: ; preds = %254
%279 = load double**, double*** %5
%280 = load i32, i32* %6
%281 = sext i32 %280 to i64
%282 = getelementptr inbounds double*, double** %279, i64 %281
%283 = load double*, double** %282
%284 = load i32, i32* %9
%285 = sext i32 %284 to i64
%286 = getelementptr inbounds double, double* %283, i64 %285
%287 = load double, double* %286
%288 = load double, double* %12
%289 = fsub double %287, %288
%290 = load double**, double*** %5
%291 = load i32, i32* %9
%292 = sext i32 %291 to i64
%293 = getelementptr inbounds double*, double** %290, i64 %292
%294 = load double*, double** %293
%295 = load i32, i32* %9
%296 = sext i32 %295 to i64
%297 = getelementptr inbounds double, double* %294, i64 %296
%298 = load double, double* %297
%299 = fdiv double %289, %298
%300 = load double*, double** %7
%301 = load i32, i32* %9
%302 = sext i32 %301 to i64
%303 = getelementptr inbounds double, double* %300, i64 %302
store double %299, double* %303
br label %304
304: ; preds = %278
%305 = load i32, i32* %9
%306 = add nsw i32 %305, -1
store i32 %306, i32* %9
br label %248
307: ; preds = %248
store i32 1, i32* %4
br label %308
308: ; preds = %307, %180
%309 = load i32, i32* %4
ret i32 %309
}

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