#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 */
float sqrtf(float);
float *quat_from_mat4(float *result, float *m) {
  float sr;
  float half;
  float scale = m[0] + m[5] + m[10];
  if (scale > 0.0f) {
    sr = sqrtf(scale + 1.0f);
    result[3] = sr * 0.5f;
    sr = 0.5f / sr;
    result[0] = (m[9] - m[6]) * sr;
    result[1] = (m[2] - m[8]) * sr;
    result[2] = (m[4] - m[1]) * sr;
  } else if ((m[0] >= m[5]) && (m[0] >= m[10])) {
    sr = sqrtf(1.0f + m[0] - m[5] - m[10]);
    half = 0.5f / sr;
    result[0] = 0.5f * sr;
    result[1] = (m[4] + m[1]) * half;
    result[2] = (m[8] + m[2]) * half;
    result[3] = (m[9] - m[6]) * half;
  } else if (m[5] > m[10]) {
    sr = sqrtf(1.0f + m[5] - m[0] - m[10]);
    half = 0.5f / sr;
    result[0] = (m[1] + m[4]) * half;
    result[1] = 0.5f * sr;
    result[2] = (m[6] + m[9]) * half;
    result[3] = (m[2] - m[8]) * half;
  } else {
    sr = sqrtf(1.0f + m[10] - m[0] - m[5]);
    half = 0.5f / sr;
    result[0] = (m[2] + m[8]) * half;
    result[1] = (m[6] + m[9]) * half;
    result[2] = 0.5f * sr;
    result[3] = (m[4] - m[1]) * half;
  }
  return result;
}


x86 assembly (clang, -O0):
<quat_from_mat4>:
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,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    11f3 <quat_from_mat4+0xe3>
movss  0xeac(%rip),%xmm0
addss  -0x1c(%rbp),%xmm0
call   1030 <sqrtf@plt>
movss  %xmm0,-0x14(%rbp)
movss  0xe91(%rip),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
movss  0xe7b(%rip),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movss  0x24(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x18(%rax),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x20(%rax),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
movss  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x4(%rax),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
jmp    1463 <quat_from_mat4+0x353>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0x14(%rax),%xmm0
jb     12d7 <quat_from_mat4+0x1c7>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0x28(%rax),%xmm0
jb     12d7 <quat_from_mat4+0x1c7>
mov    -0x10(%rbp),%rax
movss  0xdd9(%rip),%xmm0
addss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x14(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x28(%rax),%xmm0
call   1030 <sqrtf@plt>
movss  %xmm0,-0x14(%rbp)
movss  0xdad(%rip),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  0xd9b(%rip),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x4(%rax),%xmm0
mulss  -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
mulss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movss  0x24(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x18(%rax),%xmm0
mulss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    145e <quat_from_mat4+0x34e>
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0x28(%rax),%xmm0
jbe    13a6 <quat_from_mat4+0x296>
mov    -0x10(%rbp),%rax
movss  0xd0a(%rip),%xmm0
addss  0x14(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x28(%rax),%xmm0
call   1030 <sqrtf@plt>
movss  %xmm0,-0x14(%rbp)
movss  0xcde(%rip),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x10(%rax),%xmm0
mulss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
movss  0xcad(%rip),%xmm0
mulss  -0x14(%rbp),%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
mulss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x20(%rax),%xmm0
mulss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1459 <quat_from_mat4+0x349>
mov    -0x10(%rbp),%rax
movss  0xc52(%rip),%xmm0
addss  0x28(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x14(%rax),%xmm0
call   1030 <sqrtf@plt>
movss  %xmm0,-0x14(%rbp)
movss  0xc26(%rip),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x20(%rax),%xmm0
mulss  -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
mulss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  0xbd5(%rip),%xmm0
mulss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movss  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x4(%rax),%xmm0
mulss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    145e <quat_from_mat4+0x34e>
jmp    1463 <quat_from_mat4+0x353>
mov    -0x8(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<quat_from_mat4>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %rdi,%r14
movss  (%rsi),%xmm1
movss  0x14(%rsi),%xmm0
movaps %xmm1,%xmm3
addss  %xmm0,%xmm3
movss  0x28(%rsi),%xmm2
addss  %xmm2,%xmm3
xorps  %xmm4,%xmm4
ucomiss %xmm4,%xmm3
jbe    1151 <quat_from_mat4+0x41>
addss  0xebd(%rip),%xmm3
ucomiss %xmm4,%xmm3
jb     118b <quat_from_mat4+0x7b>
xorps  %xmm0,%xmm0
sqrtss %xmm3,%xmm0
jmp    1193 <quat_from_mat4+0x83>
ucomiss %xmm0,%xmm1
jb     11e6 <quat_from_mat4+0xd6>
ucomiss %xmm2,%xmm1
jb     11e6 <quat_from_mat4+0xd6>
addss  0xe95(%rip),%xmm1
subss  %xmm0,%xmm1
subss  %xmm2,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jb     1209 <quat_from_mat4+0xf9>
xorps  %xmm0,%xmm0
sqrtss %xmm1,%xmm0
jmp    1211 <quat_from_mat4+0x101>
movaps %xmm3,%xmm0
call   1030 <sqrtf@plt>
movss  0xe69(%rip),%xmm1
movaps %xmm0,%xmm2
mulss  %xmm1,%xmm2
movss  %xmm2,0xc(%r14)
divss  %xmm0,%xmm1
movss  0x24(%rbx),%xmm0
subss  0x18(%rbx),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,(%r14)
movss  0x8(%rbx),%xmm0
subss  0x20(%rbx),%xmm0
mulss  %xmm1,%xmm0
mov    $0x2,%eax
mov    $0x4,%edx
mov    $0x1,%esi
mov    $0x1,%ecx
jmp    132b <quat_from_mat4+0x21b>
ucomiss %xmm2,%xmm0
jbe    125f <quat_from_mat4+0x14f>
addss  0xe0d(%rip),%xmm0
subss  %xmm1,%xmm0
subss  %xmm2,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     1280 <quat_from_mat4+0x170>
sqrtss %xmm0,%xmm0
jmp    1285 <quat_from_mat4+0x175>
movaps %xmm1,%xmm0
call   1030 <sqrtf@plt>
movss  0xdeb(%rip),%xmm2
movaps %xmm2,%xmm1
divss  %xmm0,%xmm1
mulss  %xmm2,%xmm0
movss  %xmm0,(%r14)
movss  0x10(%rbx),%xmm0
addss  0x4(%rbx),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,0x4(%r14)
movss  0x20(%rbx),%xmm0
addss  0x8(%rbx),%xmm0
mulss  %xmm1,%xmm0
mov    $0x3,%eax
mov    $0x6,%ecx
mov    $0x9,%edx
jmp    1326 <quat_from_mat4+0x216>
addss  0xd99(%rip),%xmm2
subss  %xmm1,%xmm2
subss  %xmm0,%xmm2
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm2
jb     12d5 <quat_from_mat4+0x1c5>
xorps  %xmm0,%xmm0
sqrtss %xmm2,%xmm0
jmp    12dd <quat_from_mat4+0x1cd>
call   1030 <sqrtf@plt>
movss  0xd77(%rip),%xmm2
movaps %xmm2,%xmm1
divss  %xmm0,%xmm1
movss  0x4(%rbx),%xmm3
addss  0x10(%rbx),%xmm3
mulss  %xmm1,%xmm3
movss  %xmm3,(%r14)
mulss  %xmm2,%xmm0
movss  %xmm0,0x4(%r14)
movss  0x18(%rbx),%xmm0
addss  0x24(%rbx),%xmm0
mulss  %xmm1,%xmm0
mov    $0x3,%eax
mov    $0x8,%ecx
mov    $0x2,%esi
mov    $0x2,%edx
jmp    132b <quat_from_mat4+0x21b>
movaps %xmm2,%xmm0
call   1030 <sqrtf@plt>
movss  0xd1f(%rip),%xmm2
movaps %xmm2,%xmm1
divss  %xmm0,%xmm1
movss  0x8(%rbx),%xmm3
addss  0x20(%rbx),%xmm3
mulss  %xmm1,%xmm3
movss  %xmm3,(%r14)
movss  0x18(%rbx),%xmm3
addss  0x24(%rbx),%xmm3
mulss  %xmm1,%xmm3
movss  %xmm3,0x4(%r14)
mulss  %xmm2,%xmm0
mov    $0x3,%eax
mov    $0x1,%ecx
mov    $0x4,%edx
mov    $0x2,%esi
movss  %xmm0,(%r14,%rsi,4)
movss  (%rbx,%rdx,4),%xmm0
subss  (%rbx,%rcx,4),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,(%r14,%rax,4)
mov    %r14,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define float* @quat_from_mat4(float* returned 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 %29
11: ; preds = %2
%12 = fadd float %9, 1.000000e+00
%13 = tail call float @sqrtf(float %12)
%14 = fmul float %13, 5.000000e-01
%15 = getelementptr inbounds float, float* %0, i64 3
store float %14, float* %15
%16 = fdiv float 5.000000e-01, %13
%17 = getelementptr inbounds float, float* %1, i64 9
%18 = load float, float* %17
%19 = getelementptr inbounds float, float* %1, i64 6
%20 = load float, float* %19
%21 = fsub float %18, %20
%22 = fmul float %16, %21
store float %22, float* %0
%23 = getelementptr inbounds float, float* %1, i64 2
%24 = load float, float* %23
%25 = getelementptr inbounds float, float* %1, i64 8
%26 = load float, float* %25
%27 = fsub float %24, %26
%28 = fmul float %16, %27
br label %95
29: ; preds = %2
%30 = fcmp ult float %3, %5
%31 = fcmp ult float %3, %8
%32 = select i1 %30, i1 true, i1 %31
br i1 %32, label %53, label %33
33: ; preds = %29
%34 = fadd float %3, 1.000000e+00
%35 = fsub float %34, %5
%36 = fsub float %35, %8
%37 = tail call float @sqrtf(float %36)
%38 = fdiv float 5.000000e-01, %37
%39 = fmul float %37, 5.000000e-01
store float %39, float* %0
%40 = getelementptr inbounds float, float* %1, i64 4
%41 = load float, float* %40
%42 = getelementptr inbounds float, float* %1, i64 1
%43 = load float, float* %42
%44 = fadd float %41, %43
%45 = fmul float %38, %44
%46 = getelementptr inbounds float, float* %0, i64 1
store float %45, float* %46
%47 = getelementptr inbounds float, float* %1, i64 8
%48 = load float, float* %47
%49 = getelementptr inbounds float, float* %1, i64 2
%50 = load float, float* %49
%51 = fadd float %48, %50
%52 = fmul float %38, %51
br label %95
53: ; preds = %29
%54 = fcmp ogt float %5, %8
br i1 %54, label %55, label %75
55: ; preds = %53
%56 = fadd float %5, 1.000000e+00
%57 = fsub float %56, %3
%58 = fsub float %57, %8
%59 = tail call float @sqrtf(float %58)
%60 = fdiv float 5.000000e-01, %59
%61 = getelementptr inbounds float, float* %1, i64 1
%62 = load float, float* %61
%63 = getelementptr inbounds float, float* %1, i64 4
%64 = load float, float* %63
%65 = fadd float %62, %64
%66 = fmul float %60, %65
store float %66, float* %0
%67 = fmul float %59, 5.000000e-01
%68 = getelementptr inbounds float, float* %0, i64 1
store float %67, float* %68
%69 = getelementptr inbounds float, float* %1, i64 6
%70 = load float, float* %69
%71 = getelementptr inbounds float, float* %1, i64 9
%72 = load float, float* %71
%73 = fadd float %70, %72
%74 = fmul float %60, %73
br label %95
75: ; preds = %53
%76 = fadd float %8, 1.000000e+00
%77 = fsub float %76, %3
%78 = fsub float %77, %5
%79 = tail call float @sqrtf(float %78)
%80 = fdiv float 5.000000e-01, %79
%81 = getelementptr inbounds float, float* %1, i64 2
%82 = load float, float* %81
%83 = getelementptr inbounds float, float* %1, i64 8
%84 = load float, float* %83
%85 = fadd float %82, %84
%86 = fmul float %80, %85
store float %86, float* %0
%87 = getelementptr inbounds float, float* %1, i64 6
%88 = load float, float* %87
%89 = getelementptr inbounds float, float* %1, i64 9
%90 = load float, float* %89
%91 = fadd float %88, %90
%92 = fmul float %80, %91
%93 = getelementptr inbounds float, float* %0, i64 1
store float %92, float* %93
%94 = fmul float %79, 5.000000e-01
br label %95
95: ; preds = %33, %75, %55, %11
%96 = phi i64 [ 2, %33 ], [ 2, %75 ], [ 2, %55 ], [ 1, %11 ]
%97 = phi float [ %52, %33 ], [ %94, %75 ], [ %74, %55 ], [ %28, %11 ]
%98 = phi i64 [ 9, %33 ], [ 4, %75 ], [ 2, %55 ], [ 4, %11 ]
%99 = phi i64 [ 6, %33 ], [ 1, %75 ], [ 8, %55 ], [ 1, %11 ]
%100 = phi float [ %38, %33 ], [ %80, %75 ], [ %60, %55 ], [ %16, %11 ]
%101 = phi i64 [ 3, %33 ], [ 3, %75 ], [ 3, %55 ], [ 2, %11 ]
%102 = getelementptr inbounds float, float* %0, i64 %96
store float %97, float* %102
%103 = getelementptr inbounds float, float* %1, i64 %98
%104 = load float, float* %103
%105 = getelementptr inbounds float, float* %1, i64 %99
%106 = load float, float* %105
%107 = fsub float %104, %106
%108 = fmul float %100, %107
%109 = getelementptr inbounds float, float* %0, i64 %101
store float %108, float* %109
ret float* %0
}