#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 sqrtf(double);
void mat4_getRotation(float *dst, float *mat) {
  float trace = mat[0] + mat[5] + mat[10];
  float S = 0;
  if (trace > 0) {
    S = sqrtf(trace + 1.0) * 2;
    dst[3] = 0.25 * S;
    dst[0] = (mat[6] - mat[9]) / S;
    dst[1] = (mat[8] - mat[2]) / S;
    dst[2] = (mat[1] - mat[4]) / S;
  } else if ((mat[0] > mat[5]) && (mat[0] > mat[10])) {
    S = sqrtf(1.0 + mat[0] - mat[5] - mat[10]) * 2;
    dst[3] = (mat[6] - mat[9]) / S;
    dst[0] = 0.25 * S;
    dst[1] = (mat[1] + mat[4]) / S;
    dst[2] = (mat[8] + mat[2]) / S;
  } else if (mat[5] > mat[10]) {
    S = sqrtf(1.0 + mat[5] - mat[0] - mat[10]) * 2;
    dst[3] = (mat[8] - mat[2]) / S;
    dst[0] = (mat[1] + mat[4]) / S;
    dst[1] = 0.25 * S;
    dst[2] = (mat[6] + mat[9]) / S;
  } else {
    S = sqrtf(1.0 + mat[10] - mat[0] - mat[5]) * 2;
    dst[3] = (mat[1] - mat[4]) / S;
    dst[0] = (mat[8] + mat[2]) / S;
    dst[1] = (mat[6] + mat[9]) / S;
    dst[2] = 0.25 * S;
  }
}


x86 assembly (clang, -O0):
<mat4_getRotation>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x14(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x28(%rax),%xmm0
movss  %xmm0,-0x14(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x14(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    1204 <mat4_getRotation+0xf4>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe9f(%rip),%xmm1
addsd  %xmm1,%xmm0
call   1030 <sqrtf@plt>
shl    $0x1,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe71(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x10(%rbp),%rax
movss  0x18(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x24(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x20(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x8(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x10(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
jmp    14bf <mat4_getRotation+0x3af>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0x14(%rax),%xmm0
jbe    1301 <mat4_getRotation+0x1f1>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0x28(%rax),%xmm0
jbe    1301 <mat4_getRotation+0x1f1>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdc4(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  0x28(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
call   1030 <sqrtf@plt>
shl    $0x1,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movss  0x18(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x24(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd54(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x10(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
movss  0x20(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x8(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
jmp    14ba <mat4_getRotation+0x3aa>
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0x28(%rax),%xmm0
jbe    13e9 <mat4_getRotation+0x2d9>
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xcdb(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  0x28(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
call   1030 <sqrtf@plt>
shl    $0x1,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movss  0x20(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x8(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x10(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc4d(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
movss  0x18(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x24(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
jmp    14b5 <mat4_getRotation+0x3a5>
mov    -0x10(%rbp),%rax
movss  0x28(%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc0a(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
call   1030 <sqrtf@plt>
shl    $0x1,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x10(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x10(%rbp),%rax
movss  0x20(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x8(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x18(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x24(%rax),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xb5c(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
jmp    14ba <mat4_getRotation+0x3aa>
jmp    14bf <mat4_getRotation+0x3af>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<mat4_getRotation>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %rdi,%r14
movss  (%rsi),%xmm3
movss  0x14(%rsi),%xmm1
movaps %xmm3,%xmm0
addss  %xmm1,%xmm0
movss  0x28(%rsi),%xmm2
addss  %xmm2,%xmm0
xorps  %xmm4,%xmm4
ucomiss %xmm4,%xmm0
jbe    11a1 <mat4_getRotation+0x91>
cvtss2sd %xmm0,%xmm0
addsd  0xeb9(%rip),%xmm0
call   1030 <sqrtf@plt>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
movss  0xeab(%rip),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,0xc(%r14)
movss  0x18(%rbx),%xmm0
subss  0x24(%rbx),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,(%r14)
movss  0x20(%rbx),%xmm0
subss  0x8(%rbx),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,0x4(%r14)
movss  0x4(%rbx),%xmm0
subss  0x10(%rbx),%xmm0
divss  %xmm1,%xmm0
jmp    131f <mat4_getRotation+0x20f>
ucomiss %xmm1,%xmm3
jbe    122b <mat4_getRotation+0x11b>
ucomiss %xmm2,%xmm3
jbe    122b <mat4_getRotation+0x11b>
xorps  %xmm0,%xmm0
cvtss2sd %xmm3,%xmm0
addsd  0xe42(%rip),%xmm0
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
subsd  %xmm1,%xmm0
call   1030 <sqrtf@plt>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
movss  0x18(%rbx),%xmm0
subss  0x24(%rbx),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,0xc(%r14)
movss  0xe0d(%rip),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,(%r14)
movss  0x4(%rbx),%xmm0
addss  0x10(%rbx),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,0x4(%r14)
movss  0x20(%rbx),%xmm0
addss  0x8(%rbx),%xmm0
divss  %xmm1,%xmm0
jmp    131f <mat4_getRotation+0x20f>
ucomiss %xmm2,%xmm1
jbe    12ac <mat4_getRotation+0x19c>
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
addsd  0xdc1(%rip),%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm3,%xmm1
subsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
subsd  %xmm1,%xmm0
call   1030 <sqrtf@plt>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
movss  0x20(%rbx),%xmm0
subss  0x8(%rbx),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,0xc(%r14)
movss  0x4(%rbx),%xmm0
addss  0x10(%rbx),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,(%r14)
movss  0xd76(%rip),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,0x4(%r14)
movss  0x18(%rbx),%xmm0
addss  0x24(%rbx),%xmm0
divss  %xmm1,%xmm0
jmp    131f <mat4_getRotation+0x20f>
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
addsd  0xd45(%rip),%xmm0
xorps  %xmm2,%xmm2
cvtss2sd %xmm3,%xmm2
subsd  %xmm2,%xmm0
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
call   1030 <sqrtf@plt>
add    %eax,%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  0x4(%rbx),%xmm1
subss  0x10(%rbx),%xmm1
divss  %xmm0,%xmm1
movss  %xmm1,0xc(%r14)
movss  0x20(%rbx),%xmm1
addss  0x8(%rbx),%xmm1
divss  %xmm0,%xmm1
movss  %xmm1,(%r14)
movss  0x18(%rbx),%xmm1
addss  0x24(%rbx),%xmm1
divss  %xmm0,%xmm1
movss  %xmm1,0x4(%r14)
mulss  0xce9(%rip),%xmm0
movss  %xmm0,0x8(%r14)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define void @mat4_getRotation(float* nocapture writeonly %0, float* %1) {
%3 = load float, float* %1
%4 = getelementptr inbounds float, float* %1, i64 5
%5 = load float, float* %4
%6 = fadd float %3, %5
%7 = getelementptr inbounds float, float* %1, i64 10
%8 = load float, float* %7
%9 = fadd float %6, %8
%10 = fcmp ogt float %9, 0.000000e+00
br i1 %10, label %11, label %38
11: ; preds = %2
%12 = fpext float %9 to double
%13 = fadd double %12, 1.000000e+00
%14 = tail call i32 @sqrtf(double %13)
%15 = shl nsw i32 %14, 1
%16 = sitofp i32 %15 to float
%17 = fmul float %16, 2.500000e-01
%18 = getelementptr inbounds float, float* %0, i64 3
store float %17, float* %18
%19 = getelementptr inbounds float, float* %1, i64 6
%20 = load float, float* %19
%21 = getelementptr inbounds float, float* %1, i64 9
%22 = load float, float* %21
%23 = fsub float %20, %22
%24 = fdiv float %23, %16
store float %24, float* %0
%25 = getelementptr inbounds float, float* %1, i64 8
%26 = load float, float* %25
%27 = getelementptr inbounds float, float* %1, i64 2
%28 = load float, float* %27
%29 = fsub float %26, %28
%30 = fdiv float %29, %16
%31 = getelementptr inbounds float, float* %0, i64 1
store float %30, float* %31
%32 = getelementptr inbounds float, float* %1, i64 1
%33 = load float, float* %32
%34 = getelementptr inbounds float, float* %1, i64 4
%35 = load float, float* %34
%36 = fsub float %33, %35
%37 = fdiv float %36, %16
br label %137
38: ; preds = %2
%39 = fcmp ogt float %3, %5
%40 = fcmp ogt float %3, %8
%41 = select i1 %39, i1 %40, i1 false
br i1 %41, label %42, label %73
42: ; preds = %38
%43 = fpext float %3 to double
%44 = fadd double %43, 1.000000e+00
%45 = fpext float %5 to double
%46 = fsub double %44, %45
%47 = fpext float %8 to double
%48 = fsub double %46, %47
%49 = tail call i32 @sqrtf(double %48)
%50 = shl nsw i32 %49, 1
%51 = sitofp i32 %50 to float
%52 = getelementptr inbounds float, float* %1, i64 6
%53 = load float, float* %52
%54 = getelementptr inbounds float, float* %1, i64 9
%55 = load float, float* %54
%56 = fsub float %53, %55
%57 = fdiv float %56, %51
%58 = getelementptr inbounds float, float* %0, i64 3
store float %57, float* %58
%59 = fmul float %51, 2.500000e-01
store float %59, float* %0
%60 = getelementptr inbounds float, float* %1, i64 1
%61 = load float, float* %60
%62 = getelementptr inbounds float, float* %1, i64 4
%63 = load float, float* %62
%64 = fadd float %61, %63
%65 = fdiv float %64, %51
%66 = getelementptr inbounds float, float* %0, i64 1
store float %65, float* %66
%67 = getelementptr inbounds float, float* %1, i64 8
%68 = load float, float* %67
%69 = getelementptr inbounds float, float* %1, i64 2
%70 = load float, float* %69
%71 = fadd float %68, %70
%72 = fdiv float %71, %51
br label %137
73: ; preds = %38
%74 = fcmp ogt float %5, %8
br i1 %74, label %75, label %106
75: ; preds = %73
%76 = fpext float %5 to double
%77 = fadd double %76, 1.000000e+00
%78 = fpext float %3 to double
%79 = fsub double %77, %78
%80 = fpext float %8 to double
%81 = fsub double %79, %80
%82 = tail call i32 @sqrtf(double %81)
%83 = shl nsw i32 %82, 1
%84 = sitofp i32 %83 to float
%85 = getelementptr inbounds float, float* %1, i64 8
%86 = load float, float* %85
%87 = getelementptr inbounds float, float* %1, i64 2
%88 = load float, float* %87
%89 = fsub float %86, %88
%90 = fdiv float %89, %84
%91 = getelementptr inbounds float, float* %0, i64 3
store float %90, float* %91
%92 = getelementptr inbounds float, float* %1, i64 1
%93 = load float, float* %92
%94 = getelementptr inbounds float, float* %1, i64 4
%95 = load float, float* %94
%96 = fadd float %93, %95
%97 = fdiv float %96, %84
store float %97, float* %0
%98 = fmul float %84, 2.500000e-01
%99 = getelementptr inbounds float, float* %0, i64 1
store float %98, float* %99
%100 = getelementptr inbounds float, float* %1, i64 6
%101 = load float, float* %100
%102 = getelementptr inbounds float, float* %1, i64 9
%103 = load float, float* %102
%104 = fadd float %101, %103
%105 = fdiv float %104, %84
br label %137
106: ; preds = %73
%107 = fpext float %8 to double
%108 = fadd double %107, 1.000000e+00
%109 = fpext float %3 to double
%110 = fsub double %108, %109
%111 = fpext float %5 to double
%112 = fsub double %110, %111
%113 = tail call i32 @sqrtf(double %112)
%114 = shl nsw i32 %113, 1
%115 = sitofp i32 %114 to float
%116 = getelementptr inbounds float, float* %1, i64 1
%117 = load float, float* %116
%118 = getelementptr inbounds float, float* %1, i64 4
%119 = load float, float* %118
%120 = fsub float %117, %119
%121 = fdiv float %120, %115
%122 = getelementptr inbounds float, float* %0, i64 3
store float %121, float* %122
%123 = getelementptr inbounds float, float* %1, i64 8
%124 = load float, float* %123
%125 = getelementptr inbounds float, float* %1, i64 2
%126 = load float, float* %125
%127 = fadd float %124, %126
%128 = fdiv float %127, %115
store float %128, float* %0
%129 = getelementptr inbounds float, float* %1, i64 6
%130 = load float, float* %129
%131 = getelementptr inbounds float, float* %1, i64 9
%132 = load float, float* %131
%133 = fadd float %130, %132
%134 = fdiv float %133, %115
%135 = getelementptr inbounds float, float* %0, i64 1
store float %134, float* %135
%136 = fmul float %115, 2.500000e-01
br label %137
137: ; preds = %42, %106, %75, %11
%138 = phi float [ %72, %42 ], [ %136, %106 ], [ %105, %75 ], [ %37, %11 ]
%139 = getelementptr inbounds float, float* %0, i64 2
store float %138, float* %139
ret void
}