#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 */
scalar_t__ fabs(double);
double sin(int);
int getPhase(double *wave) {
  double max = -999, min = 999;
  double amp, offset;
  double angle = 0, base;
  int i, j, k;
  for (i = 0; i < 12; i++) {
    if (wave[i] > max)
      max = wave[i];
    if (wave[i] < min)
      min = wave[i];
  }
  amp = (max - min) / 2;
  offset = (max + min) / 2;
  for (k = 0; k < 3; k++) {
    double error[12], curerror = 0;
    double segsize = 360;
    for (i = 0; i <= k; i++)
      segsize /= 12.0;
    for (j = 0; j < 12; j++) {
      error[j] = 0;
      for (i = 0; i < 12; i++)
        error[j] +=
            fabs((amp * sin((i * 30 + j * segsize + angle) * 3.14159f / 180.0) +
                  offset) -
                 wave[i]);
      curerror += error[j];
    }
    base = 0;
    for (j = 0; j < 12; j++) {
      if (error[j] < curerror) {
        base = j * segsize;
        curerror = error[j];
      }
    }
    angle += base;
  }
  return (int)angle;
}


x86 assembly (clang, -O0):
<getPhase>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
mov    %rdi,-0x8(%rbp)
movsd  0xed1(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xebc(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0xc,-0x3c(%rbp)
jge    11cd <getPhase+0xad>
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    118c <getPhase+0x6c>
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11ba <getPhase+0x9a>
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    11bf <getPhase+0x9f>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1158 <getPhase+0x38>
movsd  -0x10(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  0xe31(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  0xe16(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x44(%rbp)
cmpl   $0x3,-0x44(%rbp)
jge    13fb <getPhase+0x2db>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  0xdf1(%rip),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x44(%rbp),%eax
jg     126c <getPhase+0x14c>
movsd  -0xc0(%rbp),%xmm0
ff
movsd  0xdde(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1236 <getPhase+0x116>
movl   $0x0,-0x40(%rbp)
cmpl   $0xc,-0x40(%rbp)
jge    136c <getPhase+0x24c>
movslq -0x40(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb0(%rbp,%rax,8)
ff ff
movl   $0x0,-0x3c(%rbp)
cmpl   $0xc,-0x3c(%rbp)
jge    1341 <getPhase+0x221>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
imul   $0x1e,-0x3c(%rbp),%eax
cvtsi2sd %eax,%xmm1
cvtsi2sdl -0x40(%rbp),%xmm0
movsd  -0xc0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  0xd53(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd3f(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
call   1040 <sin@plt>
movaps %xmm0,%xmm2
movsd  -0xc8(%rbp),%xmm0
ff
movsd  -0x28(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <fabs@plt>
cvtsi2sd %rax,%xmm0
movslq -0x40(%rbp),%rax
addsd  -0xb0(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0xb0(%rbp,%rax,8)
ff ff
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1294 <getPhase+0x174>
movslq -0x40(%rbp),%rax
movsd  -0xb0(%rbp,%rax,8),%xmm0
ff ff
addsd  -0xb8(%rbp),%xmm0
ff
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1273 <getPhase+0x153>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x40(%rbp)
cmpl   $0xc,-0x40(%rbp)
jge    13de <getPhase+0x2be>
movslq -0x40(%rbp),%rax
movsd  -0xb0(%rbp,%rax,8),%xmm1
ff ff
movsd  -0xb8(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jbe    13cb <getPhase+0x2ab>
cvtsi2sdl -0x40(%rbp),%xmm0
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0x38(%rbp)
movslq -0x40(%rbp),%rax
movsd  -0xb0(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0xb8(%rbp)
ff
jmp    13d0 <getPhase+0x2b0>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    137b <getPhase+0x25b>
movsd  -0x38(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    120a <getPhase+0xea>
cvttsd2si -0x30(%rbp),%eax
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<getPhase>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xa8,%rsp
mov    %rdi,%r12
movsd  (%rdi),%xmm0
movapd %xmm0,%xmm1
maxsd  0xebc(%rip),%xmm1
movsd  0x8(%rdi),%xmm2
minsd  0xeb7(%rip),%xmm0
movapd %xmm2,%xmm3
maxsd  %xmm1,%xmm3
minsd  %xmm0,%xmm2
movsd  0x10(%rdi),%xmm0
movapd %xmm0,%xmm1
maxsd  %xmm3,%xmm1
minsd  %xmm2,%xmm0
movsd  0x18(%rdi),%xmm2
movapd %xmm2,%xmm3
maxsd  %xmm1,%xmm3
minsd  %xmm0,%xmm2
movsd  0x20(%rdi),%xmm0
movapd %xmm0,%xmm1
maxsd  %xmm3,%xmm1
minsd  %xmm2,%xmm0
movsd  0x28(%rdi),%xmm2
movapd %xmm2,%xmm3
maxsd  %xmm1,%xmm3
minsd  %xmm0,%xmm2
movsd  0x30(%rdi),%xmm0
movapd %xmm0,%xmm1
maxsd  %xmm3,%xmm1
minsd  %xmm2,%xmm0
movsd  0x38(%rdi),%xmm2
movapd %xmm2,%xmm3
maxsd  %xmm1,%xmm3
minsd  %xmm0,%xmm2
movsd  0x40(%rdi),%xmm0
movapd %xmm0,%xmm1
maxsd  %xmm3,%xmm1
minsd  %xmm2,%xmm0
movsd  0x48(%rdi),%xmm2
movapd %xmm2,%xmm3
maxsd  %xmm1,%xmm3
minsd  %xmm0,%xmm2
movsd  0x50(%rdi),%xmm0
movapd %xmm0,%xmm1
maxsd  %xmm3,%xmm1
minsd  %xmm2,%xmm0
movsd  0x58(%rdi),%xmm3
movapd %xmm3,%xmm2
maxsd  %xmm1,%xmm2
minsd  %xmm0,%xmm3
movapd %xmm2,%xmm1
subsd  %xmm3,%xmm1
movsd  0xdf9(%rip),%xmm0
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm3
mulsd  %xmm0,%xmm3
mov    $0x1,%r15d
lea    0xe50(%rip),%r14
movsd  0xde8(%rip),%xmm5
movsd  0xde8(%rip),%xmm6
xorpd  %xmm8,%xmm8
movsd  %xmm3,0x18(%rsp)
movsd  %xmm1,0x10(%rsp)
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xor    %eax,%eax
cmp    $0x2,%r15d
sete   %cl
movsd  0xda7(%rip),%xmm7
cmp    $0x1,%r15d
je     127f <getPhase+0x15f>
mov    %cl,%al
movsd  (%r14,%rax,8),%xmm7
xorpd  %xmm4,%xmm4
xor    %r13d,%r13d
movsd  %xmm8,0x20(%rsp)
movapd %xmm7,0x90(%rsp)
cs nopw 0x0(%rax,%rax,1)
movsd  %xmm4,0x8(%rsp)
movq   $0x0,0x30(%rsp,%r13,8)
xorps  %xmm0,%xmm0
cvtsi2sd %r13d,%xmm0
movsd  %xmm0,0x28(%rsp)
mov    %r12,%rbx
xor    %ebp,%ebp
xorpd  %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
movsd  %xmm0,(%rsp)
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
movsd  0x28(%rsp),%xmm1
mulsd  %xmm7,%xmm1
addsd  %xmm0,%xmm1
addsd  %xmm8,%xmm1
mulsd  %xmm5,%xmm1
divsd  %xmm6,%xmm1
cvttsd2si %xmm1,%edi
call   1040 <sin@plt>
mulsd  0x10(%rsp),%xmm0
addsd  0x18(%rsp),%xmm0
subsd  (%rbx),%xmm0
call   1030 <fabs@plt>
movapd 0x90(%rsp),%xmm7
movsd  0x20(%rsp),%xmm8
movsd  0xcfb(%rip),%xmm6
movsd  0xceb(%rip),%xmm5
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
movsd  (%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rsp)
movsd  (%rsp),%xmm0
movsd  %xmm0,0x30(%rsp,%r13,8)
add    $0x1e,%rbp
add    $0x8,%rbx
cmp    $0x168,%rbp
jne    12d0 <getPhase+0x1b0>
movsd  0x8(%rsp),%xmm4
addsd  %xmm0,%xmm4
add    $0x1,%r13
cmp    $0xc,%r13
jne    12a0 <getPhase+0x180>
movapd %xmm7,%xmm0
mulsd  0xce8(%rip),%xmm0
movsd  0x30(%rsp),%xmm1
movsd  0x38(%rsp),%xmm2
movapd %xmm1,%xmm3
cmpltsd %xmm4,%xmm3
andpd  %xmm0,%xmm3
minsd  %xmm4,%xmm1
movapd %xmm2,%xmm0
cmpltsd %xmm1,%xmm0
movapd %xmm0,%xmm4
andnpd %xmm3,%xmm4
andpd  %xmm7,%xmm0
orpd   %xmm4,%xmm0
minsd  %xmm1,%xmm2
movsd  0x40(%rsp),%xmm1
movapd %xmm1,%xmm3
cmpltsd %xmm2,%xmm3
movapd %xmm3,%xmm4
andnpd %xmm0,%xmm4
movapd %xmm7,%xmm0
addsd  %xmm7,%xmm0
andpd  %xmm0,%xmm3
orpd   %xmm4,%xmm3
minsd  %xmm2,%xmm1
movsd  0x48(%rsp),%xmm0
movapd %xmm0,%xmm2
cmpltsd %xmm1,%xmm2
movapd %xmm2,%xmm4
andnpd %xmm3,%xmm4
movapd %xmm7,%xmm3
mulsd  0xc18(%rip),%xmm3
andpd  %xmm3,%xmm2
orpd   %xmm4,%xmm2
minsd  %xmm1,%xmm0
movsd  0x50(%rsp),%xmm1
movapd %xmm1,%xmm3
cmpltsd %xmm0,%xmm3
movapd %xmm3,%xmm4
andnpd %xmm2,%xmm4
movapd %xmm7,%xmm2
mulsd  0xbf1(%rip),%xmm2
andpd  %xmm2,%xmm3
orpd   %xmm4,%xmm3
minsd  %xmm0,%xmm1
movsd  0x58(%rsp),%xmm0
movapd %xmm0,%xmm2
cmpltsd %xmm1,%xmm2
movapd %xmm2,%xmm4
andnpd %xmm3,%xmm4
movapd %xmm7,%xmm3
mulsd  0xbca(%rip),%xmm3
andpd  %xmm3,%xmm2
orpd   %xmm4,%xmm2
minsd  %xmm1,%xmm0
movsd  0x60(%rsp),%xmm1
movapd %xmm1,%xmm3
cmpltsd %xmm0,%xmm3
movapd %xmm3,%xmm4
andnpd %xmm2,%xmm4
movapd %xmm7,%xmm2
mulsd  0xba3(%rip),%xmm2
andpd  %xmm2,%xmm3
orpd   %xmm4,%xmm3
minsd  %xmm0,%xmm1
movsd  0x68(%rsp),%xmm0
movapd %xmm0,%xmm2
cmpltsd %xmm1,%xmm2
movapd %xmm2,%xmm4
andnpd %xmm3,%xmm4
movapd %xmm7,%xmm3
mulsd  0xb7c(%rip),%xmm3
andpd  %xmm3,%xmm2
orpd   %xmm4,%xmm2
minsd  %xmm1,%xmm0
movsd  0x70(%rsp),%xmm1
movapd %xmm1,%xmm3
cmpltsd %xmm0,%xmm3
movapd %xmm3,%xmm4
andnpd %xmm2,%xmm4
movapd %xmm7,%xmm2
mulsd  0xb55(%rip),%xmm2
andpd  %xmm2,%xmm3
orpd   %xmm4,%xmm3
minsd  %xmm0,%xmm1
movsd  0x78(%rsp),%xmm0
movapd %xmm0,%xmm2
cmpltsd %xmm1,%xmm2
movapd %xmm2,%xmm4
andnpd %xmm3,%xmm4
movapd %xmm7,%xmm3
mulsd  0xb2e(%rip),%xmm3
andpd  %xmm3,%xmm2
orpd   %xmm4,%xmm2
minsd  %xmm1,%xmm0
movsd  0x80(%rsp),%xmm1
movapd %xmm1,%xmm3
cmpltsd %xmm0,%xmm3
movapd %xmm3,%xmm4
andnpd %xmm2,%xmm4
movapd %xmm7,%xmm2
mulsd  0xb04(%rip),%xmm2
andpd  %xmm2,%xmm3
orpd   %xmm4,%xmm3
minsd  %xmm0,%xmm1
movsd  0x88(%rsp),%xmm0
cmpltsd %xmm1,%xmm0
movapd %xmm0,%xmm1
andnpd %xmm3,%xmm1
mulsd  0xae2(%rip),%xmm7
andpd  %xmm7,%xmm0
orpd   %xmm1,%xmm0
addsd  %xmm0,%xmm8
add    $0x1,%r15d
cmp    $0x4,%r15d
jne    1260 <getPhase+0x140>
cvttsd2si %xmm8,%eax
add    $0xa8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @getPhase(double* nocapture %0) {
%2 = alloca [12 x double]
%3 = load double, double* %0
%4 = fcmp ogt double %3, -9.990000e+02
%5 = select i1 %4, double %3, double -9.990000e+02
%6 = fcmp olt double %3, 9.990000e+02
%7 = select i1 %6, double %3, double 9.990000e+02
%8 = getelementptr inbounds double, double* %0, i64 1
%9 = load double, double* %8
%10 = fcmp ogt double %9, %5
%11 = select i1 %10, double %9, double %5
%12 = fcmp olt double %9, %7
%13 = select i1 %12, double %9, double %7
%14 = getelementptr inbounds double, double* %0, i64 2
%15 = load double, double* %14
%16 = fcmp ogt double %15, %11
%17 = select i1 %16, double %15, double %11
%18 = fcmp olt double %15, %13
%19 = select i1 %18, double %15, double %13
%20 = getelementptr inbounds double, double* %0, i64 3
%21 = load double, double* %20
%22 = fcmp ogt double %21, %17
%23 = select i1 %22, double %21, double %17
%24 = fcmp olt double %21, %19
%25 = select i1 %24, double %21, double %19
%26 = getelementptr inbounds double, double* %0, i64 4
%27 = load double, double* %26
%28 = fcmp ogt double %27, %23
%29 = select i1 %28, double %27, double %23
%30 = fcmp olt double %27, %25
%31 = select i1 %30, double %27, double %25
%32 = getelementptr inbounds double, double* %0, i64 5
%33 = load double, double* %32
%34 = fcmp ogt double %33, %29
%35 = select i1 %34, double %33, double %29
%36 = fcmp olt double %33, %31
%37 = select i1 %36, double %33, double %31
%38 = getelementptr inbounds double, double* %0, i64 6
%39 = load double, double* %38
%40 = fcmp ogt double %39, %35
%41 = select i1 %40, double %39, double %35
%42 = fcmp olt double %39, %37
%43 = select i1 %42, double %39, double %37
%44 = getelementptr inbounds double, double* %0, i64 7
%45 = load double, double* %44
%46 = fcmp ogt double %45, %41
%47 = select i1 %46, double %45, double %41
%48 = fcmp olt double %45, %43
%49 = select i1 %48, double %45, double %43
%50 = getelementptr inbounds double, double* %0, i64 8
%51 = load double, double* %50
%52 = fcmp ogt double %51, %47
%53 = select i1 %52, double %51, double %47
%54 = fcmp olt double %51, %49
%55 = select i1 %54, double %51, double %49
%56 = getelementptr inbounds double, double* %0, i64 9
%57 = load double, double* %56
%58 = fcmp ogt double %57, %53
%59 = select i1 %58, double %57, double %53
%60 = fcmp olt double %57, %55
%61 = select i1 %60, double %57, double %55
%62 = getelementptr inbounds double, double* %0, i64 10
%63 = load double, double* %62
%64 = fcmp ogt double %63, %59
%65 = select i1 %64, double %63, double %59
%66 = fcmp olt double %63, %61
%67 = select i1 %66, double %63, double %61
%68 = getelementptr inbounds double, double* %0, i64 11
%69 = load double, double* %68
%70 = fcmp ogt double %69, %65
%71 = select i1 %70, double %69, double %65
%72 = fcmp olt double %69, %67
%73 = select i1 %72, double %69, double %67
%74 = fsub double %71, %73
%75 = fmul double %74, 5.000000e-01
%76 = fadd double %73, %71
%77 = fmul double %76, 5.000000e-01
%78 = bitcast [12 x double]* %2 to i8*
%79 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 0
%80 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 1
%81 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 2
%82 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 3
%83 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 4
%84 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 5
%85 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 6
%86 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 7
%87 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 8
%88 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 9
%89 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 10
%90 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 11
br label %91
91: ; preds = %1, %129
%92 = phi i32 [ 1, %1 ], [ %189, %129 ]
%93 = phi double [ 0.000000e+00, %1 ], [ %188, %129 ]
%94 = icmp eq i32 %92, 2
%95 = select i1 %94, double 2.500000e+00, double 0x3FCAAAAAAAAAAAAB
%96 = icmp eq i32 %92, 1
%97 = select i1 %96, double 3.000000e+01, double %95
br label %98
98: ; preds = %91, %125
%99 = phi i64 [ %127, %125 ], [ 0, %91 ]
%100 = phi double [ %126, %125 ], [ 0.000000e+00, %91 ]
%101 = getelementptr inbounds [12 x double], [12 x double]* %2, i64 0, i64 %99
store double 0.000000e+00, double* %101
%102 = trunc i64 %99 to i32
%103 = sitofp i32 %102 to double
br label %104
104: ; preds = %98, %104
%105 = phi double [ 0.000000e+00, %98 ], [ %122, %104 ]
%106 = phi i64 [ 0, %98 ], [ %123, %104 ]
%107 = trunc i64 %106 to i32
%108 = mul i32 %107, 30
%109 = sitofp i32 %108 to double
%110 = tail call double @llvm.fmuladd.f64(double %103, double %97, double %109)
%111 = fadd double %93, %110
%112 = fmul double %111, 0x400921FA00000000
%113 = fdiv double %112, 1.800000e+02
%114 = fptosi double %113 to i32
%115 = tail call double @sin(i32 %114)
%116 = tail call double @llvm.fmuladd.f64(double %75, double %115, double %77)
%117 = getelementptr inbounds double, double* %0, i64 %106
%118 = load double, double* %117
%119 = fsub double %116, %118
%120 = tail call i64 @fabs(double %119)
%121 = sitofp i64 %120 to double
%122 = fadd double %105, %121
store double %122, double* %101
%123 = add nuw nsw i64 %106, 1
%124 = icmp eq i64 %123, 12
br i1 %124, label %125, label %104
125: ; preds = %104
%126 = fadd double %100, %122
%127 = add nuw nsw i64 %99, 1
%128 = icmp eq i64 %127, 12
br i1 %128, label %129, label %98
129: ; preds = %125
%130 = load double, double* %79
%131 = fcmp olt double %130, %126
%132 = fmul double %97, 0.000000e+00
%133 = select i1 %131, double %132, double 0.000000e+00
%134 = select i1 %131, double %130, double %126
%135 = load double, double* %80
%136 = fcmp olt double %135, %134
%137 = select i1 %136, double %97, double %133
%138 = select i1 %136, double %135, double %134
%139 = load double, double* %81
%140 = fcmp olt double %139, %138
%141 = fmul double %97, 2.000000e+00
%142 = select i1 %140, double %141, double %137
%143 = select i1 %140, double %139, double %138
%144 = load double, double* %82
%145 = fcmp olt double %144, %143
%146 = fmul double %97, 3.000000e+00
%147 = select i1 %145, double %146, double %142
%148 = select i1 %145, double %144, double %143
%149 = load double, double* %83
%150 = fcmp olt double %149, %148
%151 = fmul double %97, 4.000000e+00
%152 = select i1 %150, double %151, double %147
%153 = select i1 %150, double %149, double %148
%154 = load double, double* %84
%155 = fcmp olt double %154, %153
%156 = fmul double %97, 5.000000e+00
%157 = select i1 %155, double %156, double %152
%158 = select i1 %155, double %154, double %153
%159 = load double, double* %85
%160 = fcmp olt double %159, %158
%161 = fmul double %97, 6.000000e+00
%162 = select i1 %160, double %161, double %157
%163 = select i1 %160, double %159, double %158
%164 = load double, double* %86
%165 = fcmp olt double %164, %163
%166 = fmul double %97, 7.000000e+00
%167 = select i1 %165, double %166, double %162
%168 = select i1 %165, double %164, double %163
%169 = load double, double* %87
%170 = fcmp olt double %169, %168
%171 = fmul double %97, 8.000000e+00
%172 = select i1 %170, double %171, double %167
%173 = select i1 %170, double %169, double %168
%174 = load double, double* %88
%175 = fcmp olt double %174, %173
%176 = fmul double %97, 9.000000e+00
%177 = select i1 %175, double %176, double %172
%178 = select i1 %175, double %174, double %173
%179 = load double, double* %89
%180 = fcmp olt double %179, %178
%181 = fmul double %97, 1.000000e+01
%182 = select i1 %180, double %181, double %177
%183 = select i1 %180, double %179, double %178
%184 = load double, double* %90
%185 = fcmp olt double %184, %183
%186 = fmul double %97, 1.100000e+01
%187 = select i1 %185, double %186, double %182
%188 = fadd double %93, %187
%189 = add nuw nsw i32 %92, 1
%190 = icmp eq i32 %189, 4
br i1 %190, label %191, label %91
191: ; preds = %129
%192 = fptosi double %188 to i32
ret i32 %192
}