#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 acos(double);
double cos(double);
double pow(double, double);
double sqrt(double);
int rroots3(double *po, double *r) {
  double b, c, b2, bt, v, pit, e;
  double p, q, D, A, cosphi, phit, R, _2R;
  b = *(po + 1) / (*po);
  c = *(po + 2) / (*po);
  b2 = b * b;
  bt = b / 3;
  p = (3 * c - b2) / 9;
  q = ((2 * b2 * b) / 27 - b * c / 3 + (*(po + 3)) / (*po)) / 2;
  D = q * q + p * p * p;
  if (D > 0) {
    A = sqrt(D) - q;
    if (A > 0) {
      v = pow(A, 1.0 / 3);
      *r = v - p / v - bt;
    } else {
      v = pow(-A, 1.0 / 3);
      *r = p / v - v - bt;
    }
    return 1;
  } else {
    if (q > 0)
      e = 1;
    else
      e = -1;
    R = e * sqrt(-p);
    _2R = R * 2;
    cosphi = q / (R * R * R);
    if (cosphi > 1)
      cosphi = 1;
    else if (cosphi < -1)
      cosphi = -1;
    phit = acos(cosphi) / 3;
    pit = 3.14159265358979 / 3;
    r[0] = -_2R * cos(phit) - bt;
    r[1] = _2R * cos(pit - phit) - bt;
    r[2] = _2R * cos(pit + phit) - bt;
    return 3;
  }
}


x86 assembly (clang, -O0):
<rroots3>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
divsd  (%rax),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
divsd  (%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x20(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xe6d(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xe3b(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe3b(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xe12(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  0xe10(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
movsd  0xdf2(%rip),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm1
mov    -0x10(%rbp),%rax
divsd  (%rax),%xmm1
addsd  %xmm1,%xmm0
movsd  0xdc5(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1334 <rroots3+0x1f4>
movsd  -0x68(%rbp),%xmm0
call   1060 <sqrt@plt>
subsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    12de <rroots3+0x19e>
movsd  -0x70(%rbp),%xmm0
movsd  0xd89(%rip),%xmm1
call   1050 <pow@plt>
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm1
divsd  -0x40(%rbp),%xmm1
subsd  %xmm1,%xmm0
subsd  -0x38(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1328 <rroots3+0x1e8>
movsd  -0x70(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xd36(%rip),%xmm1
call   1050 <pow@plt>
movsd  %xmm0,-0x40(%rbp)
movsd  -0x58(%rbp),%xmm0
divsd  -0x40(%rbp),%xmm0
subsd  -0x40(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    157b <rroots3+0x43b>
movsd  -0x60(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1358 <rroots3+0x218>
movsd  0xcda(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    1365 <rroots3+0x225>
movsd  0xcc0(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
call   1060 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  -0x98(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  0xc4e(%rip),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x60(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm1
ff
mulsd  -0x88(%rbp),%xmm1
ff
mulsd  -0x88(%rbp),%xmm1
ff
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  0xc33(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1411 <rroots3+0x2d1>
movsd  0xc21(%rip),%xmm0
movsd  %xmm0,-0x78(%rbp)
jmp    1436 <rroots3+0x2f6>
movsd  0xc07(%rip),%xmm0
ucomisd -0x78(%rbp),%xmm0
jbe    1431 <rroots3+0x2f1>
movsd  0xbf4(%rip),%xmm0
movsd  %xmm0,-0x78(%rbp)
jmp    1436 <rroots3+0x2f6>
movsd  -0x78(%rbp),%xmm0
call   1030 <acos@plt>
mov    $0x3,%ecx
cltd
idiv   %ecx
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  0xbd7(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x90(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
call   1040 <cos@plt>
movaps %xmm0,%xmm2
movsd  -0xb0(%rbp),%xmm0
ff
movsd  -0x38(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
subsd  -0x80(%rbp),%xmm0
call   1040 <cos@plt>
movaps %xmm0,%xmm2
movsd  -0xa8(%rbp),%xmm0
ff
movsd  -0x38(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
addsd  -0x80(%rbp),%xmm0
call   1040 <cos@plt>
movaps %xmm0,%xmm2
movsd  -0xa0(%rbp),%xmm0
ff
movsd  -0x38(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movl   $0x3,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rroots3>:
push   %rbx
sub    $0x40,%rsp
mov    %rsi,%rbx
movupd 0x8(%rdi),%xmm1
movsd  (%rdi),%xmm2
movapd %xmm2,%xmm0
unpcklpd %xmm2,%xmm0
divpd  %xmm0,%xmm1
movapd %xmm1,%xmm3
mulsd  %xmm1,%xmm3
movsd  0xe93(%rip),%xmm0
movapd %xmm1,%xmm4
unpckhpd %xmm1,%xmm4
movapd %xmm4,%xmm6
mulsd  %xmm0,%xmm6
subsd  %xmm3,%xmm6
divsd  0xe7f(%rip),%xmm6
addsd  %xmm3,%xmm3
mulsd  %xmm1,%xmm3
mulsd  %xmm1,%xmm4
movapd %xmm1,%xmm5
divsd  %xmm0,%xmm4
movsd  0x18(%rdi),%xmm1
unpcklpd %xmm3,%xmm1
shufpd $0x2,0xe91(%rip),%xmm2
divpd  %xmm2,%xmm1
movapd %xmm1,%xmm3
unpckhpd %xmm1,%xmm3
subsd  %xmm4,%xmm3
addsd  %xmm1,%xmm3
mulsd  0xe45(%rip),%xmm3
divsd  %xmm0,%xmm5
movapd %xmm5,0x20(%rsp)
movapd %xmm6,%xmm1
mulsd  %xmm6,%xmm1
mulsd  %xmm6,%xmm1
movapd %xmm3,%xmm0
mulsd  %xmm3,%xmm0
addsd  %xmm1,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1205 <rroots3+0xc5>
movapd %xmm6,0x10(%rsp)
jb     1225 <rroots3+0xe5>
sqrtsd %xmm0,%xmm0
jmp    1234 <rroots3+0xf4>
movapd 0xe43(%rip),%xmm0
xorpd  %xmm6,%xmm0
movsd  0xdff(%rip),%xmm1
ucomisd %xmm6,%xmm1
jb     1262 <rroots3+0x122>
sqrtsd %xmm0,%xmm0
jmp    1271 <rroots3+0x131>
movapd %xmm3,(%rsp)
call   1060 <sqrt@plt>
movapd (%rsp),%xmm3
subsd  %xmm3,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    136d <rroots3+0x22d>
movsd  0xdea(%rip),%xmm1
call   1050 <pow@plt>
movapd 0x10(%rsp),%xmm1
divsd  %xmm0,%xmm1
jmp    1390 <rroots3+0x250>
movapd %xmm3,(%rsp)
call   1060 <sqrt@plt>
movapd (%rsp),%xmm3
movapd 0xdd7(%rip),%xmm1
xorpd  %xmm0,%xmm1
xorpd  %xmm2,%xmm2
cmpltsd %xmm3,%xmm2
andpd  %xmm2,%xmm0
andnpd %xmm1,%xmm2
orpd   %xmm0,%xmm2
movapd %xmm2,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm2,%xmm2
movapd %xmm2,0x10(%rsp)
divsd  %xmm0,%xmm3
movsd  0xd6c(%rip),%xmm0
ucomisd %xmm0,%xmm3
ja     12d0 <rroots3+0x190>
movsd  0xd66(%rip),%xmm1
ucomisd %xmm3,%xmm1
movapd %xmm3,%xmm0
jbe    12d0 <rroots3+0x190>
movapd %xmm1,%xmm0
call   1030 <acos@plt>
cltq
imul   $0x55555556,%rax,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
shr    $0x20,%rax
add    %ecx,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rsp)
movapd 0xd51(%rip),%xmm1
xorpd  0x10(%rsp),%xmm1
movapd %xmm1,0x30(%rsp)
call   1040 <cos@plt>
mulsd  0x30(%rsp),%xmm0
subsd  0x20(%rsp),%xmm0
movsd  %xmm0,(%rbx)
movsd  0xd08(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1040 <cos@plt>
mulsd  0x10(%rsp),%xmm0
subsd  0x20(%rsp),%xmm0
movsd  %xmm0,0x8(%rbx)
movsd  (%rsp),%xmm0
addsd  0xce0(%rip),%xmm0
call   1040 <cos@plt>
mulsd  0x10(%rsp),%xmm0
subsd  0x20(%rsp),%xmm0
movsd  %xmm0,0x10(%rbx)
mov    $0x3,%eax
jmp    13a3 <rroots3+0x263>
xorpd  0xcdb(%rip),%xmm0
movsd  0xcbb(%rip),%xmm1
call   1050 <pow@plt>
movapd %xmm0,%xmm1
movapd 0x10(%rsp),%xmm0
divsd  %xmm1,%xmm0
subsd  %xmm1,%xmm0
subsd  0x20(%rsp),%xmm0
movsd  %xmm0,(%rbx)
mov    $0x1,%eax
add    $0x40,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define i32 @rroots3(double* %0, double* %1) {
%3 = alloca i32
%4 = alloca double*
%5 = alloca double*
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
store double* %0, double** %4
store double* %1, double** %5
%21 = load double*, double** %4
%22 = getelementptr inbounds double, double* %21, i64 1
%23 = load double, double* %22
%24 = load double*, double** %4
%25 = load double, double* %24
%26 = fdiv double %23, %25
store double %26, double* %6
%27 = load double*, double** %4
%28 = getelementptr inbounds double, double* %27, i64 2
%29 = load double, double* %28
%30 = load double*, double** %4
%31 = load double, double* %30
%32 = fdiv double %29, %31
store double %32, double* %7
%33 = load double, double* %6
%34 = load double, double* %6
%35 = fmul double %33, %34
store double %35, double* %8
%36 = load double, double* %6
%37 = fdiv double %36, 3.000000e+00
store double %37, double* %9
%38 = load double, double* %7
%39 = load double, double* %8
%40 = fneg double %39
%41 = call double @llvm.fmuladd.f64(double 3.000000e+00, double %38, double %40)
%42 = fdiv double %41, 9.000000e+00
store double %42, double* %13
%43 = load double, double* %8
%44 = fmul double 2.000000e+00, %43
%45 = load double, double* %6
%46 = fmul double %44, %45
%47 = fdiv double %46, 2.700000e+01
%48 = load double, double* %6
%49 = load double, double* %7
%50 = fmul double %48, %49
%51 = fdiv double %50, 3.000000e+00
%52 = fsub double %47, %51
%53 = load double*, double** %4
%54 = getelementptr inbounds double, double* %53, i64 3
%55 = load double, double* %54
%56 = load double*, double** %4
%57 = load double, double* %56
%58 = fdiv double %55, %57
%59 = fadd double %52, %58
%60 = fdiv double %59, 2.000000e+00
store double %60, double* %14
%61 = load double, double* %14
%62 = load double, double* %14
%63 = load double, double* %13
%64 = load double, double* %13
%65 = fmul double %63, %64
%66 = load double, double* %13
%67 = fmul double %65, %66
%68 = call double @llvm.fmuladd.f64(double %61, double %62, double %67)
store double %68, double* %15
%69 = load double, double* %15
%70 = fcmp ogt double %69, 0.000000e+00
br i1 %70, label %71, label %102
71: ; preds = %2
%72 = load double, double* %15
%73 = call double @sqrt(double %72)
%74 = load double, double* %14
%75 = fsub double %73, %74
store double %75, double* %16
%76 = load double, double* %16
%77 = fcmp ogt double %76, 0.000000e+00
br i1 %77, label %78, label %89
78: ; preds = %71
%79 = load double, double* %16
%80 = call double @pow(double %79, double 0x3FD5555555555555)
store double %80, double* %10
%81 = load double, double* %10
%82 = load double, double* %13
%83 = load double, double* %10
%84 = fdiv double %82, %83
%85 = fsub double %81, %84
%86 = load double, double* %9
%87 = fsub double %85, %86
%88 = load double*, double** %5
store double %87, double* %88
br label %101
89: ; preds = %71
%90 = load double, double* %16
%91 = fneg double %90
%92 = call double @pow(double %91, double 0x3FD5555555555555)
store double %92, double* %10
%93 = load double, double* %13
%94 = load double, double* %10
%95 = fdiv double %93, %94
%96 = load double, double* %10
%97 = fsub double %95, %96
%98 = load double, double* %9
%99 = fsub double %97, %98
%100 = load double*, double** %5
store double %99, double* %100
br label %101
101: ; preds = %89, %78
store i32 1, i32* %3
br label %164
102: ; preds = %2
%103 = load double, double* %14
%104 = fcmp ogt double %103, 0.000000e+00
br i1 %104, label %105, label %106
105: ; preds = %102
store double 1.000000e+00, double* %12
br label %107
106: ; preds = %102
store double -1.000000e+00, double* %12
br label %107
107: ; preds = %106, %105
%108 = load double, double* %12
%109 = load double, double* %13
%110 = fneg double %109
%111 = call double @sqrt(double %110)
%112 = fmul double %108, %111
store double %112, double* %19
%113 = load double, double* %19
%114 = fmul double %113, 2.000000e+00
store double %114, double* %20
%115 = load double, double* %14
%116 = load double, double* %19
%117 = load double, double* %19
%118 = fmul double %116, %117
%119 = load double, double* %19
%120 = fmul double %118, %119
%121 = fdiv double %115, %120
store double %121, double* %17
%122 = load double, double* %17
%123 = fcmp ogt double %122, 1.000000e+00
br i1 %123, label %124, label %125
124: ; preds = %107
store double 1.000000e+00, double* %17
br label %130
125: ; preds = %107
%126 = load double, double* %17
%127 = fcmp olt double %126, -1.000000e+00
br i1 %127, label %128, label %129
128: ; preds = %125
store double -1.000000e+00, double* %17
br label %129
129: ; preds = %128, %125
br label %130
130: ; preds = %129, %124
%131 = load double, double* %17
%132 = call i32 @acos(double %131)
%133 = sdiv i32 %132, 3
%134 = sitofp i32 %133 to double
store double %134, double* %18
store double 0x3FF0C152382D7361, double* %11
%135 = load double, double* %20
%136 = fneg double %135
%137 = load double, double* %18
%138 = call double @cos(double %137)
%139 = load double, double* %9
%140 = fneg double %139
%141 = call double @llvm.fmuladd.f64(double %136, double %138, double %140)
%142 = load double*, double** %5
%143 = getelementptr inbounds double, double* %142, i64 0
store double %141, double* %143
%144 = load double, double* %20
%145 = load double, double* %11
%146 = load double, double* %18
%147 = fsub double %145, %146
%148 = call double @cos(double %147)
%149 = load double, double* %9
%150 = fneg double %149
%151 = call double @llvm.fmuladd.f64(double %144, double %148, double %150)
%152 = load double*, double** %5
%153 = getelementptr inbounds double, double* %152, i64 1
store double %151, double* %153
%154 = load double, double* %20
%155 = load double, double* %11
%156 = load double, double* %18
%157 = fadd double %155, %156
%158 = call double @cos(double %157)
%159 = load double, double* %9
%160 = fneg double %159
%161 = call double @llvm.fmuladd.f64(double %154, double %158, double %160)
%162 = load double*, double** %5
%163 = getelementptr inbounds double, double* %162, i64 2
store double %161, double* %163
store i32 3, i32* %3
br label %164
164: ; preds = %130, %101
%165 = load i32, i32* %3
ret i32 %165
}

LLVM IR (-O2):
define i32 @rroots3(double* nocapture %0, double* nocapture writeonly %1) {
%3 = getelementptr inbounds double, double* %0, i64 1
%4 = load double, double* %0
%5 = bitcast double* %3 to <2 x double>*
%6 = load <2 x double>, <2 x double>* %5
%7 = insertelement <2 x double> poison, double %4, i64 0
%8 = shufflevector <2 x double> %7, <2 x double> poison, <2 x i32> zeroinitializer
%9 = fdiv <2 x double> %6, %8
%10 = extractelement <2 x double> %9, i64 0
%11 = fmul <2 x double> %9, %9
%12 = extractelement <2 x double> %11, i64 0
%13 = fdiv double %10, 3.000000e+00
%14 = fneg double %12
%15 = extractelement <2 x double> %9, i64 1
%16 = tail call double @llvm.fmuladd.f64(double %15, double 3.000000e+00, double %14)
%17 = fdiv double %16, 9.000000e+00
%18 = fmul double %12, 2.000000e+00
%19 = fmul double %10, %18
%20 = fmul double %10, %15
%21 = fdiv double %20, 3.000000e+00
%22 = getelementptr inbounds double, double* %0, i64 3
%23 = load double, double* %22
%24 = insertelement <2 x double> poison, double %23, i64 0
%25 = insertelement <2 x double> %24, double %19, i64 1
%26 = insertelement <2 x double> <double poison, double 2.700000e+01>, double %4, i64 0
%27 = fdiv <2 x double> %25, %26
%28 = extractelement <2 x double> %27, i64 1
%29 = fsub double %28, %21
%30 = extractelement <2 x double> %27, i64 0
%31 = fadd double %30, %29
%32 = fmul double %31, 5.000000e-01
%33 = fmul double %17, %17
%34 = fmul double %17, %33
%35 = tail call double @llvm.fmuladd.f64(double %32, double %32, double %34)
%36 = fcmp ogt double %35, 0.000000e+00
br i1 %36, label %37, label %53
37: ; preds = %2
%38 = tail call double @sqrt(double %35)
%39 = fsub double %38, %32
%40 = fcmp ogt double %39, 0.000000e+00
br i1 %40, label %41, label %44
41: ; preds = %37
%42 = tail call double @pow(double %39, double 0x3FD5555555555555)
%43 = fdiv double %17, %42
br label %48
44: ; preds = %37
%45 = fneg double %39
%46 = tail call double @pow(double %45, double 0x3FD5555555555555)
%47 = fdiv double %17, %46
br label %48
48: ; preds = %44, %41
%49 = phi double [ %46, %44 ], [ %43, %41 ]
%50 = phi double [ %47, %44 ], [ %42, %41 ]
%51 = fsub double %50, %49
%52 = fsub double %51, %13
store double %52, double* %1
br label %84
53: ; preds = %2
%54 = fcmp ogt double %32, 0.000000e+00
%55 = fneg double %17
%56 = tail call double @sqrt(double %55)
%57 = fneg double %56
%58 = select i1 %54, double %56, double %57
%59 = fmul double %58, 2.000000e+00
%60 = fmul double %58, %58
%61 = fmul double %58, %60
%62 = fdiv double %32, %61
%63 = fcmp ogt double %62, 1.000000e+00
br i1 %63, label %67, label %64
64: ; preds = %53
%65 = fcmp olt double %62, -1.000000e+00
br i1 %65, label %66, label %67
66: ; preds = %64
br label %67
67: ; preds = %53, %64, %66
%68 = phi double [ -1.000000e+00, %66 ], [ %62, %64 ], [ 1.000000e+00, %53 ]
%69 = tail call i32 @acos(double %68)
%70 = sdiv i32 %69, 3
%71 = sitofp i32 %70 to double
%72 = fneg double %59
%73 = tail call double @cos(double %71)
%74 = fneg double %13
%75 = tail call double @llvm.fmuladd.f64(double %72, double %73, double %74)
store double %75, double* %1
%76 = fsub double 0x3FF0C152382D7361, %71
%77 = tail call double @cos(double %76)
%78 = tail call double @llvm.fmuladd.f64(double %59, double %77, double %74)
%79 = getelementptr inbounds double, double* %1, i64 1
store double %78, double* %79
%80 = fadd double %71, 0x3FF0C152382D7361
%81 = tail call double @cos(double %80)
%82 = tail call double @llvm.fmuladd.f64(double %59, double %81, double %74)
%83 = getelementptr inbounds double, double* %1, i64 2
store double %82, double* %83
br label %84
84: ; preds = %67, %48
%85 = phi i32 [ 1, %48 ], [ 3, %67 ]
ret i32 %85
}