#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 exp(float);
double fabs(double);
void gaulag(float x[], float w[], int n, float alf) {
  float gammln(float xx);
  void nrerror(char error_text[]);
  int i, its, j;
  float ai;
  double p1, p2, p3, pp, z, z1;
  for (i = 1; i <= n; i++) {
    if (i == 1) {
      z = (1.0 + alf) * (3.0 + 0.92 * alf) / (1.0 + 2.4 * n + 1.8 * alf);
    } else if (i == 2) {
      z += (15.0 + 6.25 * alf) / (1.0 + 0.9 * alf + 2.5 * n);
    } else {
      ai = i - 2;
      z += ((1.0 + 2.55 * ai) / (1.9 * ai) +
            1.26 * ai * alf / (1.0 + 3.5 * ai)) *
           (z - x[i - 2]) / (1.0 + 0.3 * alf);
    }
    for (its = 1; its <= 10; its++) {
      p1 = 1.0;
      p2 = 0.0;
      for (j = 1; j <= n; j++) {
        p3 = p2;
        p2 = p1;
        p1 = ((2 * j - 1 + alf - z) * p2 - (j - 1 + alf) * p3) / j;
      }
      pp = (n * p1 - (n + alf) * p2) / z;
      z1 = z;
      z = z1 - p1 / pp;
      if (fabs(z - z1) <= 3.0e-14)
        break;
    }
    if (its > 10)
      nrerror("too many iterations in gaulag");
    x[i] = z;
    w[i] = -exp(gammln(alf + n) - gammln((float)n)) / (pp * n * p2);
  }
}


x86 assembly (clang, -O0):
<gaulag>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movss  %xmm0,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     1555 <gaulag+0x425>
cmpl   $0x1,-0x1c(%rbp)
jne    11e3 <gaulag+0xb3>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe92(%rip),%xmm0
addsd  %xmm1,%xmm0
movss  -0x18(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xed5(%rip),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xed1(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x14(%rbp),%xmm2
movsd  0xeac(%rip),%xmm1
mulsd  %xmm1,%xmm2
movsd  0xe50(%rip),%xmm1
addsd  %xmm1,%xmm2
movss  -0x18(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe83(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    1342 <gaulag+0x212>
cmpl   $0x2,-0x1c(%rbp)
jne    1257 <gaulag+0x127>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe42(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe3e(%rip),%xmm1
addsd  %xmm1,%xmm0
movss  -0x18(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe19(%rip),%xmm1
mulsd  %xmm1,%xmm2
movsd  0xddd(%rip),%xmm1
addsd  %xmm1,%xmm2
cvtsi2sdl -0x14(%rbp),%xmm1
movsd  0xdf4(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    133d <gaulag+0x20d>
mov    -0x1c(%rbp),%eax
sub    $0x2,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdb1(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd85(%rip),%xmm1
addsd  %xmm1,%xmm0
movss  -0x28(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd88(%rip),%xmm1
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movss  -0x28(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd67(%rip),%xmm1
mulsd  %xmm2,%xmm1
movss  -0x18(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm1
movss  -0x28(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movsd  0xd3d(%rip),%xmm3
mulsd  %xmm3,%xmm2
movsd  0xd29(%rip),%xmm3
addsd  %xmm3,%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  -0x50(%rbp),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm2
cvtss2sd %xmm2,%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movss  -0x18(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xce1(%rip),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xcdd(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    1342 <gaulag+0x212>
movl   $0x1,-0x20(%rbp)
cmpl   $0xa,-0x20(%rbp)
jg     14a9 <gaulag+0x379>
movsd  0xcad(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     1402 <gaulag+0x2d2>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm0
addss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
addss  -0x18(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  -0x40(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsi2sdl -0x24(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    136f <gaulag+0x23f>
cvtsi2sdl -0x14(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
cvtsi2ssl -0x14(%rbp),%xmm1
addss  -0x18(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  -0x38(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
divsd  -0x48(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm1
subsd  -0x58(%rbp),%xmm1
movaps 0xc05(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  0xbe9(%rip),%xmm0
ucomisd %xmm1,%xmm0
jb     1496 <gaulag+0x366>
jmp    14a9 <gaulag+0x379>
jmp    149b <gaulag+0x36b>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1349 <gaulag+0x219>
cmpl   $0xa,-0x20(%rbp)
jle    14bf <gaulag+0x38f>
lea    0xbd6(%rip),%rdi
call   1030 <nrerror@plt>
movsd  -0x50(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x18(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
addss  %xmm1,%xmm0
call   1050 <gammln@plt>
movss  %xmm0,-0x5c(%rbp)
cvtsi2ssl -0x14(%rbp),%xmm0
call   1050 <gammln@plt>
movaps %xmm0,%xmm1
movss  -0x5c(%rbp),%xmm0
subss  %xmm1,%xmm0
call   1040 <exp@plt>
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  -0x48(%rbp),%xmm1
cvtsi2sdl -0x14(%rbp),%xmm2
mulsd  %xmm2,%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    114f <gaulag+0x1f>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gaulag>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
test   %edx,%edx
jle    14be <gaulag+0x38e>
movaps %xmm0,%xmm4
mov    %edx,%ebx
mov    %rsi,%r14
mov    %rdi,%r15
cvtss2sd %xmm0,%xmm2
movsd  0xea3(%rip),%xmm3
mulsd  %xmm2,%xmm3
addsd  0xe9f(%rip),%xmm3
movsd  0xe9f(%rip),%xmm0
mulsd  %xmm2,%xmm0
movsd  0xe9a(%rip),%xmm10
cvtsi2sd %edx,%xmm8
addsd  %xmm10,%xmm0
movsd  0xe90(%rip),%xmm1
mulsd  %xmm8,%xmm1
addsd  %xmm0,%xmm1
divsd  %xmm1,%xmm3
movsd  %xmm3,0x38(%rsp)
movapd %xmm2,%xmm0
addsd  %xmm10,%xmm0
movsd  0xe74(%rip),%xmm3
mulsd  %xmm2,%xmm3
addsd  0xe70(%rip),%xmm3
mulsd  %xmm0,%xmm3
movsd  0xe6c(%rip),%xmm0
mulsd  %xmm8,%xmm0
addsd  %xmm10,%xmm0
movsd  0xe62(%rip),%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
divsd  %xmm1,%xmm3
movsd  %xmm3,0x30(%rsp)
movsd  0xe50(%rip),%xmm0
movsd  %xmm2,0x40(%rsp)
mulsd  %xmm2,%xmm0
addsd  %xmm10,%xmm0
movsd  %xmm0,0x28(%rsp)
xorps  %xmm0,%xmm0
cvtsi2ss %edx,%xmm0
movss  %xmm0,0x1c(%rsp)
addss  %xmm4,%xmm0
movss  %xmm0,0x18(%rsp)
cvtss2sd %xmm0,%xmm9
lea    0x1(%rbx),%r13d
mov    $0x1,%ebp
movapd 0xe46(%rip),%xmm6
movsd  0xe2e(%rip),%xmm7
lea    0xe57(%rip),%r12
movss  %xmm4,0x20(%rsp)
movsd  %xmm8,0x50(%rsp)
movsd  %xmm9,0x48(%rsp)
jmp    1346 <gaulag+0x216>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r12,%rdi
movsd  %xmm2,(%rsp)
movsd  %xmm5,0x10(%rsp)
movsd  %xmm3,0x8(%rsp)
call   1030 <nrerror@plt>
movsd  0x8(%rsp),%xmm3
movsd  0x10(%rsp),%xmm5
movsd  (%rsp),%xmm2
movsd  %xmm3,0x8(%rsp)
movsd  %xmm5,0x10(%rsp)
movsd  %xmm2,(%rsp)
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
movss  %xmm0,(%r15,%rbp,4)
movss  0x18(%rsp),%xmm0
call   1050 <gammln@plt>
movss  %xmm0,0x24(%rsp)
movss  0x1c(%rsp),%xmm0
call   1050 <gammln@plt>
movss  0x24(%rsp),%xmm1
subss  %xmm0,%xmm1
movaps %xmm1,%xmm0
call   1040 <exp@plt>
movsd  0xd82(%rip),%xmm7
movapd 0xd8a(%rip),%xmm6
movsd  0x48(%rsp),%xmm9
movsd  0x50(%rsp),%xmm8
movsd  0xd0b(%rip),%xmm10
movss  0x20(%rsp),%xmm4
xorps  0xd76(%rip),%xmm0
movsd  0x8(%rsp),%xmm1
mulsd  %xmm8,%xmm1
mulsd  0x10(%rsp),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r14,%rbp,4)
add    $0x1,%rbp
cmp    %r13,%rbp
je     14be <gaulag+0x38e>
cmp    $0x1,%ebp
je     1360 <gaulag+0x230>
cmp    $0x2,%ebp
jne    1370 <gaulag+0x240>
movsd  (%rsp),%xmm0
addsd  0x38(%rsp),%xmm0
jmp    13f9 <gaulag+0x2c9>
movsd  0x30(%rsp),%xmm0
mov    %ebp,%eax
jmp    1400 <gaulag+0x2d0>
nopl   (%rax)
lea    -0x2(%rbp),%rax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
cvtss2sd %xmm0,%xmm0
movaps %xmm0,%xmm1
mulsd  0xcc6(%rip),%xmm1
addsd  %xmm10,%xmm1
movaps %xmm0,%xmm2
mulsd  0xcbe(%rip),%xmm2
movaps %xmm0,%xmm3
mulsd  0xcbb(%rip),%xmm3
mulsd  0x40(%rsp),%xmm3
unpcklpd %xmm3,%xmm1
mulsd  0xcb1(%rip),%xmm0
addsd  %xmm10,%xmm0
unpcklpd %xmm0,%xmm2
divpd  %xmm2,%xmm1
movapd %xmm1,%xmm2
unpckhpd %xmm1,%xmm2
addsd  %xmm1,%xmm2
movss  -0x8(%r15,%rbp,4),%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm0,%xmm1
movsd  (%rsp),%xmm3
movapd %xmm3,%xmm0
subsd  %xmm1,%xmm0
mulsd  %xmm2,%xmm0
divsd  0x28(%rsp),%xmm0
addsd  %xmm3,%xmm0
mov    $0x1,%eax
xchg   %ax,%ax
xorpd  %xmm2,%xmm2
xor    %ecx,%ecx
mov    $0x1,%edx
movapd %xmm10,%xmm1
movapd %xmm1,%xmm5
xorps  %xmm1,%xmm1
cvtsi2ss %edx,%xmm1
addss  %xmm4,%xmm1
cvtss2sd %xmm1,%xmm1
xorps  %xmm3,%xmm3
cvtsi2ss %ecx,%xmm3
subsd  %xmm0,%xmm1
add    $0x1,%ecx
addss  %xmm4,%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm2,%xmm3
mulsd  %xmm5,%xmm1
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
subsd  %xmm3,%xmm1
divsd  %xmm2,%xmm1
add    $0x2,%edx
movapd %xmm5,%xmm2
cmp    %ecx,%ebx
jne    1410 <gaulag+0x2e0>
movaps %xmm9,%xmm2
mulsd  %xmm5,%xmm2
movapd %xmm8,%xmm3
mulsd  %xmm1,%xmm3
subsd  %xmm2,%xmm3
divsd  %xmm0,%xmm3
divsd  %xmm3,%xmm1
movapd %xmm0,%xmm2
subsd  %xmm1,%xmm2
movapd %xmm2,%xmm1
subsd  %xmm0,%xmm1
andpd  %xmm6,%xmm1
ucomisd %xmm1,%xmm7
jae    14b0 <gaulag+0x380>
add    $0x1,%eax
movapd %xmm2,%xmm0
cmp    $0xb,%eax
jne    1400 <gaulag+0x2d0>
jmp    1270 <gaulag+0x140>
nopw   0x0(%rax,%rax,1)
cmp    $0xb,%eax
jae    1270 <gaulag+0x140>
jmp    129a <gaulag+0x16a>
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [30 x i8] c"too many iterations in gaulag\00"
define void @gaulag(float* nocapture %0, float* nocapture writeonly %1, i32 %2, float %3) {
%5 = icmp slt i32 %2, 1
br i1 %5, label %114, label %6
6: ; preds = %4
%7 = fpext float %3 to double
%8 = tail call double @llvm.fmuladd.f64(double %7, double 6.250000e+00, double 1.500000e+01)
%9 = tail call double @llvm.fmuladd.f64(double %7, double 9.000000e-01, double 1.000000e+00)
%10 = sitofp i32 %2 to double
%11 = tail call double @llvm.fmuladd.f64(double %10, double 2.500000e+00, double %9)
%12 = fdiv double %8, %11
%13 = fadd double %7, 1.000000e+00
%14 = tail call double @llvm.fmuladd.f64(double %7, double 9.200000e-01, double 3.000000e+00)
%15 = fmul double %13, %14
%16 = tail call double @llvm.fmuladd.f64(double %10, double 2.400000e+00, double 1.000000e+00)
%17 = tail call double @llvm.fmuladd.f64(double %7, double 1.800000e+00, double %16)
%18 = fdiv double %15, %17
%19 = tail call double @llvm.fmuladd.f64(double %7, double 3.000000e-01, double 1.000000e+00)
%20 = sitofp i32 %2 to float
%21 = fadd float %20, %3
%22 = fpext float %21 to double
%23 = add nuw i32 %2, 1
%24 = zext i32 %23 to i64
br label %25
25: ; preds = %6, %99
%26 = phi i64 [ 1, %6 ], [ %112, %99 ]
%27 = phi double [ undef, %6 ], [ %89, %99 ]
%28 = trunc i64 %26 to i32
switch i32 %28, label %31 [
i32 1, label %56
i32 2, label %29
]
29: ; preds = %25
%30 = fadd double %12, %27
br label %56
31: ; preds = %25
%32 = add nsw i64 %26, -2
%33 = trunc i64 %32 to i32
%34 = sitofp i32 %33 to float
%35 = fpext float %34 to double
%36 = tail call double @llvm.fmuladd.f64(double %35, double 2.550000e+00, double 1.000000e+00)
%37 = fmul double %35, 1.900000e+00
%38 = fmul double %35, 1.260000e+00
%39 = fmul double %38, %7
%40 = tail call double @llvm.fmuladd.f64(double %35, double 3.500000e+00, double 1.000000e+00)
%41 = insertelement <2 x double> poison, double %36, i64 0
%42 = insertelement <2 x double> %41, double %39, i64 1
%43 = insertelement <2 x double> poison, double %37, i64 0
%44 = insertelement <2 x double> %43, double %40, i64 1
%45 = fdiv <2 x double> %42, %44
%46 = shufflevector <2 x double> %45, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%47 = fadd <2 x double> %45, %46
%48 = extractelement <2 x double> %47, i64 0
%49 = getelementptr inbounds float, float* %0, i64 %32
%50 = load float, float* %49
%51 = fpext float %50 to double
%52 = fsub double %27, %51
%53 = fmul double %48, %52
%54 = fdiv double %53, %19
%55 = fadd double %27, %54
br label %56
56: ; preds = %25, %29, %31
%57 = phi double [ %18, %25 ], [ %55, %31 ], [ %30, %29 ]
%58 = phi i32 [ %28, %25 ], [ 1, %31 ], [ 1, %29 ]
br label %59
59: ; preds = %56, %93
%60 = phi double [ %89, %93 ], [ %57, %56 ]
%61 = phi i32 [ %94, %93 ], [ %58, %56 ]
br label %62
62: ; preds = %59, %62
%63 = phi double [ %64, %62 ], [ 0.000000e+00, %59 ]
%64 = phi double [ %80, %62 ], [ 1.000000e+00, %59 ]
%65 = phi i32 [ %81, %62 ], [ 1, %59 ]
%66 = shl nuw nsw i32 %65, 1
%67 = add nsw i32 %66, -1
%68 = sitofp i32 %67 to float
%69 = fadd float %68, %3
%70 = fpext float %69 to double
%71 = fsub double %70, %60
%72 = add nsw i32 %65, -1
%73 = sitofp i32 %72 to float
%74 = fadd float %73, %3
%75 = fpext float %74 to double
%76 = fneg double %63
%77 = fmul double %76, %75
%78 = tail call double @llvm.fmuladd.f64(double %71, double %64, double %77)
%79 = sitofp i32 %65 to double
%80 = fdiv double %78, %79
%81 = add nuw i32 %65, 1
%82 = icmp eq i32 %65, %2
br i1 %82, label %83, label %62
83: ; preds = %62
%84 = fneg double %64
%85 = fmul double %22, %84
%86 = tail call double @llvm.fmuladd.f64(double %10, double %80, double %85)
%87 = fdiv double %86, %60
%88 = fdiv double %80, %87
%89 = fsub double %60, %88
%90 = fsub double %89, %60
%91 = tail call double @llvm.fabs.f64(double %90)
%92 = fcmp ugt double %91, 3.000000e-14
br i1 %92, label %93, label %96
93: ; preds = %83
%94 = add nuw nsw i32 %61, 1
%95 = icmp eq i32 %94, 11
br i1 %95, label %98, label %59
96: ; preds = %83
%97 = icmp ugt i32 %61, 10
br i1 %97, label %98, label %99
98: ; preds = %93, %96
tail call void @nrerror(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str, i64 0, i64 0))
br label %99
99: ; preds = %98, %96
%100 = fptrunc double %89 to float
%101 = getelementptr inbounds float, float* %0, i64 %26
store float %100, float* %101
%102 = tail call float @gammln(float %21)
%103 = tail call float @gammln(float %20)
%104 = fsub float %102, %103
%105 = tail call double @exp(float %104)
%106 = fneg double %105
%107 = fmul double %87, %10
%108 = fmul double %107, %64
%109 = fdiv double %106, %108
%110 = fptrunc double %109 to float
%111 = getelementptr inbounds float, float* %1, i64 %26
store float %110, float* %111
%112 = add nuw nsw i64 %26, 1
%113 = icmp eq i64 %112, %24
br i1 %113, label %114, label %25
114: ; preds = %99, %4
ret void
}