#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int fabs(double);
void gauss_seidel(double **m, double *r, double *s, int n, int imax,
                  double es) {
  int i, j, iter, cent;
  double sum, dummy, ea, old, lambda = 1;
  for (i = 0; i <= n - 1; i++) {
    dummy = m[i][i];
    for (j = 0; j <= n - 1; j++) {
      m[i][j] = m[i][j] / dummy;
    }
    r[i] = r[i] / dummy;
  }
  for (i = 0; i <= n - 1; i++) {
    sum = r[i];
    for (j = 0; j <= n - 1; j++) {
      if (i != j)
        sum = sum - m[i][j] * s[j];
    }
    s[i] = sum;
  }
  iter = 1;
  cent = 1;
  do {
    for (i = 0; i <= n - 1; i++) {
      old = s[i];
      sum = r[i];
      for (j = 0; j <= n - 1; j++) {
        if (i != j)
          sum = sum - m[i][j] * s[j];
      }
      s[i] = lambda * sum + (1 - lambda) * old;
      if (cent == 1 && s[0] != 0)
        ea = fabs((s[i] - old) / s[i]) * 100;
      if (ea >= es)
        cent = 0;
    }
    iter += 1;
  } while (cent == 0 && iter <= imax);
}


x86 assembly (clang, -O0):
<gauss_seidel>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
movsd  %xmm0,-0x28(%rbp)
movsd  0xec8(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     11f1 <gauss_seidel+0xe1>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     11c4 <gauss_seidel+0xb4>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  -0x48(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1176 <gauss_seidel+0x66>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1144 <gauss_seidel+0x34>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     12bd <gauss_seidel+0x1ad>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     129d <gauss_seidel+0x18d>
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
je     128a <gauss_seidel+0x17a>
movsd  -0x40(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    128f <gauss_seidel+0x17f>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1222 <gauss_seidel+0x112>
movsd  -0x40(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11f8 <gauss_seidel+0xe8>
movl   $0x1,-0x34(%rbp)
movl   $0x1,-0x38(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     143e <gauss_seidel+0x32e>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     1389 <gauss_seidel+0x279>
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
je     1376 <gauss_seidel+0x266>
movsd  -0x40(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    137b <gauss_seidel+0x26b>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    130e <gauss_seidel+0x1fe>
movsd  -0x60(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  0xc65(%rip),%xmm1
subsd  -0x60(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
cmpl   $0x1,-0x38(%rbp)
jne    1414 <gauss_seidel+0x304>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13e4 <gauss_seidel+0x2d4>
jp     13e4 <gauss_seidel+0x2d4>
jmp    1414 <gauss_seidel+0x304>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm0
call   1030 <fabs@plt>
imul   $0x64,%eax,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
ucomisd -0x28(%rbp),%xmm0
jb     142b <gauss_seidel+0x31b>
movl   $0x0,-0x38(%rbp)
jmp    1430 <gauss_seidel+0x320>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12d2 <gauss_seidel+0x1c2>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x38(%rbp)
mov    %al,-0x61(%rbp)
jne    1462 <gauss_seidel+0x352>
mov    -0x34(%rbp),%eax
cmp    -0x20(%rbp),%eax
setle  %al
mov    %al,-0x61(%rbp)
mov    -0x61(%rbp),%al
test   $0x1,%al
jne    12cb <gauss_seidel+0x1bb>
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gauss_seidel>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
movapd %xmm0,%xmm4
mov    %r8d,0xc(%rsp)
mov    %rdx,%rbx
mov    %rdi,%rbp
mov    %ecx,%r11d
test   %ecx,%ecx
mov    %r11,(%rsp)
jle    130f <gauss_seidel+0x1ff>
and    $0xfffffffe,%r11d
lea    -0x2(%r11),%r9
mov    %r9,%r10
shr    %r10
add    $0x1,%r10
mov    %r10,%r8
and    $0xfffffffffffffffe,%r8
xor    %r14d,%r14d
jmp    117d <gauss_seidel+0x6d>
nopw   0x0(%rax,%rax,1)
movsd  (%rsi,%r14,8),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%r14,8)
add    $0x1,%r14
cmp    %rax,%r14
je     1236 <gauss_seidel+0x126>
mov    0x0(%rbp,%r14,8),%rdi
movsd  (%rdi,%r14,8),%xmm0
cmp    $0x2,%ecx
jae    11a0 <gauss_seidel+0x90>
xor    %edx,%edx
mov    (%rsp),%rax
jmp    1210 <gauss_seidel+0x100>
cs nopw 0x0(%rax,%rax,1)
nop
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
test   %r9,%r9
je     122c <gauss_seidel+0x11c>
mov    %r8,%rdx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movupd (%rdi,%rax,8),%xmm2
movupd 0x10(%rdi,%rax,8),%xmm3
divpd  %xmm1,%xmm2
movupd %xmm2,(%rdi,%rax,8)
divpd  %xmm1,%xmm3
movupd %xmm3,0x10(%rdi,%rax,8)
add    $0x4,%rax
add    $0xfffffffffffffffe,%rdx
jne    11c0 <gauss_seidel+0xb0>
test   $0x1,%r10b
je     11fc <gauss_seidel+0xec>
movupd (%rdi,%rax,8),%xmm2
divpd  %xmm1,%xmm2
movupd %xmm2,(%rdi,%rax,8)
mov    %r11,%rdx
mov    (%rsp),%rax
cmp    %rax,%r11
je     1160 <gauss_seidel+0x50>
nopl   0x0(%rax)
movsd  (%rdi,%rdx,8),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rdi,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%rax
jne    1210 <gauss_seidel+0x100>
jmp    1160 <gauss_seidel+0x50>
xor    %eax,%eax
test   $0x1,%r10b
jne    11ee <gauss_seidel+0xde>
jmp    11fc <gauss_seidel+0xec>
test   %ecx,%ecx
mov    (%rsp),%r11
jle    130f <gauss_seidel+0x1ff>
mov    %r11d,%r8d
and    $0xfffffffe,%r8d
xor    %r9d,%r9d
jmp    1263 <gauss_seidel+0x153>
xchg   %ax,%ax
movsd  %xmm0,(%rbx,%r9,8)
add    $0x1,%r9
cmp    %r11,%r9
je     130f <gauss_seidel+0x1ff>
movsd  (%rsi,%r9,8),%xmm0
cmp    $0x1,%ecx
jne    1280 <gauss_seidel+0x170>
xor    %eax,%eax
test   $0x1,%r11b
je     1250 <gauss_seidel+0x140>
jmp    12ee <gauss_seidel+0x1de>
nopl   0x0(%rax,%rax,1)
xor    %edx,%edx
jmp    1299 <gauss_seidel+0x189>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rdx
cmp    %r8,%rdx
je     12e0 <gauss_seidel+0x1d0>
mov    %rdx,%rax
cmp    %rdx,%r9
je     12b4 <gauss_seidel+0x1a4>
mov    0x0(%rbp,%r9,8),%rdx
movsd  (%rdx,%rax,8),%xmm1
mulsd  (%rbx,%rax,8),%xmm1
subsd  %xmm1,%xmm0
lea    0x1(%rax),%rdx
cmp    %rdx,%r9
je     1290 <gauss_seidel+0x180>
mov    0x0(%rbp,%r9,8),%rdi
movsd  0x8(%rdi,%rax,8),%xmm1
mulsd  0x8(%rbx,%rax,8),%xmm1
subsd  %xmm1,%xmm0
jmp    1290 <gauss_seidel+0x180>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x2,%rax
test   $0x1,%r11b
je     1250 <gauss_seidel+0x140>
cmp    %rax,%r9
je     1250 <gauss_seidel+0x140>
mov    0x0(%rbp,%r9,8),%rdx
movsd  (%rdx,%rax,8),%xmm1
mulsd  (%rbx,%rax,8),%xmm1
subsd  %xmm1,%xmm0
jmp    1250 <gauss_seidel+0x140>
mov    %r11d,%r13d
and    $0xfffffffe,%r13d
mov    $0x1,%r15d
xor    %r8d,%r8d
xorpd  %xmm5,%xmm5
mov    $0x1,%eax
movsd  %xmm4,0x20(%rsp)
mov    %rsi,0x18(%rsp)
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
test   %ecx,%ecx
mov    %rax,0x10(%rsp)
jle    1480 <gauss_seidel+0x370>
xor    %r12d,%r12d
jmp    1375 <gauss_seidel+0x265>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
ucomisd %xmm4,%xmm0
cmovae %r8d,%r15d
add    $0x1,%r12
cmp    %r11,%r12
je     1480 <gauss_seidel+0x370>
movsd  (%rsi,%r12,8),%xmm1
cmp    $0x1,%ecx
jne    1390 <gauss_seidel+0x280>
xor    %eax,%eax
test   $0x1,%r11b
jne    13fa <gauss_seidel+0x2ea>
jmp    1412 <gauss_seidel+0x302>
nopl   (%rax)
xor    %edi,%edi
jmp    13a9 <gauss_seidel+0x299>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rdi
cmp    %r13,%rdi
je     13f0 <gauss_seidel+0x2e0>
mov    %rdi,%rax
cmp    %rdi,%r12
je     13c4 <gauss_seidel+0x2b4>
mov    0x0(%rbp,%r12,8),%rdx
movsd  (%rdx,%rax,8),%xmm2
mulsd  (%rbx,%rax,8),%xmm2
subsd  %xmm2,%xmm1
lea    0x1(%rax),%rdi
cmp    %rdi,%r12
je     13a0 <gauss_seidel+0x290>
mov    0x0(%rbp,%r12,8),%rdx
movsd  0x8(%rdx,%rax,8),%xmm2
mulsd  0x8(%rbx,%rax,8),%xmm2
subsd  %xmm2,%xmm1
jmp    13a0 <gauss_seidel+0x290>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x2,%rax
test   $0x1,%r11b
je     1412 <gauss_seidel+0x302>
cmp    %rax,%r12
je     1412 <gauss_seidel+0x302>
mov    0x0(%rbp,%r12,8),%rdx
movsd  (%rdx,%rax,8),%xmm2
mulsd  (%rbx,%rax,8),%xmm2
subsd  %xmm2,%xmm1
movsd  (%rbx,%r12,8),%xmm3
movapd %xmm3,%xmm2
mulsd  %xmm5,%xmm2
addsd  %xmm1,%xmm2
movsd  %xmm2,(%rbx,%r12,8)
cmp    $0x1,%r15d
jne    1360 <gauss_seidel+0x250>
movsd  (%rbx),%xmm1
ucomisd %xmm5,%xmm1
jne    1444 <gauss_seidel+0x334>
jnp    1360 <gauss_seidel+0x250>
movapd %xmm2,%xmm0
subsd  %xmm3,%xmm0
divsd  %xmm2,%xmm0
mov    %ecx,%r14d
call   1030 <fabs@plt>
xorpd  %xmm5,%xmm5
xor    %r8d,%r8d
mov    (%rsp),%r11
mov    %r14d,%ecx
mov    0x18(%rsp),%rsi
movsd  0x20(%rsp),%xmm4
imul   $0x64,%eax,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
jmp    1360 <gauss_seidel+0x250>
test   %r15d,%r15d
mov    0x10(%rsp),%rdx
jne    149a <gauss_seidel+0x38a>
lea    0x1(%rdx),%eax
xor    %r15d,%r15d
cmp    0xc(%rsp),%edx
jl     1340 <gauss_seidel+0x230>
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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