int sample(double *p, int n, double r) {
  int low, high, mid, i;
  double sum;
  low = 0;
  high = n;
  mid = n / 2;
  sum = 0;
  for (i = 0; i < n; i++)
    sum = sum + p[i];
  for (i = 0; i < n; i++)
    p[i] = p[i] / sum;
  for (i = 1; i < n; i++)
    p[i] = p[i] + p[i - 1];
  while (low <= high) {
    mid = (low + high) / 2;
    if (r == p[mid]) {
      if (mid >= n)
        return n - 1;
      return mid;
    } else if (r > p[mid])
      low = mid + 1;
    else if (r < p[mid])
      high = mid - 1;
  }
  if (low >= n)
    return n - 1;
  return low;
}


x86 assembly (clang, -O0):
<sample>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x2c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    116b <sample+0x6b>
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    113a <sample+0x3a>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11ab <sample+0xab>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1172 <sample+0x72>
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11f8 <sample+0xf8>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11b2 <sample+0xb2>
jmp    11fd <sample+0xfd>
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
jg     12b7 <sample+0x1b7>
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x2c(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
jne    125d <sample+0x15d>
jp     125d <sample+0x15d>
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     1252 <sample+0x152>
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    12d7 <sample+0x1d7>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12d7 <sample+0x1d7>
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    1283 <sample+0x183>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12ad <sample+0x1ad>
movsd  -0x20(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    12a8 <sample+0x1a8>
mov    -0x2c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    12ad <sample+0x1ad>
jmp    12b2 <sample+0x1b2>
jmp    11fd <sample+0xfd>
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     12d1 <sample+0x1d1>
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    12d7 <sample+0x1d7>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sample>:
test   %esi,%esi
jle    12c3 <sample+0x1c3>
mov    %esi,%r9d
lea    -0x1(%r9),%r8
mov    %r9d,%edx
and    $0x7,%edx
cmp    $0x7,%r8
jae    1123 <sample+0x23>
xorpd  %xmm1,%xmm1
xor    %eax,%eax
jmp    1168 <sample+0x68>
mov    %r9d,%ecx
and    $0xfffffff8,%ecx
xorpd  %xmm1,%xmm1
xor    %eax,%eax
nop
addsd  (%rdi,%rax,8),%xmm1
addsd  0x8(%rdi,%rax,8),%xmm1
addsd  0x10(%rdi,%rax,8),%xmm1
addsd  0x18(%rdi,%rax,8),%xmm1
addsd  0x20(%rdi,%rax,8),%xmm1
addsd  0x28(%rdi,%rax,8),%xmm1
addsd  0x30(%rdi,%rax,8),%xmm1
addsd  0x38(%rdi,%rax,8),%xmm1
add    $0x8,%rax
cmp    %rax,%rcx
jne    1130 <sample+0x30>
test   %rdx,%rdx
je     118e <sample+0x8e>
lea    (%rdi,%rax,8),%rax
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
addsd  (%rax,%rcx,8),%xmm1
add    $0x1,%rcx
cmp    %rcx,%rdx
jne    1180 <sample+0x80>
test   %esi,%esi
jle    12c3 <sample+0x1c3>
cmp    $0x1,%esi
jne    11a2 <sample+0xa2>
xor    %edx,%edx
jmp    1220 <sample+0x120>
mov    %r9d,%edx
and    $0xfffffffe,%edx
movapd %xmm1,%xmm2
unpcklpd %xmm1,%xmm2
lea    -0x2(%rdx),%rax
mov    %rax,%r10
shr    %r10
add    $0x1,%r10
test   %rax,%rax
je     1316 <sample+0x216>
mov    %r10,%rax
and    $0xfffffffffffffffe,%rax
xor    %ecx,%ecx
movupd (%rdi,%rcx,8),%xmm3
movupd 0x10(%rdi,%rcx,8),%xmm4
divpd  %xmm2,%xmm3
movupd %xmm3,(%rdi,%rcx,8)
divpd  %xmm2,%xmm4
movupd %xmm4,0x10(%rdi,%rcx,8)
add    $0x4,%rcx
add    $0xfffffffffffffffe,%rax
jne    11d0 <sample+0xd0>
test   $0x1,%r10b
je     120c <sample+0x10c>
movupd (%rdi,%rcx,8),%xmm3
divpd  %xmm2,%xmm3
movupd %xmm3,(%rdi,%rcx,8)
cmp    %r9,%rdx
je     1237 <sample+0x137>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rdi,%rdx,8),%xmm2
divsd  %xmm1,%xmm2
movsd  %xmm2,(%rdi,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%r9
jne    1220 <sample+0x120>
cmp    $0x2,%esi
jl     12c3 <sample+0x1c3>
movsd  (%rdi),%xmm1
add    $0xfffffffffffffffe,%r9
mov    %r8d,%edx
and    $0x3,%edx
mov    $0x1,%eax
cmp    $0x3,%r9
jb     129d <sample+0x19d>
and    $0xfffffffffffffffc,%r8
xor    %eax,%eax
nop
addsd  0x8(%rdi,%rax,8),%xmm1
movsd  %xmm1,0x8(%rdi,%rax,8)
addsd  0x10(%rdi,%rax,8),%xmm1
movsd  %xmm1,0x10(%rdi,%rax,8)
addsd  0x18(%rdi,%rax,8),%xmm1
movsd  %xmm1,0x18(%rdi,%rax,8)
addsd  0x20(%rdi,%rax,8),%xmm1
movsd  %xmm1,0x20(%rdi,%rax,8)
add    $0x4,%rax
cmp    %rax,%r8
jne    1260 <sample+0x160>
add    $0x1,%rax
test   %rdx,%rdx
je     12c3 <sample+0x1c3>
lea    (%rdi,%rax,8),%rax
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
addsd  (%rax,%rcx,8),%xmm1
movsd  %xmm1,(%rax,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%rdx
jne    12b0 <sample+0x1b0>
xor    %ecx,%ecx
test   %esi,%esi
js     130d <sample+0x20d>
mov    %esi,%r8d
jmp    12da <sample+0x1da>
xchg   %ax,%ax
add    $0x1,%edx
mov    %edx,%ecx
cmp    %r8d,%ecx
jg     130d <sample+0x20d>
lea    (%r8,%rcx,1),%eax
mov    %eax,%edx
shr    $0x1f,%edx
add    %eax,%edx
sar    %edx
movslq %edx,%rax
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
jne    12f7 <sample+0x1f7>
jnp    130b <sample+0x20b>
ucomisd %xmm1,%xmm0
ja     12d0 <sample+0x1d0>
ucomisd %xmm0,%xmm1
jbe    12d5 <sample+0x1d5>
add    $0xffffffff,%edx
mov    %edx,%r8d
jmp    12d5 <sample+0x1d5>
mov    %edx,%ecx
lea    -0x1(%rsi),%eax
cmp    %esi,%ecx
cmovl  %ecx,%eax
ret
xor    %ecx,%ecx
test   $0x1,%r10b
jne    11fe <sample+0xfe>
jmp    120c <sample+0x10c>

LLVM IR (-O0):
define i32 @sample(double* %0, i32 %1, double %2) {
%4 = alloca i32
%5 = alloca double*
%6 = alloca i32
%7 = alloca double
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca double
store double* %0, double** %5
store i32 %1, i32* %6
store double %2, double* %7
store i32 0, i32* %8
%13 = load i32, i32* %6
store i32 %13, i32* %9
%14 = load i32, i32* %6
%15 = sdiv i32 %14, 2
store i32 %15, i32* %10
store double 0.000000e+00, double* %12
store i32 0, i32* %11
br label %16
16: ; preds = %28, %3
%17 = load i32, i32* %11
%18 = load i32, i32* %6
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %31
20: ; preds = %16
%21 = load double, double* %12
%22 = load double*, double** %5
%23 = load i32, i32* %11
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds double, double* %22, i64 %24
%26 = load double, double* %25
%27 = fadd double %21, %26
store double %27, double* %12
br label %28
28: ; preds = %20
%29 = load i32, i32* %11
%30 = add nsw i32 %29, 1
store i32 %30, i32* %11
br label %16
31: ; preds = %16
store i32 0, i32* %11
br label %32
32: ; preds = %48, %31
%33 = load i32, i32* %11
%34 = load i32, i32* %6
%35 = icmp slt i32 %33, %34
br i1 %35, label %36, label %51
36: ; preds = %32
%37 = load double*, double** %5
%38 = load i32, i32* %11
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds double, double* %37, i64 %39
%41 = load double, double* %40
%42 = load double, double* %12
%43 = fdiv double %41, %42
%44 = load double*, double** %5
%45 = load i32, i32* %11
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double, double* %44, i64 %46
store double %43, double* %47
br label %48
48: ; preds = %36
%49 = load i32, i32* %11
%50 = add nsw i32 %49, 1
store i32 %50, i32* %11
br label %32
51: ; preds = %32
store i32 1, i32* %11
br label %52
52: ; preds = %73, %51
%53 = load i32, i32* %11
%54 = load i32, i32* %6
%55 = icmp slt i32 %53, %54
br i1 %55, label %56, label %76
56: ; preds = %52
%57 = load double*, double** %5
%58 = load i32, i32* %11
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds double, double* %57, i64 %59
%61 = load double, double* %60
%62 = load double*, double** %5
%63 = load i32, i32* %11
%64 = sub nsw i32 %63, 1
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds double, double* %62, i64 %65
%67 = load double, double* %66
%68 = fadd double %61, %67
%69 = load double*, double** %5
%70 = load i32, i32* %11
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds double, double* %69, i64 %71
store double %68, double* %72
br label %73
73: ; preds = %56
%74 = load i32, i32* %11
%75 = add nsw i32 %74, 1
store i32 %75, i32* %11
br label %52
76: ; preds = %52
br label %77
77: ; preds = %126, %76
%78 = load i32, i32* %8
%79 = load i32, i32* %9
%80 = icmp sle i32 %78, %79
br i1 %80, label %81, label %127
81: ; preds = %77
%82 = load i32, i32* %8
%83 = load i32, i32* %9
%84 = add nsw i32 %82, %83
%85 = sdiv i32 %84, 2
store i32 %85, i32* %10
%86 = load double, double* %7
%87 = load double*, double** %5
%88 = load i32, i32* %10
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds double, double* %87, i64 %89
%91 = load double, double* %90
%92 = fcmp oeq double %86, %91
br i1 %92, label %93, label %102
93: ; preds = %81
%94 = load i32, i32* %10
%95 = load i32, i32* %6
%96 = icmp sge i32 %94, %95
br i1 %96, label %97, label %100
97: ; preds = %93
%98 = load i32, i32* %6
%99 = sub nsw i32 %98, 1
store i32 %99, i32* %4
br label %136
100: ; preds = %93
%101 = load i32, i32* %10
store i32 %101, i32* %4
br label %136
102: ; preds = %81
%103 = load double, double* %7
%104 = load double*, double** %5
%105 = load i32, i32* %10
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds double, double* %104, i64 %106
%108 = load double, double* %107
%109 = fcmp ogt double %103, %108
br i1 %109, label %110, label %113
110: ; preds = %102
%111 = load i32, i32* %10
%112 = add nsw i32 %111, 1
store i32 %112, i32* %8
br label %125
113: ; preds = %102
%114 = load double, double* %7
%115 = load double*, double** %5
%116 = load i32, i32* %10
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds double, double* %115, i64 %117
%119 = load double, double* %118
%120 = fcmp olt double %114, %119
br i1 %120, label %121, label %124
121: ; preds = %113
%122 = load i32, i32* %10
%123 = sub nsw i32 %122, 1
store i32 %123, i32* %9
br label %124
124: ; preds = %121, %113
br label %125
125: ; preds = %124, %110
br label %126
126: ; preds = %125
br label %77
127: ; preds = %77
%128 = load i32, i32* %8
%129 = load i32, i32* %6
%130 = icmp sge i32 %128, %129
br i1 %130, label %131, label %134
131: ; preds = %127
%132 = load i32, i32* %6
%133 = sub nsw i32 %132, 1
store i32 %133, i32* %4
br label %136
134: ; preds = %127
%135 = load i32, i32* %8
store i32 %135, i32* %4
br label %136
136: ; preds = %134, %131, %100, %97
%137 = load i32, i32* %4
ret i32 %137
}

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