double gjk_sphere_sphere(double *a, double ra, double *b, double rb, double *p,
                         double *q) {
  double d[3], dlen, deno;
  {
    (d)[0] = (a)[0] - (b)[0];
    (d)[1] = (a)[1] - (b)[1];
    (d)[2] = (a)[2] - (b)[2];
  };
  dlen = (sqrt(((d)[0] * (d)[0] + (d)[1] * (d)[1] + (d)[2] * (d)[2])));
  if (dlen == 0.0) {
    {
      (p)[0] = (a)[0];
      (p)[1] = (a)[1];
      (p)[2] = (a)[2];
    };
    {
      (q)[0] = (b)[0];
      (q)[1] = (b)[1];
      (q)[2] = (b)[2];
    };
    return 0.0;
  }
  deno = ra / dlen;
  {
    (p)[0] = (a)[0] - (deno) * (d)[0];
    (p)[1] = (a)[1] - (deno) * (d)[1];
    (p)[2] = (a)[2] - (deno) * (d)[2];
  };
  deno = rb / dlen;
  {
    (q)[0] = (b)[0] + (deno) * (d)[0];
    (q)[1] = (b)[1] + (deno) * (d)[1];
    (q)[2] = (b)[2] + (deno) * (d)[2];
  };
  deno = ra + rb;
  if (dlen > deno)
    return (dlen - deno);
  else {
    {
      (p)[0] = .5 * ((p)[0] + (q)[0]);
      (p)[1] = .5 * ((p)[1] + (q)[1]);
      (p)[2] = .5 * ((p)[2] + (q)[2]);
    };
    {
      (q)[0] = (p)[0];
      (q)[1] = (p)[1];
      (q)[2] = (p)[2];
    };
    return 0.0;
  }
}


x86 assembly (clang, -O0):
<gjk_sphere_sphere>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
movsd  %xmm1,-0x28(%rbp)
mov    %rdx,-0x30(%rbp)
mov    %rcx,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
subsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm2
movsd  -0x48(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    123a <gjk_sphere_sphere+0x12a>
jp     123a <gjk_sphere_sphere+0x12a>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x10(%rax)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1452 <gjk_sphere_sphere+0x342>
movsd  -0x18(%rbp),%xmm0
divsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x60(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
movsd  -0x60(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm1
movsd  -0x60(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x28(%rbp),%xmm0
divsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x60(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm1
movsd  -0x60(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm1
movsd  -0x60(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x18(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x58(%rbp),%xmm0
ucomisd -0x60(%rbp),%xmm0
jbe    13a4 <gjk_sphere_sphere+0x294>
movsd  -0x58(%rbp),%xmm0
subsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1452 <gjk_sphere_sphere+0x342>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x38(%rbp),%rax
addsd  (%rax),%xmm1
movsd  0xc44(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
movsd  0x8(%rax),%xmm1
mov    -0x38(%rbp),%rax
addsd  0x8(%rax),%xmm1
movsd  0xc1e(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x30(%rbp),%rax
movsd  0x10(%rax),%xmm1
mov    -0x38(%rbp),%rax
addsd  0x10(%rax),%xmm1
movsd  0xbf7(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x30(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x10(%rax)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gjk_sphere_sphere>:
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %rsi,%r12
mov    %rdi,%rbx
movsd  (%rdi),%xmm4
movsd  0x8(%rdi),%xmm6
subsd  (%rsi),%xmm4
subsd  0x8(%rsi),%xmm6
mov    %rcx,%r14
mov    %rdx,%r15
movapd %xmm0,%xmm8
movsd  0x10(%rdi),%xmm5
subsd  0x10(%rsi),%xmm5
movapd %xmm6,%xmm0
mulsd  %xmm6,%xmm0
movapd %xmm4,%xmm2
mulsd  %xmm4,%xmm2
addsd  %xmm0,%xmm2
movapd %xmm5,%xmm0
mulsd  %xmm5,%xmm0
addsd  %xmm2,%xmm0
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
jb     1178 <gjk_sphere_sphere+0x68>
sqrtsd %xmm0,%xmm0
jmp    11bd <gjk_sphere_sphere+0xad>
movsd  %xmm4,0x18(%rsp)
movapd %xmm8,0x20(%rsp)
movsd  %xmm6,0x10(%rsp)
movsd  %xmm1,0x8(%rsp)
movsd  %xmm5,(%rsp)
call   1030 <sqrt@plt>
xorpd  %xmm2,%xmm2
movsd  (%rsp),%xmm5
movsd  0x8(%rsp),%xmm1
movsd  0x10(%rsp),%xmm6
movapd 0x20(%rsp),%xmm8
movsd  0x18(%rsp),%xmm4
ucomisd %xmm2,%xmm0
movsd  (%rbx),%xmm7
jne    1208 <gjk_sphere_sphere+0xf8>
jp     1208 <gjk_sphere_sphere+0xf8>
movsd  %xmm7,(%r15)
movsd  0x8(%rbx),%xmm0
movsd  %xmm0,0x8(%r15)
movsd  0x10(%rbx),%xmm0
movsd  %xmm0,0x10(%r15)
movsd  (%r12),%xmm0
movsd  %xmm0,(%r14)
movsd  0x8(%r12),%xmm0
movsd  %xmm0,0x8(%r14)
movsd  0x10(%r12),%xmm0
jmp    12ed <gjk_sphere_sphere+0x1dd>
movapd 0xdf0(%rip),%xmm2
xorpd  %xmm8,%xmm2
divsd  %xmm0,%xmm2
movapd %xmm2,%xmm3
mulsd  %xmm4,%xmm3
addsd  %xmm7,%xmm3
movsd  %xmm3,(%r15)
movapd %xmm2,%xmm3
mulsd  %xmm6,%xmm3
addsd  0x8(%rbx),%xmm3
movsd  %xmm3,0x8(%r15)
mulsd  %xmm5,%xmm2
addsd  0x10(%rbx),%xmm2
movsd  %xmm2,0x10(%r15)
addsd  %xmm1,%xmm8
divsd  %xmm0,%xmm1
mulsd  %xmm1,%xmm4
addsd  (%r12),%xmm4
movsd  %xmm4,(%r14)
mulsd  %xmm1,%xmm6
addsd  0x8(%r12),%xmm6
movsd  %xmm6,0x8(%r14)
mulsd  %xmm5,%xmm1
addsd  0x10(%r12),%xmm1
movsd  %xmm1,0x10(%r14)
ucomisd %xmm8,%xmm0
jbe    1294 <gjk_sphere_sphere+0x184>
subsd  %xmm8,%xmm0
jmp    12f7 <gjk_sphere_sphere+0x1e7>
addsd  (%r15),%xmm4
movsd  0xd6f(%rip),%xmm0
mulsd  %xmm0,%xmm4
movsd  %xmm4,(%r15)
movsd  0x8(%r15),%xmm1
movsd  0x10(%r15),%xmm2
addsd  0x8(%r14),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%r15)
addsd  0x10(%r14),%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,0x10(%r15)
movsd  %xmm4,(%r14)
movsd  0x8(%r15),%xmm0
movsd  %xmm0,0x8(%r14)
movsd  0x10(%r15),%xmm0
movsd  %xmm0,0x10(%r14)
xorpd  %xmm0,%xmm0
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
define double @gjk_sphere_sphere(double* nocapture %0, double %1, double* nocapture %2, double %3, double* nocapture %4, double* nocapture %5) {
%7 = load double, double* %0
%8 = load double, double* %2
%9 = fsub double %7, %8
%10 = getelementptr inbounds double, double* %0, i64 1
%11 = load double, double* %10
%12 = getelementptr inbounds double, double* %2, i64 1
%13 = load double, double* %12
%14 = fsub double %11, %13
%15 = getelementptr inbounds double, double* %0, i64 2
%16 = load double, double* %15
%17 = getelementptr inbounds double, double* %2, i64 2
%18 = load double, double* %17
%19 = fsub double %16, %18
%20 = fmul double %14, %14
%21 = tail call double @llvm.fmuladd.f64(double %9, double %9, double %20)
%22 = tail call double @llvm.fmuladd.f64(double %19, double %19, double %21)
%23 = tail call double @sqrt(double %22)
%24 = fcmp oeq double %23, 0.000000e+00
%25 = load double, double* %0
br i1 %24, label %26, label %36
26: ; preds = %6
store double %25, double* %4
%27 = load double, double* %10
%28 = getelementptr inbounds double, double* %4, i64 1
store double %27, double* %28
%29 = load double, double* %15
%30 = getelementptr inbounds double, double* %4, i64 2
store double %29, double* %30
%31 = load double, double* %2
store double %31, double* %5
%32 = load double, double* %12
%33 = getelementptr inbounds double, double* %5, i64 1
store double %32, double* %33
%34 = load double, double* %17
%35 = getelementptr inbounds double, double* %5, i64 2
store double %34, double* %35
br label %73
36: ; preds = %6
%37 = fneg double %1
%38 = fdiv double %37, %23
%39 = tail call double @llvm.fmuladd.f64(double %38, double %9, double %25)
store double %39, double* %4
%40 = load double, double* %10
%41 = tail call double @llvm.fmuladd.f64(double %38, double %14, double %40)
%42 = getelementptr inbounds double, double* %4, i64 1
store double %41, double* %42
%43 = load double, double* %15
%44 = tail call double @llvm.fmuladd.f64(double %38, double %19, double %43)
%45 = getelementptr inbounds double, double* %4, i64 2
store double %44, double* %45
%46 = fdiv double %3, %23
%47 = load double, double* %2
%48 = tail call double @llvm.fmuladd.f64(double %46, double %9, double %47)
store double %48, double* %5
%49 = load double, double* %12
%50 = tail call double @llvm.fmuladd.f64(double %46, double %14, double %49)
%51 = getelementptr inbounds double, double* %5, i64 1
store double %50, double* %51
%52 = load double, double* %17
%53 = tail call double @llvm.fmuladd.f64(double %46, double %19, double %52)
%54 = getelementptr inbounds double, double* %5, i64 2
store double %53, double* %54
%55 = fadd double %1, %3
%56 = fcmp ogt double %23, %55
br i1 %56, label %57, label %59
57: ; preds = %36
%58 = fsub double %23, %55
br label %73
59: ; preds = %36
%60 = load double, double* %4
%61 = fadd double %48, %60
%62 = fmul double %61, 5.000000e-01
store double %62, double* %4
%63 = load double, double* %42
%64 = load double, double* %51
%65 = fadd double %63, %64
%66 = fmul double %65, 5.000000e-01
store double %66, double* %42
%67 = load double, double* %45
%68 = load double, double* %54
%69 = fadd double %67, %68
%70 = fmul double %69, 5.000000e-01
store double %70, double* %45
store double %62, double* %5
%71 = load double, double* %42
store double %71, double* %51
%72 = load double, double* %45
store double %72, double* %54
br label %73
73: ; preds = %59, %57, %26
%74 = phi double [ 0.000000e+00, %26 ], [ %58, %57 ], [ 0.000000e+00, %59 ]
ret double %74
}