iir8(double a0, double a1, double a2, double a3, double a4, double a5,
     double a6, double a7, double b0, double b1, double b2, double b3,
     double b4, double b5, double b6, double x0, double x1, double x2,
     double x3, double x4, double x5, double x6, double x7, double y0,
     double y1, double y2, double y3, double y4, double y5, double y6,
     double y7) {
  y0 = a0 * x0;
  y1 = a1 * x1 + y0 - b0 * y0;
  y2 = a2 * x2 + y1 - b1 * y1;
  y3 = a3 * x3 + y2 - b2 * y2;
  y4 = a4 * x4 + y3 - b3 * y3;
  y5 = a5 * x5 + y4 - b4 * y4;
  y6 = a6 * x6 + y5 - b5 * y5;
  y7 = a7 * x7 + y6 - b6 * y6;
}


x86 assembly (clang, -O0):
<iir8>:
push   %rbp
mov    %rsp,%rbp
movsd  0xc0(%rbp),%xmm8
movsd  0xb8(%rbp),%xmm8
movsd  0xb0(%rbp),%xmm8
movsd  0xa8(%rbp),%xmm8
movsd  0xa0(%rbp),%xmm8
movsd  0x98(%rbp),%xmm8
movsd  0x90(%rbp),%xmm8
movsd  0x88(%rbp),%xmm8
movsd  0x80(%rbp),%xmm8
movsd  0x78(%rbp),%xmm8
movsd  0x70(%rbp),%xmm8
movsd  0x68(%rbp),%xmm8
movsd  0x60(%rbp),%xmm8
movsd  0x58(%rbp),%xmm8
movsd  0x50(%rbp),%xmm8
movsd  0x48(%rbp),%xmm8
movsd  0x40(%rbp),%xmm8
movsd  0x38(%rbp),%xmm8
movsd  0x30(%rbp),%xmm8
movsd  0x28(%rbp),%xmm8
movsd  0x20(%rbp),%xmm8
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  %xmm3,-0x28(%rbp)
movsd  %xmm4,-0x30(%rbp)
movsd  %xmm5,-0x38(%rbp)
movsd  %xmm6,-0x40(%rbp)
movsd  %xmm7,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  0x48(%rbp),%xmm0
movsd  %xmm0,0x88(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  0x50(%rbp),%xmm2
movsd  0x88(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x10(%rbp),%xmm0
movsd  0x88(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x90(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  0x58(%rbp),%xmm2
movsd  0x90(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x18(%rbp),%xmm0
movsd  0x90(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x98(%rbp)
movsd  -0x28(%rbp),%xmm1
movsd  0x60(%rbp),%xmm2
movsd  0x98(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x20(%rbp),%xmm0
movsd  0x98(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0xa0(%rbp)
movsd  -0x30(%rbp),%xmm1
movsd  0x68(%rbp),%xmm2
movsd  0xa0(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x28(%rbp),%xmm0
movsd  0xa0(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0xa8(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  0x70(%rbp),%xmm2
movsd  0xa8(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x30(%rbp),%xmm0
movsd  0xa8(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0xb0(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  0x78(%rbp),%xmm2
movsd  0xb0(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x38(%rbp),%xmm0
movsd  0xb0(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0xb8(%rbp)
movsd  -0x48(%rbp),%xmm1
movsd  0x80(%rbp),%xmm2
movsd  0xb8(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x40(%rbp),%xmm0
movsd  0xb8(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0xc0(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<iir8>:
ret

LLVM IR (-O0):
define i32 @iir8(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15, double %16, double %17, double %18, double %19, double %20, double %21, double %22, double %23, double %24, double %25, double %26, double %27, double %28, double %29, double %30) {
%32 = alloca i32
%33 = alloca double
%34 = alloca double
%35 = alloca double
%36 = alloca double
%37 = alloca double
%38 = alloca double
%39 = alloca double
%40 = alloca double
%41 = alloca double
%42 = alloca double
%43 = alloca double
%44 = alloca double
%45 = alloca double
%46 = alloca double
%47 = alloca double
%48 = alloca double
%49 = alloca double
%50 = alloca double
%51 = alloca double
%52 = alloca double
%53 = alloca double
%54 = alloca double
%55 = alloca double
%56 = alloca double
%57 = alloca double
%58 = alloca double
%59 = alloca double
%60 = alloca double
%61 = alloca double
%62 = alloca double
%63 = alloca double
store double %0, double* %33
store double %1, double* %34
store double %2, double* %35
store double %3, double* %36
store double %4, double* %37
store double %5, double* %38
store double %6, double* %39
store double %7, double* %40
store double %8, double* %41
store double %9, double* %42
store double %10, double* %43
store double %11, double* %44
store double %12, double* %45
store double %13, double* %46
store double %14, double* %47
store double %15, double* %48
store double %16, double* %49
store double %17, double* %50
store double %18, double* %51
store double %19, double* %52
store double %20, double* %53
store double %21, double* %54
store double %22, double* %55
store double %23, double* %56
store double %24, double* %57
store double %25, double* %58
store double %26, double* %59
store double %27, double* %60
store double %28, double* %61
store double %29, double* %62
store double %30, double* %63
%64 = load double, double* %33
%65 = load double, double* %48
%66 = fmul double %64, %65
store double %66, double* %56
%67 = load double, double* %34
%68 = load double, double* %49
%69 = load double, double* %56
%70 = call double @llvm.fmuladd.f64(double %67, double %68, double %69)
%71 = load double, double* %41
%72 = load double, double* %56
%73 = fneg double %71
%74 = call double @llvm.fmuladd.f64(double %73, double %72, double %70)
store double %74, double* %57
%75 = load double, double* %35
%76 = load double, double* %50
%77 = load double, double* %57
%78 = call double @llvm.fmuladd.f64(double %75, double %76, double %77)
%79 = load double, double* %42
%80 = load double, double* %57
%81 = fneg double %79
%82 = call double @llvm.fmuladd.f64(double %81, double %80, double %78)
store double %82, double* %58
%83 = load double, double* %36
%84 = load double, double* %51
%85 = load double, double* %58
%86 = call double @llvm.fmuladd.f64(double %83, double %84, double %85)
%87 = load double, double* %43
%88 = load double, double* %58
%89 = fneg double %87
%90 = call double @llvm.fmuladd.f64(double %89, double %88, double %86)
store double %90, double* %59
%91 = load double, double* %37
%92 = load double, double* %52
%93 = load double, double* %59
%94 = call double @llvm.fmuladd.f64(double %91, double %92, double %93)
%95 = load double, double* %44
%96 = load double, double* %59
%97 = fneg double %95
%98 = call double @llvm.fmuladd.f64(double %97, double %96, double %94)
store double %98, double* %60
%99 = load double, double* %38
%100 = load double, double* %53
%101 = load double, double* %60
%102 = call double @llvm.fmuladd.f64(double %99, double %100, double %101)
%103 = load double, double* %45
%104 = load double, double* %60
%105 = fneg double %103
%106 = call double @llvm.fmuladd.f64(double %105, double %104, double %102)
store double %106, double* %61
%107 = load double, double* %39
%108 = load double, double* %54
%109 = load double, double* %61
%110 = call double @llvm.fmuladd.f64(double %107, double %108, double %109)
%111 = load double, double* %46
%112 = load double, double* %61
%113 = fneg double %111
%114 = call double @llvm.fmuladd.f64(double %113, double %112, double %110)
store double %114, double* %62
%115 = load double, double* %40
%116 = load double, double* %55
%117 = load double, double* %62
%118 = call double @llvm.fmuladd.f64(double %115, double %116, double %117)
%119 = load double, double* %47
%120 = load double, double* %62
%121 = fneg double %119
%122 = call double @llvm.fmuladd.f64(double %121, double %120, double %118)
store double %122, double* %63
%123 = load i32, i32* %32
ret i32 %123
}

LLVM IR (-O2):
define i32 @iir8(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15, double %16, double %17, double %18, double %19, double %20, double %21, double %22, double %23, double %24, double %25, double %26, double %27, double %28, double %29, double %30) {
ret i32 undef
}