double process4(double in) {
  static float buf[9];
  float val = in;
  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):
<process4>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  0x2f2d(%rip),%xmm0
movss  %xmm0,0x2f29(%rip)
movss  0x2f19(%rip),%xmm0
movss  %xmm0,0x2f15(%rip)
movss  0x2f05(%rip),%xmm0
movss  %xmm0,0x2f01(%rip)
movss  0x2ef1(%rip),%xmm0
movss  %xmm0,0x2eed(%rip)
movss  0x2edd(%rip),%xmm0
movss  %xmm0,0x2ed9(%rip)
movss  0x2ec9(%rip),%xmm0
movss  %xmm0,0x2ec5(%rip)
movss  0x2eb5(%rip),%xmm0
movss  %xmm0,0x2eb1(%rip)
movss  0x2ea1(%rip),%xmm0
movss  %xmm0,0x2e9d(%rip)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  0x2e8c(%rip),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xeac(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  0x2e74(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe88(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  0x2e5c(%rip),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe64(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  0x2e44(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe40(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  0x2e2c(%rip),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe1c(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  0x2e14(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdf8(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  0x2dfc(%rip),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xdd4(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  0x2de4(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdb0(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x2da4(%rip)
movss  0x2d9c(%rip),%xmm0
cvtss2sd %xmm0,%xmm1
movss  0x2d94(%rip),%xmm0
cvtss2sd %xmm0,%xmm2
movsd  0xd5c(%rip),%xmm0
mulsd  %xmm2,%xmm0
movsd  0xd48(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  0x2d70(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd3c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  0x2d58(%rip),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xd28(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  0x2d40(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd14(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  0x2d28(%rip),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xcf0(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  0x2d10(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xccc(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  0x2cf8(%rip),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xca8(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  0x2ce0(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xc84(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<process4>:
cvtsd2ss %xmm0,%xmm1
movss  0x2f73(%rip),%xmm8
movss  0x2f62(%rip),%xmm9
movss  %xmm9,0x2f61(%rip)
movss  0x2f49(%rip),%xmm6
movss  %xmm6,0x2f49(%rip)
movss  0x2f29(%rip),%xmm5
movss  %xmm5,0x2f31(%rip)
movss  0x2f09(%rip),%xmm4
movss  %xmm4,0x2f11(%rip)
movss  0x2ef1(%rip),%xmm2
movss  %xmm2,0x2ef1(%rip)
movss  0x2ed9(%rip),%xmm0
movss  %xmm0,0x2ed9(%rip)
movss  0x2eb9(%rip),%xmm3
movss  %xmm3,0x2ec1(%rip)
cvtss2sd %xmm1,%xmm1
cvtss2sd %xmm3,%xmm10
movsd  0xe70(%rip),%xmm7
mulsd  %xmm10,%xmm7
addsd  %xmm1,%xmm7
cvtss2sd %xmm0,%xmm11
movsd  0xe62(%rip),%xmm0
mulsd  %xmm11,%xmm0
addsd  %xmm7,%xmm0
cvtss2sd %xmm2,%xmm2
movsd  0xe55(%rip),%xmm7
mulsd  %xmm2,%xmm7
addsd  %xmm0,%xmm7
cvtss2sd %xmm4,%xmm4
movsd  0xe49(%rip),%xmm0
mulsd  %xmm4,%xmm0
addsd  %xmm7,%xmm0
cvtss2sd %xmm5,%xmm5
movsd  0xe3d(%rip),%xmm7
mulsd  %xmm5,%xmm7
addsd  %xmm0,%xmm7
cvtss2sd %xmm6,%xmm6
movsd  0xe31(%rip),%xmm0
mulsd  %xmm6,%xmm0
addsd  %xmm7,%xmm0
xorps  %xmm7,%xmm7
cvtss2sd %xmm9,%xmm7
movsd  0xe21(%rip),%xmm3
mulsd  %xmm7,%xmm3
addsd  %xmm0,%xmm3
xorps  %xmm0,%xmm0
cvtss2sd %xmm8,%xmm0
movsd  0xe11(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm3,%xmm1
cvtsd2ss %xmm1,%xmm1
movss  %xmm1,0x2df5(%rip)
cvtss2sd %xmm1,%xmm1
movsd  0xdf8(%rip),%xmm9
mulsd  %xmm9,%xmm10
movsd  0xdf2(%rip),%xmm8
mulsd  %xmm8,%xmm1
addsd  %xmm10,%xmm1
movsd  0xde8(%rip),%xmm3
mulsd  %xmm3,%xmm11
addsd  %xmm1,%xmm11
movsd  0xdde(%rip),%xmm1
mulsd  %xmm1,%xmm2
addsd  %xmm11,%xmm2
mulsd  0xdd5(%rip),%xmm4
addsd  %xmm2,%xmm4
mulsd  %xmm1,%xmm5
addsd  %xmm4,%xmm5
mulsd  %xmm3,%xmm6
addsd  %xmm5,%xmm6
mulsd  %xmm9,%xmm7
addsd  %xmm6,%xmm7
mulsd  %xmm8,%xmm0
addsd  %xmm7,%xmm0
ret

LLVM IR (-O0):
@process4.buf = internal global [9 x float] zeroinitializer
define double @process4(double %0) {
%2 = alloca double
%3 = alloca float
store double %0, double* %2
%4 = load double, double* %2
%5 = fptrunc double %4 to float
store float %5, float* %3
%6 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 7)
store float %6, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 8)
%7 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 6)
store float %7, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 7)
%8 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 5)
store float %8, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 6)
%9 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 4)
store float %9, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 5)
%10 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 3)
store float %10, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 4)
%11 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 2)
store float %11, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 3)
%12 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 1)
store float %12, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 2)
%13 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 0)
store float %13, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 1)
%14 = load float, float* %3
%15 = fpext float %14 to double
%16 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 1)
%17 = fpext float %16 to double
%18 = call double @llvm.fmuladd.f64(double 0x401E959E9AE9ECC2, double %17, double %15)
%19 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 2)
%20 = fpext float %19 to double
%21 = call double @llvm.fmuladd.f64(double 0xC03995BA1D5C51DE, double %20, double %18)
%22 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 3)
%23 = fpext float %22 to double
%24 = call double @llvm.fmuladd.f64(double 0x4048778FC2438728, double %23, double %21)
%25 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 4)
%26 = fpext float %25 to double
%27 = call double @llvm.fmuladd.f64(double 0xC04D4181479C2167, double %26, double %24)
%28 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 5)
%29 = fpext float %28 to double
%30 = call double @llvm.fmuladd.f64(double 0x40466515F0A11E5B, double %29, double %27)
%31 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 6)
%32 = fpext float %31 to double
%33 = call double @llvm.fmuladd.f64(double 0xC0356F48797FA989, double %32, double %30)
%34 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 7)
%35 = fpext float %34 to double
%36 = call double @llvm.fmuladd.f64(double 0x4017740458D37EA5, double %35, double %33)
%37 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 8)
%38 = fpext float %37 to double
%39 = call double @llvm.fmuladd.f64(double 0xBFE675DF94A9003D, double %38, double %36)
%40 = fptrunc double %39 to float
store float %40, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 0)
%41 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 0)
%42 = fpext float %41 to double
%43 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 1)
%44 = fpext float %43 to double
%45 = fmul double 0x3D9C0ACAE017525F, %44
%46 = call double @llvm.fmuladd.f64(double 0x3D6C0ACAE0175255, double %42, double %45)
%47 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 2)
%48 = fpext float %47 to double
%49 = call double @llvm.fmuladd.f64(double 0x3DB889718414680D, double %48, double %46)
%50 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 3)
%51 = fpext float %50 to double
%52 = call double @llvm.fmuladd.f64(double 0x3DC889718414680D, double %51, double %49)
%53 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 4)
%54 = fpext float %53 to double
%55 = call double @llvm.fmuladd.f64(double 0x3DCEABCDE5198210, double %54, double %52)
%56 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 5)
%57 = fpext float %56 to double
%58 = call double @llvm.fmuladd.f64(double 0x3DC889718414680D, double %57, double %55)
%59 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 6)
%60 = fpext float %59 to double
%61 = call double @llvm.fmuladd.f64(double 0x3DB889718414680D, double %60, double %58)
%62 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 7)
%63 = fpext float %62 to double
%64 = call double @llvm.fmuladd.f64(double 0x3D9C0ACAE017525F, double %63, double %61)
%65 = load float, float* getelementptr inbounds ([9 x float], [9 x float]* @process4.buf, i64 0, i64 8)
%66 = fpext float %65 to double
%67 = call double @llvm.fmuladd.f64(double 0x3D6C0ACAE0175255, double %66, double %64)
ret double %67
}

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