int ruinv(double *a, int n) {
  int j;
  double fabs();
  double tt, z, *p, *q, *r, *s, *t;
  for (j = 0, tt = 0., p = a; j < n; ++j, p += n + 1)
    if ((z = fabs(*p)) > tt)
      tt = z;
  tt *= 1.e-16;
  for (j = 0, p = a; j < n; ++j, p += n + 1) {
    if (fabs(*p) < tt)
      return -1;
    *p = 1. / *p;
    for (q = a + j, t = a; q < p; t += n + 1, q += n) {
      for (s = q, r = t, z = 0.; s < p; s += n)
        z -= *s * *r++;
      *q = z * *p;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<ruinv>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1186 <ruinv+0x86>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
movaps 0xed3(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
ucomisd -0x20(%rbp),%xmm0
jbe    115b <ruinv+0x5b>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1160 <ruinv+0x60>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    1122 <ruinv+0x22>
movsd  0xe72(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1318 <ruinv+0x218>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm1
movaps 0xe4e(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11e1 <ruinv+0xe1>
movl   $0xffffffff,-0x4(%rbp)
jmp    131f <ruinv+0x21f>
mov    -0x30(%rbp),%rax
movsd  0xe1b(%rip),%xmm0
divsd  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x30(%rbp),%rax
jae    12ed <ruinv+0x1ed>
mov    -0x38(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x30(%rbp),%rax
jae    12a6 <ruinv+0x1a6>
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x40(%rbp)
movsd  (%rax),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
jmp    123a <ruinv+0x13a>
movsd  -0x28(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
mov    -0x50(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x38(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
jmp    1214 <ruinv+0x114>
jmp    12f2 <ruinv+0x1f2>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    11a7 <ruinv+0xa7>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ruinv>:
push   %r14
push   %rbx
xor    %eax,%eax
test   %esi,%esi
jle    1297 <ruinv+0x197>
lea    0x1(%rsi),%r8d
lea    -0x1(%rsi),%ecx
mov    %esi,%r10d
and    $0x3,%r10d
cmp    $0x3,%ecx
jae    1129 <ruinv+0x29>
xorpd  %xmm1,%xmm1
mov    %rdi,%rcx
jmp    119b <ruinv+0x9b>
mov    %esi,%r11d
and    $0xfffffffc,%r11d
mov    %r8,%r9
shl    $0x5,%r9
lea    0x0(,%r8,8),%rdx
xorpd  %xmm1,%xmm1
movapd 0xeb5(%rip),%xmm0
mov    %rdi,%rbx
xchg   %ax,%ax
mov    %rbx,%rcx
movsd  (%rbx),%xmm2
andpd  %xmm0,%xmm2
maxsd  %xmm1,%xmm2
add    %rdx,%rbx
movsd  (%rcx,%rdx,1),%xmm1
andpd  %xmm0,%xmm1
maxsd  %xmm2,%xmm1
movsd  (%rdx,%rbx,1),%xmm2
add    %rdx,%rbx
andpd  %xmm0,%xmm2
maxsd  %xmm1,%xmm2
movsd  (%rdx,%rbx,1),%xmm1
add    %rdx,%rbx
andpd  %xmm0,%xmm1
maxsd  %xmm2,%xmm1
add    %rdx,%rbx
add    $0xfffffffc,%r11d
jne    1150 <ruinv+0x50>
add    %r9,%rcx
movapd %xmm1,%xmm0
test   %r10d,%r10d
je     11d9 <ruinv+0xd9>
lea    0x0(,%r8,8),%rdx
movapd 0xe4c(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rcx),%xmm0
andpd  %xmm2,%xmm0
maxsd  %xmm1,%xmm0
add    %rdx,%rcx
movapd %xmm0,%xmm1
add    $0xffffffff,%r10d
jne    11c0 <ruinv+0xc0>
test   %esi,%esi
jle    1297 <ruinv+0x197>
mulsd  0xe27(%rip),%xmm0
mov    %esi,%r9d
lea    0x0(,%r9,8),%rdx
xor    %r11d,%r11d
movapd 0xe01(%rip),%xmm1
movsd  0xe11(%rip),%xmm2
mov    %rdi,%r10
mov    %rdi,%rax
jmp    1221 <ruinv+0x121>
nop
add    $0x1,%r11
lea    (%rax,%r8,8),%rax
add    $0x8,%r10
cmp    %r9,%r11
je     128e <ruinv+0x18e>
movsd  (%rax),%xmm3
movapd %xmm3,%xmm4
andpd  %xmm1,%xmm4
ucomisd %xmm4,%xmm0
ja     1292 <ruinv+0x192>
movapd %xmm2,%xmm4
divsd  %xmm3,%xmm4
movsd  %xmm4,(%rax)
lea    (%rdi,%r11,8),%rcx
cmp    %rax,%rcx
jae    1210 <ruinv+0x110>
mov    %r10,%rsi
mov    %rdi,%r14
xchg   %ax,%ax
xorpd  %xmm3,%xmm3
mov    %rsi,%rbx
mov    %r14,%rcx
nopw   0x0(%rax,%rax,1)
movsd  (%rbx),%xmm4
mulsd  (%rcx),%xmm4
add    $0x8,%rcx
subsd  %xmm4,%xmm3
add    %rdx,%rbx
cmp    %rax,%rbx
jb     1260 <ruinv+0x160>
mulsd  (%rax),%xmm3
movsd  %xmm3,(%rsi)
lea    (%r14,%r8,8),%r14
add    %rdx,%rsi
cmp    %rax,%rsi
jb     1250 <ruinv+0x150>
jmp    1210 <ruinv+0x110>
xor    %eax,%eax
jmp    1297 <ruinv+0x197>
mov    $0xffffffff,%eax
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define i32 @ruinv(double* %0, i32 %1) {
%3 = alloca i32
%4 = alloca double*
%5 = alloca i32
%6 = alloca i32
%7 = alloca double
%8 = alloca double
%9 = alloca double*
%10 = alloca double*
%11 = alloca double*
%12 = alloca double*
%13 = alloca double*
store double* %0, double** %4
store i32 %1, i32* %5
store i32 0, i32* %6
store double 0.000000e+00, double* %7
%14 = load double*, double** %4
store double* %14, double** %9
br label %15
15: ; preds = %28, %2
%16 = load i32, i32* %6
%17 = load i32, i32* %5
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %36
19: ; preds = %15
%20 = load double*, double** %9
%21 = load double, double* %20
%22 = call double @llvm.fabs.f64(double %21)
store double %22, double* %8
%23 = load double, double* %7
%24 = fcmp ogt double %22, %23
br i1 %24, label %25, label %27
25: ; preds = %19
%26 = load double, double* %8
store double %26, double* %7
br label %27
27: ; preds = %25, %19
br label %28
28: ; preds = %27
%29 = load i32, i32* %6
%30 = add nsw i32 %29, 1
store i32 %30, i32* %6
%31 = load i32, i32* %5
%32 = add nsw i32 %31, 1
%33 = load double*, double** %9
%34 = sext i32 %32 to i64
%35 = getelementptr inbounds double, double* %33, i64 %34
store double* %35, double** %9
br label %15
36: ; preds = %15
%37 = load double, double* %7
%38 = fmul double %37, 0x3C9CD2B297D889BC
store double %38, double* %7
store i32 0, i32* %6
%39 = load double*, double** %4
store double* %39, double** %9
br label %40
40: ; preds = %103, %36
%41 = load i32, i32* %6
%42 = load i32, i32* %5
%43 = icmp slt i32 %41, %42
br i1 %43, label %44, label %111
44: ; preds = %40
%45 = load double*, double** %9
%46 = load double, double* %45
%47 = call double @llvm.fabs.f64(double %46)
%48 = load double, double* %7
%49 = fcmp olt double %47, %48
br i1 %49, label %50, label %51
50: ; preds = %44
store i32 -1, i32* %3
br label %112
51: ; preds = %44
%52 = load double*, double** %9
%53 = load double, double* %52
%54 = fdiv double 1.000000e+00, %53
%55 = load double*, double** %9
store double %54, double* %55
%56 = load double*, double** %4
%57 = load i32, i32* %6
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds double, double* %56, i64 %58
store double* %59, double** %10
%60 = load double*, double** %4
store double* %60, double** %13
br label %61
61: ; preds = %92, %51
%62 = load double*, double** %10
%63 = load double*, double** %9
%64 = icmp ult double* %62, %63
br i1 %64, label %65, label %102
65: ; preds = %61
%66 = load double*, double** %10
store double* %66, double** %12
%67 = load double*, double** %13
store double* %67, double** %11
store double 0.000000e+00, double* %8
br label %68
68: ; preds = %81, %65
%69 = load double*, double** %12
%70 = load double*, double** %9
%71 = icmp ult double* %69, %70
br i1 %71, label %72, label %86
72: ; preds = %68
%73 = load double*, double** %12
%74 = load double, double* %73
%75 = load double*, double** %11
%76 = getelementptr inbounds double, double* %75, i32 1
store double* %76, double** %11
%77 = load double, double* %75
%78 = load double, double* %8
%79 = fneg double %74
%80 = call double @llvm.fmuladd.f64(double %79, double %77, double %78)
store double %80, double* %8
br label %81
81: ; preds = %72
%82 = load i32, i32* %5
%83 = load double*, double** %12
%84 = sext i32 %82 to i64
%85 = getelementptr inbounds double, double* %83, i64 %84
store double* %85, double** %12
br label %68
86: ; preds = %68
%87 = load double, double* %8
%88 = load double*, double** %9
%89 = load double, double* %88
%90 = fmul double %87, %89
%91 = load double*, double** %10
store double %90, double* %91
br label %92
92: ; preds = %86
%93 = load i32, i32* %5
%94 = add nsw i32 %93, 1
%95 = load double*, double** %13
%96 = sext i32 %94 to i64
%97 = getelementptr inbounds double, double* %95, i64 %96
store double* %97, double** %13
%98 = load i32, i32* %5
%99 = load double*, double** %10
%100 = sext i32 %98 to i64
%101 = getelementptr inbounds double, double* %99, i64 %100
store double* %101, double** %10
br label %61
102: ; preds = %61
br label %103
103: ; preds = %102
%104 = load i32, i32* %6
%105 = add nsw i32 %104, 1
store i32 %105, i32* %6
%106 = load i32, i32* %5
%107 = add nsw i32 %106, 1
%108 = load double*, double** %9
%109 = sext i32 %107 to i64
%110 = getelementptr inbounds double, double* %108, i64 %109
store double* %110, double** %9
br label %40
111: ; preds = %40
store i32 0, i32* %3
br label %112
112: ; preds = %111, %50
%113 = load i32, i32* %3
ret i32 %113
}

LLVM IR (-O2):
define i32 @ruinv(double* %0, i32 %1) {
%3 = icmp sgt i32 %1, 0
br i1 %3, label %4, label %96
4: ; preds = %2
%5 = add nuw nsw i32 %1, 1
%6 = zext i32 %5 to i64
%7 = add i32 %1, -1
%8 = and i32 %1, 3
%9 = icmp ult i32 %7, 3
br i1 %9, label %38, label %10
10: ; preds = %4
%11 = and i32 %1, -4
br label %12
12: ; preds = %12, %10
%13 = phi double* [ %0, %10 ], [ %35, %12 ]
%14 = phi double [ 0.000000e+00, %10 ], [ %34, %12 ]
%15 = phi i32 [ 0, %10 ], [ %36, %12 ]
%16 = load double, double* %13
%17 = tail call double @llvm.fabs.f64(double %16)
%18 = fcmp ogt double %17, %14
%19 = select i1 %18, double %17, double %14
%20 = getelementptr inbounds double, double* %13, i64 %6
%21 = load double, double* %20
%22 = tail call double @llvm.fabs.f64(double %21)
%23 = fcmp ogt double %22, %19
%24 = select i1 %23, double %22, double %19
%25 = getelementptr inbounds double, double* %20, i64 %6
%26 = load double, double* %25
%27 = tail call double @llvm.fabs.f64(double %26)
%28 = fcmp ogt double %27, %24
%29 = select i1 %28, double %27, double %24
%30 = getelementptr inbounds double, double* %25, i64 %6
%31 = load double, double* %30
%32 = tail call double @llvm.fabs.f64(double %31)
%33 = fcmp ogt double %32, %29
%34 = select i1 %33, double %32, double %29
%35 = getelementptr inbounds double, double* %30, i64 %6
%36 = add i32 %15, 4
%37 = icmp eq i32 %36, %11
br i1 %37, label %38, label %12
38: ; preds = %12, %4
%39 = phi double [ undef, %4 ], [ %34, %12 ]
%40 = phi double* [ %0, %4 ], [ %35, %12 ]
%41 = phi double [ 0.000000e+00, %4 ], [ %34, %12 ]
%42 = icmp eq i32 %8, 0
br i1 %42, label %54, label %43
43: ; preds = %38, %43
%44 = phi double* [ %51, %43 ], [ %40, %38 ]
%45 = phi double [ %50, %43 ], [ %41, %38 ]
%46 = phi i32 [ %52, %43 ], [ 0, %38 ]
%47 = load double, double* %44
%48 = tail call double @llvm.fabs.f64(double %47)
%49 = fcmp ogt double %48, %45
%50 = select i1 %49, double %48, double %45
%51 = getelementptr inbounds double, double* %44, i64 %6
%52 = add i32 %46, 1
%53 = icmp eq i32 %52, %8
br i1 %53, label %54, label %43
54: ; preds = %43, %38
%55 = phi double [ %39, %38 ], [ %50, %43 ]
%56 = fmul double %55, 0x3C9CD2B297D889BC
br i1 %3, label %57, label %96
57: ; preds = %54
%58 = zext i32 %1 to i64
%59 = add nuw nsw i32 %1, 1
%60 = zext i32 %59 to i64
%61 = zext i32 %1 to i64
br label %62
62: ; preds = %57, %92
%63 = phi i64 [ 0, %57 ], [ %93, %92 ]
%64 = phi double* [ %0, %57 ], [ %94, %92 ]
%65 = load double, double* %64
%66 = tail call double @llvm.fabs.f64(double %65)
%67 = fcmp olt double %66, %56
br i1 %67, label %96, label %68
68: ; preds = %62
%69 = fdiv double 1.000000e+00, %65
store double %69, double* %64
%70 = getelementptr inbounds double, double* %0, i64 %63
%71 = icmp ult double* %70, %64
br i1 %71, label %72, label %92
72: ; preds = %68, %86
%73 = phi double* [ %89, %86 ], [ %0, %68 ]
%74 = phi double* [ %90, %86 ], [ %70, %68 ]
br label %75
75: ; preds = %72, %75
%76 = phi double* [ %84, %75 ], [ %74, %72 ]
%77 = phi double* [ %80, %75 ], [ %73, %72 ]
%78 = phi double [ %83, %75 ], [ 0.000000e+00, %72 ]
%79 = load double, double* %76
%80 = getelementptr inbounds double, double* %77, i64 1
%81 = load double, double* %77
%82 = fneg double %79
%83 = tail call double @llvm.fmuladd.f64(double %82, double %81, double %78)
%84 = getelementptr inbounds double, double* %76, i64 %58
%85 = icmp ult double* %84, %64
br i1 %85, label %75, label %86
86: ; preds = %75
%87 = load double, double* %64
%88 = fmul double %83, %87
store double %88, double* %74
%89 = getelementptr inbounds double, double* %73, i64 %60
%90 = getelementptr inbounds double, double* %74, i64 %58
%91 = icmp ult double* %90, %64
br i1 %91, label %72, label %92
92: ; preds = %86, %68
%93 = add nuw nsw i64 %63, 1
%94 = getelementptr inbounds double, double* %64, i64 %60
%95 = icmp eq i64 %93, %61
br i1 %95, label %96, label %62
96: ; preds = %62, %92, %2, %54
%97 = phi i32 [ 0, %54 ], [ 0, %2 ], [ 0, %92 ], [ -1, %62 ]
ret i32 %97
}