double integ_eval(double ai, double bi, double ci, double di, double xi,
                  double a, double b) {
  const double t0 = b + a;
  const double t1 = a * a + a * b + b * b;
  const double t2 = a * a * a + a * a * b + b * b * a + b * b * b;
  const double bterm = 0.5 * bi * (t0 - 2.0 * xi);
  const double cterm = ci / 3.0 * (t1 - 3.0 * xi * (t0 - xi));
  const double dterm =
      di / 4.0 * (t2 - 2.0 * xi * (2.0 * t1 - xi * (3.0 * t0 - 2.0 * xi)));
  return (b - a) * (ai + bterm + cterm + dterm);
}


x86 assembly (clang, -O0):
<integ_eval>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  %xmm6,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x30(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xe4e(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm2
addsd  %xmm2,%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xe09(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  0xdf8(%rip),%xmm1
mulsd  -0x28(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm3
subsd  -0x28(%rbp),%xmm3
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xdc4(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  0xdab(%rip),%xmm1
mulsd  -0x28(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm3
movsd  -0x28(%rbp),%xmm4
movsd  -0x40(%rbp),%xmm5
movsd  0xd8f(%rip),%xmm6
mulsd  -0x28(%rbp),%xmm6
movq   %xmm6,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm6
movsd  0xd63(%rip),%xmm7
mulsd  %xmm7,%xmm5
addsd  %xmm6,%xmm5
mulsd  %xmm5,%xmm4
movq   %xmm4,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm4
addsd  %xmm3,%xmm3
addsd  %xmm4,%xmm3
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x38(%rbp),%xmm0
subsd  -0x30(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
addsd  -0x58(%rbp),%xmm1
addsd  -0x60(%rbp),%xmm1
addsd  -0x68(%rbp),%xmm1
mulsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<integ_eval>:
movapd %xmm5,%xmm8
addsd  %xmm6,%xmm8
movapd %xmm5,%xmm12
mulsd  %xmm6,%xmm12
movapd %xmm5,%xmm7
mulsd  %xmm5,%xmm7
addsd  %xmm7,%xmm12
movapd %xmm6,%xmm9
mulsd  %xmm6,%xmm9
addsd  %xmm9,%xmm12
movapd %xmm7,%xmm10
mulsd  %xmm6,%xmm10
mulsd  %xmm5,%xmm7
addsd  %xmm10,%xmm7
movapd %xmm9,%xmm10
mulsd  %xmm5,%xmm10
addsd  %xmm7,%xmm10
mulsd  %xmm6,%xmm9
mulsd  0xea1(%rip),%xmm1
addsd  %xmm10,%xmm9
movsd  0xe9b(%rip),%xmm11
mulsd  %xmm4,%xmm11
movapd %xmm11,%xmm10
addsd  %xmm8,%xmm10
mulsd  %xmm1,%xmm10
movsd  0xe86(%rip),%xmm13
divsd  %xmm13,%xmm2
movapd %xmm8,%xmm7
subsd  %xmm4,%xmm7
movsd  0xe78(%rip),%xmm1
mulsd  %xmm4,%xmm1
mulsd  %xmm7,%xmm1
addsd  %xmm12,%xmm1
mulsd  %xmm2,%xmm1
mulsd  0xe67(%rip),%xmm3
mulsd  %xmm13,%xmm8
addsd  %xmm11,%xmm8
mulsd  %xmm4,%xmm8
addsd  %xmm12,%xmm12
subsd  %xmm8,%xmm12
mulsd  %xmm11,%xmm12
addsd  %xmm9,%xmm12
mulsd  %xmm3,%xmm12
subsd  %xmm5,%xmm6
addsd  %xmm10,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm12,%xmm0
mulsd  %xmm6,%xmm0
ret

LLVM IR (-O0):
define double @integ_eval(double %0, double %1, double %2, double %3, double %4, double %5, double %6) {
%8 = alloca double
%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 double
%20 = alloca double
store double %0, double* %8
store double %1, double* %9
store double %2, double* %10
store double %3, double* %11
store double %4, double* %12
store double %5, double* %13
store double %6, double* %14
%21 = load double, double* %14
%22 = load double, double* %13
%23 = fadd double %21, %22
store double %23, double* %15
%24 = load double, double* %13
%25 = load double, double* %13
%26 = load double, double* %13
%27 = load double, double* %14
%28 = fmul double %26, %27
%29 = call double @llvm.fmuladd.f64(double %24, double %25, double %28)
%30 = load double, double* %14
%31 = load double, double* %14
%32 = call double @llvm.fmuladd.f64(double %30, double %31, double %29)
store double %32, double* %16
%33 = load double, double* %13
%34 = load double, double* %13
%35 = fmul double %33, %34
%36 = load double, double* %13
%37 = load double, double* %13
%38 = load double, double* %13
%39 = fmul double %37, %38
%40 = load double, double* %14
%41 = fmul double %39, %40
%42 = call double @llvm.fmuladd.f64(double %35, double %36, double %41)
%43 = load double, double* %14
%44 = load double, double* %14
%45 = fmul double %43, %44
%46 = load double, double* %13
%47 = call double @llvm.fmuladd.f64(double %45, double %46, double %42)
%48 = load double, double* %14
%49 = load double, double* %14
%50 = fmul double %48, %49
%51 = load double, double* %14
%52 = call double @llvm.fmuladd.f64(double %50, double %51, double %47)
store double %52, double* %17
%53 = load double, double* %9
%54 = fmul double 5.000000e-01, %53
%55 = load double, double* %15
%56 = load double, double* %12
%57 = call double @llvm.fmuladd.f64(double -2.000000e+00, double %56, double %55)
%58 = fmul double %54, %57
store double %58, double* %18
%59 = load double, double* %10
%60 = fdiv double %59, 3.000000e+00
%61 = load double, double* %16
%62 = load double, double* %12
%63 = fmul double 3.000000e+00, %62
%64 = load double, double* %15
%65 = load double, double* %12
%66 = fsub double %64, %65
%67 = fneg double %63
%68 = call double @llvm.fmuladd.f64(double %67, double %66, double %61)
%69 = fmul double %60, %68
store double %69, double* %19
%70 = load double, double* %11
%71 = fdiv double %70, 4.000000e+00
%72 = load double, double* %17
%73 = load double, double* %12
%74 = fmul double 2.000000e+00, %73
%75 = load double, double* %16
%76 = load double, double* %12
%77 = load double, double* %15
%78 = load double, double* %12
%79 = fmul double 2.000000e+00, %78
%80 = fneg double %79
%81 = call double @llvm.fmuladd.f64(double 3.000000e+00, double %77, double %80)
%82 = fmul double %76, %81
%83 = fneg double %82
%84 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %75, double %83)
%85 = fneg double %74
%86 = call double @llvm.fmuladd.f64(double %85, double %84, double %72)
%87 = fmul double %71, %86
store double %87, double* %20
%88 = load double, double* %14
%89 = load double, double* %13
%90 = fsub double %88, %89
%91 = load double, double* %8
%92 = load double, double* %18
%93 = fadd double %91, %92
%94 = load double, double* %19
%95 = fadd double %93, %94
%96 = load double, double* %20
%97 = fadd double %95, %96
%98 = fmul double %90, %97
ret double %98
}

LLVM IR (-O2):
define double @integ_eval(double %0, double %1, double %2, double %3, double %4, double %5, double %6) {
%8 = fadd double %5, %6
%9 = fmul double %5, %6
%10 = tail call double @llvm.fmuladd.f64(double %5, double %5, double %9)
%11 = tail call double @llvm.fmuladd.f64(double %6, double %6, double %10)
%12 = fmul double %5, %5
%13 = fmul double %12, %6
%14 = tail call double @llvm.fmuladd.f64(double %12, double %5, double %13)
%15 = fmul double %6, %6
%16 = tail call double @llvm.fmuladd.f64(double %15, double %5, double %14)
%17 = tail call double @llvm.fmuladd.f64(double %15, double %6, double %16)
%18 = fmul double %1, 5.000000e-01
%19 = tail call double @llvm.fmuladd.f64(double %4, double -2.000000e+00, double %8)
%20 = fmul double %18, %19
%21 = fdiv double %2, 3.000000e+00
%22 = fsub double %8, %4
%23 = fmul double %4, -3.000000e+00
%24 = tail call double @llvm.fmuladd.f64(double %23, double %22, double %11)
%25 = fmul double %21, %24
%26 = fmul double %3, 2.500000e-01
%27 = fmul double %4, -2.000000e+00
%28 = tail call double @llvm.fmuladd.f64(double %8, double 3.000000e+00, double %27)
%29 = fneg double %28
%30 = fmul double %29, %4
%31 = tail call double @llvm.fmuladd.f64(double %11, double 2.000000e+00, double %30)
%32 = tail call double @llvm.fmuladd.f64(double %27, double %31, double %17)
%33 = fmul double %26, %32
%34 = fsub double %6, %5
%35 = fadd double %20, %0
%36 = fadd double %35, %25
%37 = fadd double %36, %33
%38 = fmul double %34, %37
ret double %38
}