#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 */
double rgamma(double);
void genPi(int K, double PiLow, double *Pi) {
  int flag, k;
  double s;
  flag = 0;
  if ((PiLow >= 1) | (PiLow <= 0)) {
    for (k = 0; k < K; k++) {
      Pi[k] = 1.0 / K;
    }
  } else {
    s = 0.0;
    for (k = 0; k < K; k++) {
      Pi[k] = rgamma(1.0);
      s += Pi[k];
    }
    for (k = 0; k < K; k++) {
      Pi[k] = PiLow + Pi[k] / s * (1 - K * PiLow);
      if (Pi[k] < PiLow) {
        flag = 1;
        break;
      }
    }
    if (flag == 1) {
      for (k = 0; k < K; k++) {
        Pi[k] = 1.0 / K;
      }
    }
  }
}


x86 assembly (clang, -O0):
<genPi>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xec8(%rip),%xmm1
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
setae  %cl
and    $0x1,%cl
movzbl %cl,%ecx
or     %ecx,%eax
cmp    $0x0,%eax
je     11a4 <genPi+0x94>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    119f <genPi+0x8f>
cvtsi2sdl -0x4(%rbp),%xmm1
movsd  0xe80(%rip),%xmm0
divsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1167 <genPi+0x57>
jmp    12fc <genPi+0x1ec>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11fe <genPi+0xee>
movsd  0xe39(%rip),%xmm0
call   1030 <rgamma@plt>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11b3 <genPi+0xa3>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12a9 <genPi+0x199>
movsd  -0x10(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  -0x28(%rbp),%xmm0
cvtsi2sdl -0x4(%rbp),%xmm2
movsd  -0x10(%rbp),%xmm3
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm2
movsd  0xdab(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1296 <genPi+0x186>
movl   $0x1,-0x1c(%rbp)
jmp    12a9 <genPi+0x199>
jmp    129b <genPi+0x18b>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1205 <genPi+0xf5>
cmpl   $0x1,-0x1c(%rbp)
jne    12f7 <genPi+0x1e7>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12f2 <genPi+0x1e2>
cvtsi2sdl -0x4(%rbp),%xmm1
movsd  0xd2d(%rip),%xmm0
divsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12ba <genPi+0x1aa>
jmp    12f7 <genPi+0x1e7>
jmp    12fc <genPi+0x1ec>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<genPi>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x18,%rsp
mov    %rsi,%rbx
mov    %edi,%r14d
ucomisd 0xed8(%rip),%xmm0
jae    11ea <genPi+0xda>
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jae    11ea <genPi+0xda>
test   %r14d,%r14d
jle    143e <genPi+0x32e>
movsd  %xmm0,0x8(%rsp)
mov    %r14d,%r15d
xorpd  %xmm5,%xmm5
xor    %ebp,%ebp
movsd  0xea4(%rip),%xmm3
nopl   0x0(%rax)
movsd  %xmm5,0x10(%rsp)
movapd %xmm3,%xmm0
call   1030 <rgamma@plt>
movsd  0x10(%rsp),%xmm5
movsd  0xe83(%rip),%xmm3
movsd  %xmm0,(%rbx,%rbp,8)
addsd  %xmm0,%xmm5
add    $0x1,%rbp
cmp    %rbp,%r15
jne    1160 <genPi+0x50>
test   %r14d,%r14d
movsd  0x8(%rsp),%xmm4
jle    143e <genPi+0x32e>
xorps  %xmm0,%xmm0
cvtsi2sd %r14d,%xmm0
movapd %xmm0,%xmm2
mulsd  %xmm4,%xmm2
movapd %xmm3,%xmm1
subsd  %xmm2,%xmm1
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movsd  (%rbx,%rax,8),%xmm2
divsd  %xmm5,%xmm2
mulsd  %xmm1,%xmm2
addsd  %xmm4,%xmm2
movsd  %xmm2,(%rbx,%rax,8)
ucomisd %xmm2,%xmm4
ja     1245 <genPi+0x135>
add    $0x1,%rax
cmp    %rax,%r15
jne    11c0 <genPi+0xb0>
jmp    143e <genPi+0x32e>
test   %r14d,%r14d
jle    143e <genPi+0x32e>
xorps  %xmm1,%xmm1
cvtsi2sd %r14d,%xmm1
movsd  0xdfd(%rip),%xmm0
divsd  %xmm1,%xmm0
mov    %r14d,%eax
cmp    $0x4,%r14d
jae    1217 <genPi+0x107>
xor    %ecx,%ecx
jmp    1320 <genPi+0x210>
mov    %eax,%ecx
and    $0xfffffffc,%ecx
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x4(%rcx),%rdi
mov    %rdi,%rsi
shr    $0x2,%rsi
add    $0x1,%rsi
mov    %esi,%edx
and    $0x7,%edx
cmp    $0x1c,%rdi
jae    125a <genPi+0x14a>
xor    %edi,%edi
jmp    12e5 <genPi+0x1d5>
divsd  %xmm0,%xmm3
cmp    $0x4,%r14d
jae    1333 <genPi+0x223>
xor    %eax,%eax
jmp    1430 <genPi+0x320>
and    $0xfffffffffffffff8,%rsi
xor    %edi,%edi
movupd %xmm1,(%rbx,%rdi,8)
movupd %xmm1,0x10(%rbx,%rdi,8)
movupd %xmm1,0x20(%rbx,%rdi,8)
movupd %xmm1,0x30(%rbx,%rdi,8)
movupd %xmm1,0x40(%rbx,%rdi,8)
movupd %xmm1,0x50(%rbx,%rdi,8)
movupd %xmm1,0x60(%rbx,%rdi,8)
movupd %xmm1,0x70(%rbx,%rdi,8)
movupd %xmm1,0x80(%rbx,%rdi,8)
movupd %xmm1,0x90(%rbx,%rdi,8)
movupd %xmm1,0xa0(%rbx,%rdi,8)
movupd %xmm1,0xb0(%rbx,%rdi,8)
movupd %xmm1,0xc0(%rbx,%rdi,8)
movupd %xmm1,0xd0(%rbx,%rdi,8)
movupd %xmm1,0xe0(%rbx,%rdi,8)
movupd %xmm1,0xf0(%rbx,%rdi,8)
add    $0x20,%rdi
add    $0xfffffffffffffff8,%rsi
jne    1260 <genPi+0x150>
test   %rdx,%rdx
je     1314 <genPi+0x204>
lea    (%rbx,%rdi,8),%rsi
add    $0x10,%rsi
shl    $0x5,%rdx
xor    %edi,%edi
nopl   0x0(%rax,%rax,1)
movupd %xmm1,-0x10(%rsi,%rdi,1)
movupd %xmm1,(%rsi,%rdi,1)
add    $0x20,%rdi
cmp    %rdi,%rdx
jne    1300 <genPi+0x1f0>
cmp    %rax,%rcx
je     143e <genPi+0x32e>
nopl   (%rax)
movsd  %xmm0,(%rbx,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1320 <genPi+0x210>
jmp    143e <genPi+0x32e>
mov    %r15d,%eax
and    $0xfffffffc,%eax
movapd %xmm3,%xmm0
unpcklpd %xmm3,%xmm0
lea    -0x4(%rax),%rsi
mov    %rsi,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x1c,%rsi
jae    1362 <genPi+0x252>
xor    %esi,%esi
jmp    13f5 <genPi+0x2e5>
and    $0xfffffffffffffff8,%rdx
xor    %esi,%esi
nopl   0x0(%rax,%rax,1)
movupd %xmm0,(%rbx,%rsi,8)
movupd %xmm0,0x10(%rbx,%rsi,8)
movupd %xmm0,0x20(%rbx,%rsi,8)
movupd %xmm0,0x30(%rbx,%rsi,8)
movupd %xmm0,0x40(%rbx,%rsi,8)
movupd %xmm0,0x50(%rbx,%rsi,8)
movupd %xmm0,0x60(%rbx,%rsi,8)
movupd %xmm0,0x70(%rbx,%rsi,8)
movupd %xmm0,0x80(%rbx,%rsi,8)
movupd %xmm0,0x90(%rbx,%rsi,8)
movupd %xmm0,0xa0(%rbx,%rsi,8)
movupd %xmm0,0xb0(%rbx,%rsi,8)
movupd %xmm0,0xc0(%rbx,%rsi,8)
movupd %xmm0,0xd0(%rbx,%rsi,8)
movupd %xmm0,0xe0(%rbx,%rsi,8)
movupd %xmm0,0xf0(%rbx,%rsi,8)
add    $0x20,%rsi
add    $0xfffffffffffffff8,%rdx
jne    1370 <genPi+0x260>
test   %rcx,%rcx
je     1424 <genPi+0x314>
lea    (%rbx,%rsi,8),%rdx
add    $0x10,%rdx
shl    $0x5,%rcx
xor    %esi,%esi
nopl   0x0(%rax,%rax,1)
movupd %xmm0,-0x10(%rdx,%rsi,1)
movupd %xmm0,(%rdx,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%rcx
jne    1410 <genPi+0x300>
cmp    %r15,%rax
je     143e <genPi+0x32e>
nopl   0x0(%rax)
movsd  %xmm3,(%rbx,%rax,8)
add    $0x1,%rax
cmp    %rax,%r15
jne    1430 <genPi+0x320>
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @genPi(i32 %0, double %1, double* %2) {
%4 = alloca i32
%5 = alloca double
%6 = alloca double*
%7 = alloca i32
%8 = alloca i32
%9 = alloca double
store i32 %0, i32* %4
store double %1, double* %5
store double* %2, double** %6
store i32 0, i32* %7
%10 = load double, double* %5
%11 = fcmp oge double %10, 1.000000e+00
%12 = zext i1 %11 to i32
%13 = load double, double* %5
%14 = fcmp ole double %13, 0.000000e+00
%15 = zext i1 %14 to i32
%16 = or i32 %12, %15
%17 = icmp ne i32 %16, 0
br i1 %17, label %18, label %35
18: ; preds = %3
store i32 0, i32* %8
br label %19
19: ; preds = %31, %18
%20 = load i32, i32* %8
%21 = load i32, i32* %4
%22 = icmp slt i32 %20, %21
br i1 %22, label %23, label %34
23: ; preds = %19
%24 = load i32, i32* %4
%25 = sitofp i32 %24 to double
%26 = fdiv double 1.000000e+00, %25
%27 = load double*, double** %6
%28 = load i32, i32* %8
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds double, double* %27, i64 %29
store double %26, double* %30
br label %31
31: ; preds = %23
%32 = load i32, i32* %8
%33 = add nsw i32 %32, 1
store i32 %33, i32* %8
br label %19
34: ; preds = %19
br label %113
35: ; preds = %3
store double 0.000000e+00, double* %9
store i32 0, i32* %8
br label %36
36: ; preds = %53, %35
%37 = load i32, i32* %8
%38 = load i32, i32* %4
%39 = icmp slt i32 %37, %38
br i1 %39, label %40, label %56
40: ; preds = %36
%41 = call double @rgamma(double 1.000000e+00)
%42 = load double*, double** %6
%43 = load i32, i32* %8
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds double, double* %42, i64 %44
store double %41, double* %45
%46 = load double*, double** %6
%47 = load i32, i32* %8
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds double, double* %46, i64 %48
%50 = load double, double* %49
%51 = load double, double* %9
%52 = fadd double %51, %50
store double %52, double* %9
br label %53
53: ; preds = %40
%54 = load i32, i32* %8
%55 = add nsw i32 %54, 1
store i32 %55, i32* %8
br label %36
56: ; preds = %36
store i32 0, i32* %8
br label %57
57: ; preds = %89, %56
%58 = load i32, i32* %8
%59 = load i32, i32* %4
%60 = icmp slt i32 %58, %59
br i1 %60, label %61, label %92
61: ; preds = %57
%62 = load double, double* %5
%63 = load double*, double** %6
%64 = load i32, i32* %8
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds double, double* %63, i64 %65
%67 = load double, double* %66
%68 = load double, double* %9
%69 = fdiv double %67, %68
%70 = load i32, i32* %4
%71 = sitofp i32 %70 to double
%72 = load double, double* %5
%73 = fneg double %71
%74 = call double @llvm.fmuladd.f64(double %73, double %72, double 1.000000e+00)
%75 = call double @llvm.fmuladd.f64(double %69, double %74, double %62)
%76 = load double*, double** %6
%77 = load i32, i32* %8
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds double, double* %76, i64 %78
store double %75, double* %79
%80 = load double*, double** %6
%81 = load i32, i32* %8
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds double, double* %80, i64 %82
%84 = load double, double* %83
%85 = load double, double* %5
%86 = fcmp olt double %84, %85
br i1 %86, label %87, label %88
87: ; preds = %61
store i32 1, i32* %7
br label %92
88: ; preds = %61
br label %89
89: ; preds = %88
%90 = load i32, i32* %8
%91 = add nsw i32 %90, 1
store i32 %91, i32* %8
br label %57
92: ; preds = %87, %57
%93 = load i32, i32* %7
%94 = icmp eq i32 %93, 1
br i1 %94, label %95, label %112
95: ; preds = %92
store i32 0, i32* %8
br label %96
96: ; preds = %108, %95
%97 = load i32, i32* %8
%98 = load i32, i32* %4
%99 = icmp slt i32 %97, %98
br i1 %99, label %100, label %111
100: ; preds = %96
%101 = load i32, i32* %4
%102 = sitofp i32 %101 to double
%103 = fdiv double 1.000000e+00, %102
%104 = load double*, double** %6
%105 = load i32, i32* %8
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds double, double* %104, i64 %106
store double %103, double* %107
br label %108
108: ; preds = %100
%109 = load i32, i32* %8
%110 = add nsw i32 %109, 1
store i32 %110, i32* %8
br label %96
111: ; preds = %96
br label %112
112: ; preds = %111, %92
br label %113
113: ; preds = %112, %34
ret void
}

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