int linear_expansion_sum(int elen, double *e, int flen, double *f, double *h) {
  double Q, q;
  double Qnew;
  double R;
  double bvirt;
  double avirt, bround, around;
  int eindex, findex, hindex;
  double g0;
  eindex = findex = 0;
  if (((f[findex]) > (e[eindex])) == ((f[findex]) > -(e[eindex]))) {
    g0 = (e[eindex]);
    ++eindex;
  } else {
    g0 = (f[findex]);
    ++findex;
  }
  if ((eindex < elen) && ((findex >= flen) || (((f[findex]) > (e[eindex])) ==
                                               ((f[findex]) > -(e[eindex]))))) {
    Qnew = (double)((e[eindex]) + g0);
    bvirt = Qnew - (e[eindex]);
    q = g0 - bvirt;
    ++eindex;
  } else {
    Qnew = (double)((f[findex]) + g0);
    bvirt = Qnew - (f[findex]);
    q = g0 - bvirt;
    ++findex;
  }
  Q = Qnew;
  for (hindex = 0; hindex < elen + flen - 2; hindex++) {
    if ((eindex < elen) &&
        ((findex >= flen) ||
         (((f[findex]) > (e[eindex])) == ((f[findex]) > -(e[eindex]))))) {
      R = (double)((e[eindex]) + q);
      bvirt = R - (e[eindex]);
      h[hindex] = q - bvirt;
      ++eindex;
    } else {
      R = (double)((f[findex]) + q);
      bvirt = R - (f[findex]);
      h[hindex] = q - bvirt;
      ++findex;
    }
    Qnew = (double)(Q + R);
    bvirt = (double)(Qnew - Q);
    avirt = Qnew - bvirt;
    bround = R - bvirt;
    around = Q - avirt;
    q = around + bround;
    Q = Qnew;
  }
  h[hindex] = q;
  h[hindex + 1] = Q;
  return hindex + 2;
}


x86 assembly (clang, -O0):
<linear_expansion_sum>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movl   $0x0,-0x70(%rbp)
movl   $0x0,-0x6c(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x20(%rbp),%rcx
movslq -0x70(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm0
mov    -0x10(%rbp),%rcx
movslq -0x6c(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm1
movq   %xmm1,%rcx
movabs $0x8000000000000000,%rdx
xor    %rdx,%rcx
movq   %rcx,%xmm1
ucomisd %xmm1,%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
cmp    %ecx,%eax
jne    11ac <linear_expansion_sum+0xac>
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    11c7 <linear_expansion_sum+0xc7>
mov    -0x20(%rbp),%rax
movslq -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1292 <linear_expansion_sum+0x192>
mov    -0x70(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1247 <linear_expansion_sum+0x147>
mov    -0x20(%rbp),%rax
movslq -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x20(%rbp),%rcx
movslq -0x70(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm0
mov    -0x10(%rbp),%rcx
movslq -0x6c(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm1
movq   %xmm1,%rcx
movabs $0x8000000000000000,%rdx
xor    %rdx,%rcx
movq   %rcx,%xmm1
ucomisd %xmm1,%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
cmp    %ecx,%eax
jne    1292 <linear_expansion_sum+0x192>
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x80(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    12d8 <linear_expansion_sum+0x1d8>
mov    -0x20(%rbp),%rax
movslq -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x70(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x80(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x74(%rbp)
mov    -0x74(%rbp),%eax
mov    -0x4(%rbp),%ecx
add    -0x14(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jge    1490 <linear_expansion_sum+0x390>
mov    -0x6c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    13d0 <linear_expansion_sum+0x2d0>
mov    -0x70(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    137d <linear_expansion_sum+0x27d>
mov    -0x20(%rbp),%rax
movslq -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x20(%rbp),%rcx
movslq -0x70(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm0
mov    -0x10(%rbp),%rcx
movslq -0x6c(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm1
movq   %xmm1,%rcx
movabs $0x8000000000000000,%rdx
xor    %rdx,%rcx
movq   %rcx,%xmm1
ucomisd %xmm1,%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
cmp    %ecx,%eax
jne    13d0 <linear_expansion_sum+0x2d0>
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    141e <linear_expansion_sum+0x31e>
mov    -0x20(%rbp),%rax
movslq -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x70(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
movsd  -0x30(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
subsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x40(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x48(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x30(%rbp),%xmm0
subsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    12e9 <linear_expansion_sum+0x1e9>
movsd  -0x38(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x30(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x74(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x74(%rbp),%eax
add    $0x2,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<linear_expansion_sum>:
push   %rbp
push   %r14
push   %rbx
movsd  (%rcx),%xmm1
movsd  (%rsi),%xmm0
ucomisd %xmm0,%xmm1
setbe  %al
movapd 0xee5(%rip),%xmm2
xorpd  %xmm0,%xmm2
ucomisd %xmm2,%xmm1
seta   %bl
xor    %al,%bl
movzbl %bl,%r9d
mov    %r9d,%eax
xor    $0x1,%al
test   %r9b,%r9b
jne    113a <linear_expansion_sum+0x3a>
movapd %xmm1,%xmm0
movzbl %al,%r10d
cmp    %edi,%r9d
jge    1178 <linear_expansion_sum+0x78>
cmp    %edx,%r10d
jge    119b <linear_expansion_sum+0x9b>
mov    %r10d,%eax
movsd  (%rcx,%rax,8),%xmm2
mov    %r9d,%eax
movsd  (%rsi,%rax,8),%xmm4
ucomisd %xmm4,%xmm2
setbe  %al
movapd 0xe99(%rip),%xmm1
xorpd  %xmm4,%xmm1
ucomisd %xmm1,%xmm2
seta   %bl
cmp    %bl,%al
je     1180 <linear_expansion_sum+0x80>
jmp    11a3 <linear_expansion_sum+0xa3>
mov    %r10d,%eax
movsd  (%rcx,%rax,8),%xmm2
movapd %xmm0,%xmm1
addsd  %xmm2,%xmm1
movapd %xmm1,%xmm3
subsd  %xmm2,%xmm3
mov    $0x2,%r10d
sub    %r9d,%r10d
jmp    11b7 <linear_expansion_sum+0xb7>
mov    %r9d,%eax
movsd  (%rsi,%rax,8),%xmm4
movapd %xmm0,%xmm1
addsd  %xmm4,%xmm1
movapd %xmm1,%xmm3
subsd  %xmm4,%xmm3
add    $0x1,%r9d
subsd  %xmm3,%xmm0
lea    (%rdi,%rdx,1),%eax
add    $0xfffffffe,%eax
test   %eax,%eax
jle    12b1 <linear_expansion_sum+0x1b1>
mov    %eax,%r11d
xor    %r14d,%r14d
movapd 0xe29(%rip),%xmm2
jmp    123b <linear_expansion_sum+0x13b>
nopl   0x0(%rax)
movslq %r9d,%rbx
movsd  (%rsi,%rbx,8),%xmm5
movapd %xmm0,%xmm3
addsd  %xmm5,%xmm3
movapd %xmm3,%xmm4
subsd  %xmm5,%xmm4
subsd  %xmm4,%xmm0
movsd  %xmm0,(%r8,%r14,8)
add    $0x1,%r9d
movapd %xmm1,%xmm4
addsd  %xmm3,%xmm4
movapd %xmm4,%xmm0
subsd  %xmm1,%xmm0
movapd %xmm4,%xmm5
subsd  %xmm0,%xmm5
subsd  %xmm0,%xmm3
subsd  %xmm5,%xmm1
movapd %xmm1,%xmm0
addsd  %xmm3,%xmm0
add    $0x1,%r14
movapd %xmm4,%xmm1
cmp    %r14,%r11
je     12ab <linear_expansion_sum+0x1ab>
cmp    %edi,%r9d
jge    1280 <linear_expansion_sum+0x180>
cmp    %edx,%r10d
jge    11e0 <linear_expansion_sum+0xe0>
movslq %r10d,%rbx
movsd  (%rcx,%rbx,8),%xmm4
movslq %r9d,%rbx
movsd  (%rsi,%rbx,8),%xmm5
ucomisd %xmm5,%xmm4
setbe  %bpl
movapd %xmm5,%xmm3
xorpd  %xmm2,%xmm3
ucomisd %xmm3,%xmm4
seta   %bl
cmp    %bl,%bpl
jne    11e8 <linear_expansion_sum+0xe8>
jmp    1288 <linear_expansion_sum+0x188>
nopw   0x0(%rax,%rax,1)
movslq %r10d,%rbx
movsd  (%rcx,%rbx,8),%xmm4
movapd %xmm0,%xmm3
addsd  %xmm4,%xmm3
movapd %xmm3,%xmm5
subsd  %xmm4,%xmm5
subsd  %xmm5,%xmm0
movsd  %xmm0,(%r8,%r14,8)
add    $0x1,%r10d
jmp    1206 <linear_expansion_sum+0x106>
movapd %xmm4,%xmm1
jmp    12b3 <linear_expansion_sum+0x1b3>
xor    %eax,%eax
mov    %eax,%ecx
movsd  %xmm0,(%r8,%rcx,8)
movsd  %xmm1,0x8(%r8,%rcx,8)
add    $0x2,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define i32 @linear_expansion_sum(i32 %0, double* %1, i32 %2, double* %3, double* %4) {
%6 = alloca i32
%7 = alloca double*
%8 = alloca i32
%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 i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca double
store i32 %0, i32* %6
store double* %1, double** %7
store i32 %2, i32* %8
store double* %3, double** %9
store double* %4, double** %10
store i32 0, i32* %20
store i32 0, i32* %19
%23 = load double*, double** %9
%24 = load i32, i32* %20
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds double, double* %23, i64 %25
%27 = load double, double* %26
%28 = load double*, double** %7
%29 = load i32, i32* %19
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds double, double* %28, i64 %30
%32 = load double, double* %31
%33 = fcmp ogt double %27, %32
%34 = zext i1 %33 to i32
%35 = load double*, double** %9
%36 = load i32, i32* %20
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds double, double* %35, i64 %37
%39 = load double, double* %38
%40 = load double*, double** %7
%41 = load i32, i32* %19
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds double, double* %40, i64 %42
%44 = load double, double* %43
%45 = fneg double %44
%46 = fcmp ogt double %39, %45
%47 = zext i1 %46 to i32
%48 = icmp eq i32 %34, %47
br i1 %48, label %49, label %57
49: ; preds = %5
%50 = load double*, double** %7
%51 = load i32, i32* %19
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds double, double* %50, i64 %52
%54 = load double, double* %53
store double %54, double* %22
%55 = load i32, i32* %19
%56 = add nsw i32 %55, 1
store i32 %56, i32* %19
br label %65
57: ; preds = %5
%58 = load double*, double** %9
%59 = load i32, i32* %20
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds double, double* %58, i64 %60
%62 = load double, double* %61
store double %62, double* %22
%63 = load i32, i32* %20
%64 = add nsw i32 %63, 1
store i32 %64, i32* %20
br label %65
65: ; preds = %57, %49
%66 = load i32, i32* %19
%67 = load i32, i32* %6
%68 = icmp slt i32 %66, %67
br i1 %68, label %69, label %120
69: ; preds = %65
%70 = load i32, i32* %20
%71 = load i32, i32* %8
%72 = icmp sge i32 %70, %71
br i1 %72, label %100, label %73
73: ; preds = %69
%74 = load double*, double** %9
%75 = load i32, i32* %20
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds double, double* %74, i64 %76
%78 = load double, double* %77
%79 = load double*, double** %7
%80 = load i32, i32* %19
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds double, double* %79, i64 %81
%83 = load double, double* %82
%84 = fcmp ogt double %78, %83
%85 = zext i1 %84 to i32
%86 = load double*, double** %9
%87 = load i32, i32* %20
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds double, double* %86, i64 %88
%90 = load double, double* %89
%91 = load double*, double** %7
%92 = load i32, i32* %19
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds double, double* %91, i64 %93
%95 = load double, double* %94
%96 = fneg double %95
%97 = fcmp ogt double %90, %96
%98 = zext i1 %97 to i32
%99 = icmp eq i32 %85, %98
br i1 %99, label %100, label %120
100: ; preds = %73, %69
%101 = load double*, double** %7
%102 = load i32, i32* %19
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds double, double* %101, i64 %103
%105 = load double, double* %104
%106 = load double, double* %22
%107 = fadd double %105, %106
store double %107, double* %13
%108 = load double, double* %13
%109 = load double*, double** %7
%110 = load i32, i32* %19
%111 = sext i32 %110 to i64
%112 = getelementptr inbounds double, double* %109, i64 %111
%113 = load double, double* %112
%114 = fsub double %108, %113
store double %114, double* %15
%115 = load double, double* %22
%116 = load double, double* %15
%117 = fsub double %115, %116
store double %117, double* %12
%118 = load i32, i32* %19
%119 = add nsw i32 %118, 1
store i32 %119, i32* %19
br label %140
120: ; preds = %73, %65
%121 = load double*, double** %9
%122 = load i32, i32* %20
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds double, double* %121, i64 %123
%125 = load double, double* %124
%126 = load double, double* %22
%127 = fadd double %125, %126
store double %127, double* %13
%128 = load double, double* %13
%129 = load double*, double** %9
%130 = load i32, i32* %20
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds double, double* %129, i64 %131
%133 = load double, double* %132
%134 = fsub double %128, %133
store double %134, double* %15
%135 = load double, double* %22
%136 = load double, double* %15
%137 = fsub double %135, %136
store double %137, double* %12
%138 = load i32, i32* %20
%139 = add nsw i32 %138, 1
store i32 %139, i32* %20
br label %140
140: ; preds = %120, %100
%141 = load double, double* %13
store double %141, double* %11
store i32 0, i32* %21
br label %142
142: ; preds = %252, %140
%143 = load i32, i32* %21
%144 = load i32, i32* %6
%145 = load i32, i32* %8
%146 = add nsw i32 %144, %145
%147 = sub nsw i32 %146, 2
%148 = icmp slt i32 %143, %147
br i1 %148, label %149, label %255
149: ; preds = %142
%150 = load i32, i32* %19
%151 = load i32, i32* %6
%152 = icmp slt i32 %150, %151
br i1 %152, label %153, label %208
153: ; preds = %149
%154 = load i32, i32* %20
%155 = load i32, i32* %8
%156 = icmp sge i32 %154, %155
br i1 %156, label %184, label %157
157: ; preds = %153
%158 = load double*, double** %9
%159 = load i32, i32* %20
%160 = sext i32 %159 to i64
%161 = getelementptr inbounds double, double* %158, i64 %160
%162 = load double, double* %161
%163 = load double*, double** %7
%164 = load i32, i32* %19
%165 = sext i32 %164 to i64
%166 = getelementptr inbounds double, double* %163, i64 %165
%167 = load double, double* %166
%168 = fcmp ogt double %162, %167
%169 = zext i1 %168 to i32
%170 = load double*, double** %9
%171 = load i32, i32* %20
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds double, double* %170, i64 %172
%174 = load double, double* %173
%175 = load double*, double** %7
%176 = load i32, i32* %19
%177 = sext i32 %176 to i64
%178 = getelementptr inbounds double, double* %175, i64 %177
%179 = load double, double* %178
%180 = fneg double %179
%181 = fcmp ogt double %174, %180
%182 = zext i1 %181 to i32
%183 = icmp eq i32 %169, %182
br i1 %183, label %184, label %208
184: ; preds = %157, %153
%185 = load double*, double** %7
%186 = load i32, i32* %19
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds double, double* %185, i64 %187
%189 = load double, double* %188
%190 = load double, double* %12
%191 = fadd double %189, %190
store double %191, double* %14
%192 = load double, double* %14
%193 = load double*, double** %7
%194 = load i32, i32* %19
%195 = sext i32 %194 to i64
%196 = getelementptr inbounds double, double* %193, i64 %195
%197 = load double, double* %196
%198 = fsub double %192, %197
store double %198, double* %15
%199 = load double, double* %12
%200 = load double, double* %15
%201 = fsub double %199, %200
%202 = load double*, double** %10
%203 = load i32, i32* %21
%204 = sext i32 %203 to i64
%205 = getelementptr inbounds double, double* %202, i64 %204
store double %201, double* %205
%206 = load i32, i32* %19
%207 = add nsw i32 %206, 1
store i32 %207, i32* %19
br label %232
208: ; preds = %157, %149
%209 = load double*, double** %9
%210 = load i32, i32* %20
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds double, double* %209, i64 %211
%213 = load double, double* %212
%214 = load double, double* %12
%215 = fadd double %213, %214
store double %215, double* %14
%216 = load double, double* %14
%217 = load double*, double** %9
%218 = load i32, i32* %20
%219 = sext i32 %218 to i64
%220 = getelementptr inbounds double, double* %217, i64 %219
%221 = load double, double* %220
%222 = fsub double %216, %221
store double %222, double* %15
%223 = load double, double* %12
%224 = load double, double* %15
%225 = fsub double %223, %224
%226 = load double*, double** %10
%227 = load i32, i32* %21
%228 = sext i32 %227 to i64
%229 = getelementptr inbounds double, double* %226, i64 %228
store double %225, double* %229
%230 = load i32, i32* %20
%231 = add nsw i32 %230, 1
store i32 %231, i32* %20
br label %232
232: ; preds = %208, %184
%233 = load double, double* %11
%234 = load double, double* %14
%235 = fadd double %233, %234
store double %235, double* %13
%236 = load double, double* %13
%237 = load double, double* %11
%238 = fsub double %236, %237
store double %238, double* %15
%239 = load double, double* %13
%240 = load double, double* %15
%241 = fsub double %239, %240
store double %241, double* %16
%242 = load double, double* %14
%243 = load double, double* %15
%244 = fsub double %242, %243
store double %244, double* %17
%245 = load double, double* %11
%246 = load double, double* %16
%247 = fsub double %245, %246
store double %247, double* %18
%248 = load double, double* %18
%249 = load double, double* %17
%250 = fadd double %248, %249
store double %250, double* %12
%251 = load double, double* %13
store double %251, double* %11
br label %252
252: ; preds = %232
%253 = load i32, i32* %21
%254 = add nsw i32 %253, 1
store i32 %254, i32* %21
br label %142
255: ; preds = %142
%256 = load double, double* %12
%257 = load double*, double** %10
%258 = load i32, i32* %21
%259 = sext i32 %258 to i64
%260 = getelementptr inbounds double, double* %257, i64 %259
store double %256, double* %260
%261 = load double, double* %11
%262 = load double*, double** %10
%263 = load i32, i32* %21
%264 = add nsw i32 %263, 1
%265 = sext i32 %264 to i64
%266 = getelementptr inbounds double, double* %262, i64 %265
store double %261, double* %266
%267 = load i32, i32* %21
%268 = add nsw i32 %267, 2
ret i32 %268
}

LLVM IR (-O2):
define i32 @linear_expansion_sum(i32 %0, double* nocapture %1, i32 %2, double* nocapture %3, double* nocapture writeonly %4) {
%6 = load double, double* %3
%7 = load double, double* %1
%8 = fcmp ule double %6, %7
%9 = fneg double %7
%10 = fcmp ogt double %6, %9
%11 = xor i1 %8, %10
%12 = zext i1 %11 to i32
%13 = xor i1 %11, true
%14 = zext i1 %13 to i32
%15 = select i1 %11, double %7, double %6
%16 = icmp slt i32 %12, %0
br i1 %16, label %21, label %17
17: ; preds = %5
%18 = zext i1 %13 to i64
%19 = getelementptr inbounds double, double* %3, i64 %18
%20 = load double, double* %19
br label %43
21: ; preds = %5
%22 = icmp slt i32 %14, %2
br i1 %22, label %27, label %23
23: ; preds = %21
%24 = zext i1 %11 to i64
%25 = getelementptr inbounds double, double* %1, i64 %24
%26 = load double, double* %25
br label %38
27: ; preds = %21
%28 = zext i1 %13 to i64
%29 = getelementptr inbounds double, double* %3, i64 %28
%30 = load double, double* %29
%31 = zext i1 %11 to i64
%32 = getelementptr inbounds double, double* %1, i64 %31
%33 = load double, double* %32
%34 = fcmp ule double %30, %33
%35 = fneg double %33
%36 = fcmp ogt double %30, %35
%37 = xor i1 %34, %36
br i1 %37, label %38, label %43
38: ; preds = %23, %27
%39 = phi double [ %26, %23 ], [ %33, %27 ]
%40 = fadd double %15, %39
%41 = fsub double %40, %39
%42 = select i1 %11, i32 2, i32 1
br label %48
43: ; preds = %17, %27
%44 = phi double [ %20, %17 ], [ %30, %27 ]
%45 = fadd double %15, %44
%46 = fsub double %45, %44
%47 = select i1 %11, i32 1, i32 2
br label %48
48: ; preds = %43, %38
%49 = phi double [ %40, %38 ], [ %45, %43 ]
%50 = phi double [ %41, %38 ], [ %46, %43 ]
%51 = phi i32 [ %42, %38 ], [ %12, %43 ]
%52 = phi i32 [ %14, %38 ], [ %47, %43 ]
%53 = fsub double %15, %50
%54 = add i32 %0, -2
%55 = add i32 %54, %2
%56 = icmp sgt i32 %55, 0
br i1 %56, label %57, label %113
57: ; preds = %48
%58 = zext i32 %55 to i64
br label %59
59: ; preds = %57, %101
%60 = phi i64 [ 0, %57 ], [ %111, %101 ]
%61 = phi i32 [ %52, %57 ], [ %104, %101 ]
%62 = phi i32 [ %51, %57 ], [ %103, %101 ]
%63 = phi double [ %49, %57 ], [ %105, %101 ]
%64 = phi double [ %53, %57 ], [ %110, %101 ]
%65 = icmp slt i32 %62, %0
br i1 %65, label %70, label %66
66: ; preds = %59
%67 = sext i32 %61 to i64
%68 = getelementptr inbounds double, double* %3, i64 %67
%69 = load double, double* %68
br label %94
70: ; preds = %59
%71 = icmp slt i32 %61, %2
br i1 %71, label %76, label %72
72: ; preds = %70
%73 = sext i32 %62 to i64
%74 = getelementptr inbounds double, double* %1, i64 %73
%75 = load double, double* %74
br label %87
76: ; preds = %70
%77 = sext i32 %61 to i64
%78 = getelementptr inbounds double, double* %3, i64 %77
%79 = load double, double* %78
%80 = sext i32 %62 to i64
%81 = getelementptr inbounds double, double* %1, i64 %80
%82 = load double, double* %81
%83 = fcmp ule double %79, %82
%84 = fneg double %82
%85 = fcmp ogt double %79, %84
%86 = xor i1 %83, %85
br i1 %86, label %87, label %94
87: ; preds = %72, %76
%88 = phi double [ %75, %72 ], [ %82, %76 ]
%89 = fadd double %64, %88
%90 = fsub double %89, %88
%91 = fsub double %64, %90
%92 = getelementptr inbounds double, double* %4, i64 %60
store double %91, double* %92
%93 = add nsw i32 %62, 1
br label %101
94: ; preds = %66, %76
%95 = phi double [ %69, %66 ], [ %79, %76 ]
%96 = fadd double %64, %95
%97 = fsub double %96, %95
%98 = fsub double %64, %97
%99 = getelementptr inbounds double, double* %4, i64 %60
store double %98, double* %99
%100 = add nsw i32 %61, 1
br label %101
101: ; preds = %94, %87
%102 = phi double [ %89, %87 ], [ %96, %94 ]
%103 = phi i32 [ %93, %87 ], [ %62, %94 ]
%104 = phi i32 [ %61, %87 ], [ %100, %94 ]
%105 = fadd double %63, %102
%106 = fsub double %105, %63
%107 = fsub double %105, %106
%108 = fsub double %102, %106
%109 = fsub double %63, %107
%110 = fadd double %108, %109
%111 = add nuw nsw i64 %60, 1
%112 = icmp eq i64 %111, %58
br i1 %112, label %113, label %59
113: ; preds = %101, %48
%114 = phi double [ %53, %48 ], [ %110, %101 ]
%115 = phi double [ %49, %48 ], [ %105, %101 ]
%116 = phi i32 [ 0, %48 ], [ %55, %101 ]
%117 = zext i32 %116 to i64
%118 = getelementptr inbounds double, double* %4, i64 %117
store double %114, double* %118
%119 = add nuw nsw i32 %116, 1
%120 = zext i32 %119 to i64
%121 = getelementptr inbounds double, double* %4, i64 %120
store double %115, double* %121
%122 = add nuw nsw i32 %116, 2
ret i32 %122
}