double process1(double val) {
  static double buf1[3];
  static double buf2[3];
  static double buf3[3];
  static double buf4[3];
  buf1[2] = buf1[1];
  buf1[1] = buf1[0];
  buf1[0] = val + 1.91152821076575 * buf1[1] - 0.915307632868809 * buf1[2];
  val = 0.000944855525763628 * buf1[0] + 0.00188971105152726 * buf1[1] +
        0.000944855525763628 * buf1[2];
  buf2[2] = buf2[1];
  buf2[1] = buf2[0];
  buf2[0] = val + 1.91152821076575 * buf2[1] - 0.915307632868809 * buf2[2];
  val = 0.000944855525763628 * buf2[0] + 0.00188971105152726 * buf2[1] +
        0.000944855525763628 * buf2[2];
  buf3[2] = buf3[1];
  buf3[1] = buf3[0];
  buf3[0] = val + 1.91152821076575 * buf3[1] - 0.915307632868809 * buf3[2];
  val = 0.000944855525763628 * buf3[0] + 0.00188971105152726 * buf3[1] +
        0.000944855525763628 * buf3[2];
  buf4[2] = buf4[1];
  buf4[1] = buf4[0];
  buf4[0] = val + 1.91152821076575 * buf4[1] - 0.915307632868809 * buf4[2];
  val = 0.000944855525763628 * buf4[0] + 0.00188971105152726 * buf4[1] +
        0.000944855525763628 * buf4[2];
  return val;
}


x86 assembly (clang, -O0):
<process1>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  0x2f27(%rip),%xmm0
movsd  %xmm0,0x2f27(%rip)
movsd  0x2f0f(%rip),%xmm0
movsd  %xmm0,0x2f0f(%rip)
movsd  -0x8(%rbp),%xmm0
movsd  0x2f02(%rip),%xmm1
movsd  0xeda(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2ef2(%rip),%xmm0
movsd  0xeba(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x2eca(%rip)
movsd  0x2ec2(%rip),%xmm1
movsd  0xe92(%rip),%xmm0
mulsd  0x2eba(%rip),%xmm0
movsd  0xe7a(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2eaa(%rip),%xmm0
movsd  0xe62(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  0x2ea5(%rip),%xmm0
movsd  %xmm0,0x2ea5(%rip)
movsd  0x2e8d(%rip),%xmm0
movsd  %xmm0,0x2e8d(%rip)
movsd  -0x8(%rbp),%xmm0
movsd  0x2e80(%rip),%xmm1
movsd  0xe38(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2e70(%rip),%xmm0
movsd  0xe18(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x2e48(%rip)
movsd  0x2e40(%rip),%xmm1
movsd  0xdf0(%rip),%xmm0
mulsd  0x2e38(%rip),%xmm0
movsd  0xdd8(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2e28(%rip),%xmm0
movsd  0xdc0(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  0x2e23(%rip),%xmm0
movsd  %xmm0,0x2e23(%rip)
movsd  0x2e0b(%rip),%xmm0
movsd  %xmm0,0x2e0b(%rip)
movsd  -0x8(%rbp),%xmm0
movsd  0x2dfe(%rip),%xmm1
movsd  0xd96(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2dee(%rip),%xmm0
movsd  0xd76(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x2dc6(%rip)
movsd  0x2dbe(%rip),%xmm1
movsd  0xd4e(%rip),%xmm0
mulsd  0x2db6(%rip),%xmm0
movsd  0xd36(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2da6(%rip),%xmm0
movsd  0xd1e(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  0x2da1(%rip),%xmm0
movsd  %xmm0,0x2da1(%rip)
movsd  0x2d89(%rip),%xmm0
movsd  %xmm0,0x2d89(%rip)
movsd  -0x8(%rbp),%xmm0
movsd  0x2d7c(%rip),%xmm1
movsd  0xcf4(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2d6c(%rip),%xmm0
movsd  0xcd4(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x2d44(%rip)
movsd  0x2d3c(%rip),%xmm1
movsd  0xcac(%rip),%xmm0
mulsd  0x2d34(%rip),%xmm0
movsd  0xc94(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x2d24(%rip),%xmm0
movsd  0xc7c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<process1>:
movsd  0x2f38(%rip),%xmm5
movsd  0x2f20(%rip),%xmm6
movsd  %xmm6,0x2f28(%rip)
movsd  0xee0(%rip),%xmm1
movapd %xmm6,%xmm2
mulsd  %xmm1,%xmm2
addsd  %xmm2,%xmm0
movsd  0xed4(%rip),%xmm3
movapd %xmm5,%xmm2
mulsd  %xmm3,%xmm2
addsd  %xmm2,%xmm0
movsd  %xmm0,0x2ee8(%rip)
movsd  0xec0(%rip),%xmm4
mulsd  %xmm4,%xmm6
movsd  0xebc(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm6,%xmm0
mulsd  %xmm2,%xmm5
addsd  %xmm5,%xmm0
movsd  0x2eec(%rip),%xmm5
movsd  0x2ed4(%rip),%xmm6
movsd  %xmm6,0x2edc(%rip)
movapd %xmm6,%xmm7
mulsd  %xmm1,%xmm7
addsd  %xmm7,%xmm0
movapd %xmm5,%xmm7
mulsd  %xmm3,%xmm7
addsd  %xmm7,%xmm0
movsd  %xmm0,0x2eac(%rip)
mulsd  %xmm4,%xmm6
mulsd  %xmm2,%xmm0
addsd  %xmm6,%xmm0
mulsd  %xmm2,%xmm5
addsd  %xmm5,%xmm0
movsd  0x2ec0(%rip),%xmm5
movsd  0x2ea8(%rip),%xmm6
movsd  %xmm6,0x2eb0(%rip)
movapd %xmm6,%xmm7
mulsd  %xmm1,%xmm7
addsd  %xmm7,%xmm0
movapd %xmm5,%xmm7
mulsd  %xmm3,%xmm7
addsd  %xmm7,%xmm0
movsd  %xmm0,0x2e80(%rip)
mulsd  %xmm4,%xmm6
mulsd  %xmm2,%xmm0
addsd  %xmm6,%xmm0
mulsd  %xmm2,%xmm5
addsd  %xmm5,%xmm0
movsd  0x2e94(%rip),%xmm5
movsd  0x2e7c(%rip),%xmm6
movsd  %xmm6,0x2e84(%rip)
mulsd  %xmm6,%xmm1
addsd  %xmm1,%xmm0
mulsd  %xmm5,%xmm3
addsd  %xmm3,%xmm0
movsd  %xmm0,0x2e5c(%rip)
mulsd  %xmm4,%xmm6
mulsd  %xmm2,%xmm0
addsd  %xmm6,%xmm0
mulsd  %xmm2,%xmm5
addsd  %xmm5,%xmm0
ret

LLVM IR (-O0):
@process1.buf1 = internal global [3 x double] zeroinitializer
@process1.buf2 = internal global [3 x double] zeroinitializer
@process1.buf3 = internal global [3 x double] zeroinitializer
@process1.buf4 = internal global [3 x double] zeroinitializer
define double @process1(double %0) {
%2 = alloca double
store double %0, double* %2
%3 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 1)
store double %3, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 2)
%4 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 0)
store double %4, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 1)
%5 = load double, double* %2
%6 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 1)
%7 = call double @llvm.fmuladd.f64(double 0x3FFE959E9AE9ECB7, double %6, double %5)
%8 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 2)
%9 = call double @llvm.fmuladd.f64(double 0xBFED4A333B9E6C36, double %8, double %7)
store double %9, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 0)
%10 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 0)
%11 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 1)
%12 = fmul double 0x3F5EF605CA92A04E, %11
%13 = call double @llvm.fmuladd.f64(double 0x3F4EF605CA92A03C, double %10, double %12)
%14 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf1, i64 0, i64 2)
%15 = call double @llvm.fmuladd.f64(double 0x3F4EF605CA92A03C, double %14, double %13)
store double %15, double* %2
%16 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 1)
store double %16, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 2)
%17 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 0)
store double %17, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 1)
%18 = load double, double* %2
%19 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 1)
%20 = call double @llvm.fmuladd.f64(double 0x3FFE959E9AE9ECB7, double %19, double %18)
%21 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 2)
%22 = call double @llvm.fmuladd.f64(double 0xBFED4A333B9E6C36, double %21, double %20)
store double %22, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 0)
%23 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 0)
%24 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 1)
%25 = fmul double 0x3F5EF605CA92A04E, %24
%26 = call double @llvm.fmuladd.f64(double 0x3F4EF605CA92A03C, double %23, double %25)
%27 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf2, i64 0, i64 2)
%28 = call double @llvm.fmuladd.f64(double 0x3F4EF605CA92A03C, double %27, double %26)
store double %28, double* %2
%29 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 1)
store double %29, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 2)
%30 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 0)
store double %30, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 1)
%31 = load double, double* %2
%32 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 1)
%33 = call double @llvm.fmuladd.f64(double 0x3FFE959E9AE9ECB7, double %32, double %31)
%34 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 2)
%35 = call double @llvm.fmuladd.f64(double 0xBFED4A333B9E6C36, double %34, double %33)
store double %35, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 0)
%36 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 0)
%37 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 1)
%38 = fmul double 0x3F5EF605CA92A04E, %37
%39 = call double @llvm.fmuladd.f64(double 0x3F4EF605CA92A03C, double %36, double %38)
%40 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf3, i64 0, i64 2)
%41 = call double @llvm.fmuladd.f64(double 0x3F4EF605CA92A03C, double %40, double %39)
store double %41, double* %2
%42 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 1)
store double %42, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 2)
%43 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 0)
store double %43, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 1)
%44 = load double, double* %2
%45 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 1)
%46 = call double @llvm.fmuladd.f64(double 0x3FFE959E9AE9ECB7, double %45, double %44)
%47 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 2)
%48 = call double @llvm.fmuladd.f64(double 0xBFED4A333B9E6C36, double %47, double %46)
store double %48, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 0)
%49 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 0)
%50 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 1)
%51 = fmul double 0x3F5EF605CA92A04E, %50
%52 = call double @llvm.fmuladd.f64(double 0x3F4EF605CA92A03C, double %49, double %51)
%53 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @process1.buf4, i64 0, i64 2)
%54 = call double @llvm.fmuladd.f64(double 0x3F4EF605CA92A03C, double %53, double %52)
store double %54, double* %2
%55 = load double, double* %2
ret double %55
}

LLVM IR (-O2):
@process1.buf1.0 = internal unnamed_addr global double 0.000000e+00
@process1.buf1.1 = internal unnamed_addr global double 0.000000e+00
@process1.buf2.0 = internal unnamed_addr global double 0.000000e+00
@process1.buf2.1 = internal unnamed_addr global double 0.000000e+00
@process1.buf3.0 = internal unnamed_addr global double 0.000000e+00
@process1.buf3.1 = internal unnamed_addr global double 0.000000e+00
@process1.buf4.0 = internal unnamed_addr global double 0.000000e+00
@process1.buf4.1 = internal unnamed_addr global double 0.000000e+00
define double @process1(double %0) {
%2 = load double, double* @process1.buf1.1
%3 = load double, double* @process1.buf1.0
store double %3, double* @process1.buf1.1
%4 = tail call double @llvm.fmuladd.f64(double %3, double 0x3FFE959E9AE9ECB7, double %0)
%5 = tail call double @llvm.fmuladd.f64(double %2, double 0xBFED4A333B9E6C36, double %4)
store double %5, double* @process1.buf1.0
%6 = fmul double %3, 0x3F5EF605CA92A04E
%7 = tail call double @llvm.fmuladd.f64(double %5, double 0x3F4EF605CA92A03C, double %6)
%8 = tail call double @llvm.fmuladd.f64(double %2, double 0x3F4EF605CA92A03C, double %7)
%9 = load double, double* @process1.buf2.1
%10 = load double, double* @process1.buf2.0
store double %10, double* @process1.buf2.1
%11 = tail call double @llvm.fmuladd.f64(double %10, double 0x3FFE959E9AE9ECB7, double %8)
%12 = tail call double @llvm.fmuladd.f64(double %9, double 0xBFED4A333B9E6C36, double %11)
store double %12, double* @process1.buf2.0
%13 = fmul double %10, 0x3F5EF605CA92A04E
%14 = tail call double @llvm.fmuladd.f64(double %12, double 0x3F4EF605CA92A03C, double %13)
%15 = tail call double @llvm.fmuladd.f64(double %9, double 0x3F4EF605CA92A03C, double %14)
%16 = load double, double* @process1.buf3.1
%17 = load double, double* @process1.buf3.0
store double %17, double* @process1.buf3.1
%18 = tail call double @llvm.fmuladd.f64(double %17, double 0x3FFE959E9AE9ECB7, double %15)
%19 = tail call double @llvm.fmuladd.f64(double %16, double 0xBFED4A333B9E6C36, double %18)
store double %19, double* @process1.buf3.0
%20 = fmul double %17, 0x3F5EF605CA92A04E
%21 = tail call double @llvm.fmuladd.f64(double %19, double 0x3F4EF605CA92A03C, double %20)
%22 = tail call double @llvm.fmuladd.f64(double %16, double 0x3F4EF605CA92A03C, double %21)
%23 = load double, double* @process1.buf4.1
%24 = load double, double* @process1.buf4.0
store double %24, double* @process1.buf4.1
%25 = tail call double @llvm.fmuladd.f64(double %24, double 0x3FFE959E9AE9ECB7, double %22)
%26 = tail call double @llvm.fmuladd.f64(double %23, double 0xBFED4A333B9E6C36, double %25)
store double %26, double* @process1.buf4.0
%27 = fmul double %24, 0x3F5EF605CA92A04E
%28 = tail call double @llvm.fmuladd.f64(double %26, double 0x3F4EF605CA92A03C, double %27)
%29 = tail call double @llvm.fmuladd.f64(double %23, double 0x3F4EF605CA92A03C, double %28)
ret double %29
}