double process3(double val) {
  static double buf[9];
  buf[8] = buf[7];
  buf[7] = buf[6];
  buf[6] = buf[5];
  buf[5] = buf[4];
  buf[4] = buf[3];
  buf[3] = buf[2];
  buf[2] = buf[1];
  buf[1] = buf[0];
  buf[0] = val + 7.64611284306301 * buf[1] - 25.5848711347952 * buf[2] +
           48.9340746717192 * buf[3] - 58.5117578041416 * buf[4] +
           44.7897320543968 * buf[5] - 21.4346996246982 * buf[6] +
           5.86329783240186 * buf[7] - 0.701888838149905 * buf[8];
  return 7.97006070236564e-13 * buf[0] + 6.37604856189252e-12 * buf[1] +
         2.23161699666238e-11 * buf[2] + 4.46323399332476e-11 * buf[3] +
         5.57904249165595e-11 * buf[4] + 4.46323399332476e-11 * buf[5] +
         2.23161699666238e-11 * buf[6] + 6.37604856189252e-12 * buf[7] +
         7.97006070236564e-13 * buf[8];
}


x86 assembly (clang, -O0):
<process3>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  0x2f57(%rip),%xmm0
movsd  %xmm0,0x2f57(%rip)
movsd  0x2f3f(%rip),%xmm0
movsd  %xmm0,0x2f3f(%rip)
movsd  0x2f27(%rip),%xmm0
movsd  %xmm0,0x2f27(%rip)
movsd  0x2f0f(%rip),%xmm0
movsd  %xmm0,0x2f0f(%rip)
movsd  0x2ef7(%rip),%xmm0
movsd  %xmm0,0x2ef7(%rip)
movsd  0x2edf(%rip),%xmm0
movsd  %xmm0,0x2edf(%rip)
movsd  0x2ec7(%rip),%xmm0
movsd  %xmm0,0x2ec7(%rip)
movsd  0x2eaf(%rip),%xmm0
movsd  %xmm0,0x2eaf(%rip)
movsd  -0x8(%rbp),%xmm0
movsd  0x2ea2(%rip),%xmm1
movsd  0xec2(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2e92(%rip),%xmm0
movsd  0xea2(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x2e82(%rip),%xmm1
movsd  0xe82(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2e72(%rip),%xmm0
movsd  0xe62(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x2e62(%rip),%xmm1
movsd  0xe42(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2e52(%rip),%xmm0
movsd  0xe22(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x2e42(%rip),%xmm1
movsd  0xe02(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2e32(%rip),%xmm0
movsd  0xde2(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x2dda(%rip)
movsd  0x2dd2(%rip),%xmm1
movsd  0xda2(%rip),%xmm0
mulsd  0x2dca(%rip),%xmm0
movsd  0xd8a(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2dba(%rip),%xmm0
movsd  0xd82(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x2daa(%rip),%xmm1
movsd  0xd72(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2d9a(%rip),%xmm0
movsd  0xd62(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x2d8a(%rip),%xmm1
movsd  0xd42(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2d7a(%rip),%xmm0
movsd  0xd22(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x2d6a(%rip),%xmm1
movsd  0xd02(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2d5a(%rip),%xmm0
movsd  0xce2(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<process3>:
movsd  0x2f97(%rip),%xmm8
movsd  0x2f7e(%rip),%xmm9
movsd  %xmm9,0x2f85(%rip)
movsd  0x2f5d(%rip),%xmm3
movsd  %xmm3,0x2f65(%rip)
movsd  0x2f3d(%rip),%xmm4
movsd  %xmm4,0x2f45(%rip)
movsd  0x2f1d(%rip),%xmm5
movsd  %xmm5,0x2f25(%rip)
movsd  0x2efd(%rip),%xmm6
movsd  %xmm6,0x2f05(%rip)
movsd  0x2edd(%rip),%xmm7
movsd  %xmm7,0x2ee5(%rip)
movsd  0x2ebd(%rip),%xmm1
movsd  %xmm1,0x2ec5(%rip)
movsd  0xe7d(%rip),%xmm2
mulsd  %xmm1,%xmm2
addsd  %xmm2,%xmm0
movsd  0xe75(%rip),%xmm2
mulsd  %xmm7,%xmm2
addsd  %xmm2,%xmm0
movsd  0xe6d(%rip),%xmm2
mulsd  %xmm6,%xmm2
addsd  %xmm2,%xmm0
movsd  0xe65(%rip),%xmm2
mulsd  %xmm5,%xmm2
addsd  %xmm2,%xmm0
movsd  0xe5d(%rip),%xmm2
mulsd  %xmm4,%xmm2
addsd  %xmm2,%xmm0
movsd  0xe55(%rip),%xmm2
mulsd  %xmm3,%xmm2
addsd  %xmm2,%xmm0
movsd  0xe4d(%rip),%xmm2
mulsd  %xmm9,%xmm2
addsd  %xmm2,%xmm0
movsd  0xe44(%rip),%xmm2
mulsd  %xmm8,%xmm2
addsd  %xmm2,%xmm0
movsd  %xmm0,0x2e2b(%rip)
movsd  0xe33(%rip),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xe2e(%rip),%xmm10
mulsd  %xmm10,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe25(%rip),%xmm1
mulsd  %xmm1,%xmm7
addsd  %xmm7,%xmm0
movsd  0xe1d(%rip),%xmm7
mulsd  %xmm7,%xmm6
addsd  %xmm6,%xmm0
mulsd  0xe15(%rip),%xmm5
addsd  %xmm5,%xmm0
mulsd  %xmm7,%xmm4
addsd  %xmm4,%xmm0
mulsd  %xmm1,%xmm3
addsd  %xmm3,%xmm0
mulsd  %xmm2,%xmm9
addsd  %xmm9,%xmm0
mulsd  %xmm10,%xmm8
addsd  %xmm8,%xmm0
ret

LLVM IR (-O0):
@process3.buf = internal global [9 x double] zeroinitializer
define double @process3(double %0) {
%2 = alloca double
store double %0, double* %2
%3 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 7)
store double %3, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 8)
%4 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 6)
store double %4, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 7)
%5 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 5)
store double %5, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 6)
%6 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 4)
store double %6, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 5)
%7 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 3)
store double %7, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 4)
%8 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 2)
store double %8, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 3)
%9 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 1)
store double %9, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 2)
%10 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 0)
store double %10, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 1)
%11 = load double, double* %2
%12 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 1)
%13 = call double @llvm.fmuladd.f64(double 0x401E959E9AE9ECC2, double %12, double %11)
%14 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 2)
%15 = call double @llvm.fmuladd.f64(double 0xC03995BA1D5C51DE, double %14, double %13)
%16 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 3)
%17 = call double @llvm.fmuladd.f64(double 0x4048778FC2438728, double %16, double %15)
%18 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 4)
%19 = call double @llvm.fmuladd.f64(double 0xC04D4181479C2167, double %18, double %17)
%20 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 5)
%21 = call double @llvm.fmuladd.f64(double 0x40466515F0A11E5B, double %20, double %19)
%22 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 6)
%23 = call double @llvm.fmuladd.f64(double 0xC0356F48797FA989, double %22, double %21)
%24 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 7)
%25 = call double @llvm.fmuladd.f64(double 0x4017740458D37EA5, double %24, double %23)
%26 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 8)
%27 = call double @llvm.fmuladd.f64(double 0xBFE675DF94A9003D, double %26, double %25)
store double %27, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 0)
%28 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 0)
%29 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 1)
%30 = fmul double 0x3D9C0ACAE017525F, %29
%31 = call double @llvm.fmuladd.f64(double 0x3D6C0ACAE0175255, double %28, double %30)
%32 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 2)
%33 = call double @llvm.fmuladd.f64(double 0x3DB889718414680D, double %32, double %31)
%34 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 3)
%35 = call double @llvm.fmuladd.f64(double 0x3DC889718414680D, double %34, double %33)
%36 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 4)
%37 = call double @llvm.fmuladd.f64(double 0x3DCEABCDE5198210, double %36, double %35)
%38 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 5)
%39 = call double @llvm.fmuladd.f64(double 0x3DC889718414680D, double %38, double %37)
%40 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 6)
%41 = call double @llvm.fmuladd.f64(double 0x3DB889718414680D, double %40, double %39)
%42 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 7)
%43 = call double @llvm.fmuladd.f64(double 0x3D9C0ACAE017525F, double %42, double %41)
%44 = load double, double* getelementptr inbounds ([9 x double], [9 x double]* @process3.buf, i64 0, i64 8)
%45 = call double @llvm.fmuladd.f64(double 0x3D6C0ACAE0175255, double %44, double %43)
ret double %45
}

LLVM IR (-O2):
@process3.buf.0 = internal unnamed_addr global double 0.000000e+00
@process3.buf.1 = internal unnamed_addr global double 0.000000e+00
@process3.buf.2 = internal unnamed_addr global double 0.000000e+00
@process3.buf.3 = internal unnamed_addr global double 0.000000e+00
@process3.buf.4 = internal unnamed_addr global double 0.000000e+00
@process3.buf.5 = internal unnamed_addr global double 0.000000e+00
@process3.buf.6 = internal unnamed_addr global double 0.000000e+00
@process3.buf.7 = internal unnamed_addr global double 0.000000e+00
define double @process3(double %0) {
%2 = load double, double* @process3.buf.7
%3 = load double, double* @process3.buf.6
store double %3, double* @process3.buf.7
%4 = load double, double* @process3.buf.5
store double %4, double* @process3.buf.6
%5 = load double, double* @process3.buf.4
store double %5, double* @process3.buf.5
%6 = load double, double* @process3.buf.3
store double %6, double* @process3.buf.4
%7 = load double, double* @process3.buf.2
store double %7, double* @process3.buf.3
%8 = load double, double* @process3.buf.1
store double %8, double* @process3.buf.2
%9 = load double, double* @process3.buf.0
store double %9, double* @process3.buf.1
%10 = tail call double @llvm.fmuladd.f64(double %9, double 0x401E959E9AE9ECC2, double %0)
%11 = tail call double @llvm.fmuladd.f64(double %8, double 0xC03995BA1D5C51DE, double %10)
%12 = tail call double @llvm.fmuladd.f64(double %7, double 0x4048778FC2438728, double %11)
%13 = tail call double @llvm.fmuladd.f64(double %6, double 0xC04D4181479C2167, double %12)
%14 = tail call double @llvm.fmuladd.f64(double %5, double 0x40466515F0A11E5B, double %13)
%15 = tail call double @llvm.fmuladd.f64(double %4, double 0xC0356F48797FA989, double %14)
%16 = tail call double @llvm.fmuladd.f64(double %3, double 0x4017740458D37EA5, double %15)
%17 = tail call double @llvm.fmuladd.f64(double %2, double 0xBFE675DF94A9003D, double %16)
store double %17, double* @process3.buf.0
%18 = fmul double %9, 0x3D9C0ACAE017525F
%19 = tail call double @llvm.fmuladd.f64(double %17, double 0x3D6C0ACAE0175255, double %18)
%20 = tail call double @llvm.fmuladd.f64(double %8, double 0x3DB889718414680D, double %19)
%21 = tail call double @llvm.fmuladd.f64(double %7, double 0x3DC889718414680D, double %20)
%22 = tail call double @llvm.fmuladd.f64(double %6, double 0x3DCEABCDE5198210, double %21)
%23 = tail call double @llvm.fmuladd.f64(double %5, double 0x3DC889718414680D, double %22)
%24 = tail call double @llvm.fmuladd.f64(double %4, double 0x3DB889718414680D, double %23)
%25 = tail call double @llvm.fmuladd.f64(double %3, double 0x3D9C0ACAE017525F, double %24)
%26 = tail call double @llvm.fmuladd.f64(double %2, double 0x3D6C0ACAE0175255, double %25)
ret double %26
}