float detrm(float a[25][25], float k) {
  float s = 1, det = 0, b[25][25];
  int i, j, m, n, c;
  if (k == 1) {
    return (a[0][0]);
  } else {
    det = 0;
    for (c = 0; c < k; c++) {
      m = 0;
      n = 0;
      for (i = 0; i < k; i++) {
        for (j = 0; j < k; j++) {
          b[i][j] = 0;
          if (i != 0 && j != c) {
            b[m][n] = a[i][j];
            if (n < (k - 2))
              n++;
            else {
              n = 0;
              m++;
            }
          }
        }
      }
      det = det + s * (a[0][c] * detrm(b, k - 1));
      s = -1 * s;
    }
  }
  return (det);
}


x86 assembly (clang, -O0):
<detrm>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa00,%rsp
mov    %rdi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  0xed4(%rip),%xmm0
movss  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x14(%rbp),%xmm0
movss  0xeba(%rip),%xmm1
ucomiss %xmm1,%xmm0
jne    1167 <detrm+0x57>
jp     1167 <detrm+0x57>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    139b <detrm+0x28b>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movl   $0x0,-0x9f4(%rbp)
cvtsi2ssl -0x9f4(%rbp),%xmm1
ff
movss  -0x14(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    138c <detrm+0x27c>
movl   $0x0,-0x9ec(%rbp)
movl   $0x0,-0x9f0(%rbp)
movl   $0x0,-0x9e4(%rbp)
cvtsi2ssl -0x9e4(%rbp),%xmm1
ff
movss  -0x14(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12eb <detrm+0x1db>
movl   $0x0,-0x9e8(%rbp)
cvtsi2ssl -0x9e8(%rbp),%xmm1
ff
movss  -0x14(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12d2 <detrm+0x1c2>
movslq -0x9e4(%rbp),%rcx
lea    -0x9e0(%rbp),%rax
imul   $0x64,%rcx,%rcx
add    %rcx,%rax
movslq -0x9e8(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
cmpl   $0x0,-0x9e4(%rbp)
je     12b9 <detrm+0x1a9>
mov    -0x9e8(%rbp),%eax
cmp    -0x9f4(%rbp),%eax
je     12b9 <detrm+0x1a9>
mov    -0x10(%rbp),%rax
movslq -0x9e4(%rbp),%rcx
imul   $0x64,%rcx,%rcx
add    %rcx,%rax
movslq -0x9e8(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movslq -0x9ec(%rbp),%rcx
lea    -0x9e0(%rbp),%rax
imul   $0x64,%rcx,%rcx
add    %rcx,%rax
movslq -0x9f0(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
cvtsi2ssl -0x9f0(%rbp),%xmm1
ff
movss  -0x14(%rbp),%xmm0
movss  0xd8e(%rip),%xmm2
subss  %xmm2,%xmm0
ucomiss %xmm1,%xmm0
jbe    129b <detrm+0x18b>
mov    -0x9f0(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x9f0(%rbp)
jmp    12b4 <detrm+0x1a4>
movl   $0x0,-0x9f0(%rbp)
mov    -0x9ec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x9ec(%rbp)
jmp    12b9 <detrm+0x1a9>
jmp    12be <detrm+0x1ae>
mov    -0x9e8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x9e8(%rbp)
jmp    11cd <detrm+0xbd>
jmp    12d7 <detrm+0x1c7>
mov    -0x9e4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x9e4(%rbp)
jmp    11ad <detrm+0x9d>
movss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x9fc(%rbp)
ff
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x9f8(%rbp)
ff
mov    -0x10(%rbp),%rax
movslq -0x9f4(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0xa00(%rbp)
ff
lea    -0x9e0(%rbp),%rdi
movss  -0x14(%rbp),%xmm0
movss  0xccf(%rip),%xmm1
subss  %xmm1,%xmm0
call   1030 <detrm@plt>
movss  -0xa00(%rbp),%xmm2
ff
movss  -0x9fc(%rbp),%xmm1
ff
movaps %xmm0,%xmm3
movss  -0x9f8(%rbp),%xmm0
ff
mulss  %xmm3,%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  0xc96(%rip),%xmm0
mulss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x9f4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x9f4(%rbp)
jmp    1179 <detrm+0x69>
jmp    1391 <detrm+0x281>
movss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0xa00,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<detrm>:
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x9f8,%rsp
mov    %rdi,%r15
ucomiss 0xed8(%rip),%xmm0
jne    1136 <detrm+0x26>
jp     1136 <detrm+0x26>
movss  (%r15),%xmm0
jmp    1284 <detrm+0x174>
movaps %xmm0,%xmm2
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm2
jbe    1284 <detrm+0x174>
movss  0xeb7(%rip),%xmm3
addss  %xmm2,%xmm3
movss  0xeaf(%rip),%xmm0
addss  %xmm2,%xmm0
movss  %xmm0,0xc(%rsp)
movss  0xe95(%rip),%xmm4
xorps  %xmm0,%xmm0
xor    %r12d,%r12d
lea    0x30(%rsp),%r14
movss  %xmm2,0x14(%rsp)
movss  %xmm3,0x10(%rsp)
jmp    11ee <detrm+0xde>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movss  (%r15,%r12,4),%xmm0
movss  %xmm0,0x18(%rsp)
mov    %r14,%rdi
movss  0xc(%rsp),%xmm0
call   1030 <detrm@plt>
movss  0x14(%rsp),%xmm2
mulss  0x18(%rsp),%xmm0
movaps 0x20(%rsp),%xmm4
mulss  %xmm4,%xmm0
add    $0x1,%r12
xorps  %xmm1,%xmm1
cvtsi2ss %r12d,%xmm1
movss  0x1c(%rsp),%xmm3
addss  %xmm0,%xmm3
movaps %xmm3,%xmm0
movss  0x10(%rsp),%xmm3
xorps  0xe2b(%rip),%xmm4
ucomiss %xmm1,%xmm2
jbe    1284 <detrm+0x174>
movaps %xmm4,0x20(%rsp)
movss  %xmm0,0x1c(%rsp)
mov    %r14,%rax
mov    %r15,%r8
xor    %edx,%edx
xor    %edi,%edi
xor    %r9d,%r9d
jmp    122c <detrm+0x11c>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rdx
xorps  %xmm0,%xmm0
cvtsi2ss %edx,%xmm0
add    $0x64,%r8
add    $0x64,%rax
ucomiss %xmm0,%xmm2
jbe    1190 <detrm+0x80>
xor    %ebx,%ebx
jmp    1246 <detrm+0x136>
add    $0x1,%r9d
xor    %edi,%edi
add    $0x1,%rbx
xorps  %xmm0,%xmm0
cvtsi2ss %ebx,%xmm0
ucomiss %xmm0,%xmm2
jbe    1210 <detrm+0x100>
movl   $0x0,(%rax,%rbx,4)
test   %rdx,%rdx
je     1236 <detrm+0x126>
cmp    %rbx,%r12
je     1236 <detrm+0x126>
movss  (%r8,%rbx,4),%xmm0
movslq %r9d,%rcx
movslq %edi,%rsi
imul   $0x64,%rcx,%rcx
xorps  %xmm1,%xmm1
cvtsi2ss %esi,%xmm1
add    %rsp,%rcx
add    $0x30,%rcx
movss  %xmm0,(%rcx,%rsi,4)
ucomiss %xmm1,%xmm3
jbe    1230 <detrm+0x120>
add    $0x1,%edi
jmp    1236 <detrm+0x126>
add    $0x9f8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
define float @detrm([25 x float]* nocapture %0, float %1) {
%3 = alloca [25 x [25 x float]]
%4 = bitcast [25 x [25 x float]]* %3 to i8*
%5 = fcmp oeq float %1, 1.000000e+00
br i1 %5, label %12, label %6
6: ; preds = %2
%7 = fcmp ogt float %1, 0.000000e+00
br i1 %7, label %8, label %66
8: ; preds = %6
%9 = fadd float %1, -2.000000e+00
%10 = getelementptr inbounds [25 x [25 x float]], [25 x [25 x float]]* %3, i64 0, i64 0
%11 = fadd float %1, -1.000000e+00
br label %15
12: ; preds = %2
%13 = getelementptr inbounds [25 x float], [25 x float]* %0, i64 0, i64 0
%14 = load float, float* %13
br label %66
15: ; preds = %55, %8
%16 = phi i64 [ 0, %8 ], [ %62, %55 ]
%17 = phi float [ 0.000000e+00, %8 ], [ %60, %55 ]
%18 = phi float [ 1.000000e+00, %8 ], [ %61, %55 ]
br label %19
19: ; preds = %50, %15
%20 = phi i64 [ 0, %15 ], [ %51, %50 ]
%21 = phi i32 [ 0, %15 ], [ %45, %50 ]
%22 = phi i32 [ 0, %15 ], [ %44, %50 ]
%23 = icmp eq i64 %20, 0
br label %24
24: ; preds = %19, %43
%25 = phi i64 [ 0, %19 ], [ %46, %43 ]
%26 = phi i32 [ %21, %19 ], [ %45, %43 ]
%27 = phi i32 [ %22, %19 ], [ %44, %43 ]
%28 = getelementptr inbounds [25 x [25 x float]], [25 x [25 x float]]* %3, i64 0, i64 %20, i64 %25
store float 0.000000e+00, float* %28
%29 = icmp eq i64 %25, %16
%30 = select i1 %23, i1 true, i1 %29
br i1 %30, label %43, label %31
31: ; preds = %24
%32 = getelementptr inbounds [25 x float], [25 x float]* %0, i64 %20, i64 %25
%33 = load float, float* %32
%34 = sext i32 %27 to i64
%35 = sext i32 %26 to i64
%36 = getelementptr inbounds [25 x [25 x float]], [25 x [25 x float]]* %3, i64 0, i64 %34, i64 %35
store float %33, float* %36
%37 = sitofp i32 %26 to float
%38 = fcmp ogt float %9, %37
br i1 %38, label %39, label %41
39: ; preds = %31
%40 = add nsw i32 %26, 1
br label %43
41: ; preds = %31
%42 = add nsw i32 %27, 1
br label %43
43: ; preds = %24, %41, %39
%44 = phi i32 [ %27, %39 ], [ %42, %41 ], [ %27, %24 ]
%45 = phi i32 [ %40, %39 ], [ 0, %41 ], [ %26, %24 ]
%46 = add nuw i64 %25, 1
%47 = trunc i64 %46 to i32
%48 = sitofp i32 %47 to float
%49 = fcmp olt float %48, %1
br i1 %49, label %24, label %50
50: ; preds = %43
%51 = add nuw i64 %20, 1
%52 = trunc i64 %51 to i32
%53 = sitofp i32 %52 to float
%54 = fcmp olt float %53, %1
br i1 %54, label %19, label %55
55: ; preds = %50
%56 = getelementptr inbounds [25 x float], [25 x float]* %0, i64 0, i64 %16
%57 = load float, float* %56
%58 = call float @detrm([25 x float]* %10, float %11)
%59 = fmul float %57, %58
%60 = tail call float @llvm.fmuladd.f32(float %18, float %59, float %17)
%61 = fneg float %18
%62 = add nuw i64 %16, 1
%63 = trunc i64 %62 to i32
%64 = sitofp i32 %63 to float
%65 = fcmp olt float %64, %1
br i1 %65, label %15, label %66
66: ; preds = %55, %6, %12
%67 = phi float [ %14, %12 ], [ 0.000000e+00, %6 ], [ %60, %55 ]
ret float %67
}