double evalDerivDisp(double coeff[], int ncoeff, double m, double wl) {
  double slope;
  switch (ncoeff) {
  case 1:
    slope = 0.;
    break;
  case 2:
    slope = coeff[1] * m;
    break;
  case 3:
  case 4:
    slope = coeff[1] * m + coeff[2] * 2. * m * m * wl;
    break;
  case 5:
    slope = coeff[1] * m + coeff[2] * 2. * m * m * wl + coeff[4];
    break;
  case 6:
    slope =
        coeff[1] * m + coeff[2] * 2. * m * m * wl + coeff[4] + coeff[5] * m * m;
    break;
  case 7:
    slope = coeff[1] * m + coeff[2] * 2. * m * m * wl + coeff[4] +
            coeff[5] * m * m + coeff[6] * 2. * m * wl;
    break;
  case 8:
  case 9:
    slope = coeff[1] * m + coeff[2] * 2. * m * m * wl + coeff[4] +
            coeff[5] * m * m + coeff[6] * 2. * m * wl +
            coeff[7] * 3. * m * m * m * wl * wl;
    break;
  default:
    slope = 1000000.;
  }
  return slope;
}


x86 assembly (clang, -O0):
<evalDerivDisp>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x30(%rbp)
sub    $0x8,%eax
ja     1390 <evalDerivDisp+0x290>
mov    -0x30(%rbp),%rax
lea    0xee3(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    139d <evalDerivDisp+0x29d>
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    139d <evalDerivDisp+0x29d>
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x18(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movsd  0xe8b(%rip),%xmm1
mulsd  0x10(%rax),%xmm1
mulsd  -0x18(%rbp),%xmm1
mulsd  -0x18(%rbp),%xmm1
mulsd  -0x20(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    139d <evalDerivDisp+0x29d>
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x18(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movsd  0xe4b(%rip),%xmm1
mulsd  0x10(%rax),%xmm1
mulsd  -0x18(%rbp),%xmm1
mulsd  -0x18(%rbp),%xmm1
mulsd  -0x20(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
addsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    139d <evalDerivDisp+0x29d>
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm1
movsd  -0x18(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movsd  0xe02(%rip),%xmm0
mulsd  0x10(%rax),%xmm0
mulsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
addsd  0x20(%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    139d <evalDerivDisp+0x29d>
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x18(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movsd  0xd9e(%rip),%xmm1
mulsd  0x10(%rax),%xmm1
mulsd  -0x18(%rbp),%xmm1
mulsd  -0x18(%rbp),%xmm1
mulsd  -0x20(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
addsd  0x20(%rax),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
movsd  0xd52(%rip),%xmm0
mulsd  0x30(%rax),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    139d <evalDerivDisp+0x29d>
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm1
movsd  -0x18(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movsd  0xd17(%rip),%xmm0
mulsd  0x10(%rax),%xmm0
mulsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
addsd  0x20(%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  0xccb(%rip),%xmm1
mulsd  0x30(%rax),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
movsd  0xca0(%rip),%xmm0
mulsd  0x38(%rax),%xmm0
mulsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    139d <evalDerivDisp+0x29d>
movsd  0xc78(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<evalDerivDisp>:
add    $0xffffffff,%esi
cmp    $0x8,%esi
ja     11ad <evalDerivDisp+0xad>
xorps  %xmm2,%xmm2
lea    0xefa(%rip),%rax
movslq (%rax,%rsi,4),%rcx
add    %rax,%rcx
jmp    *%rcx
movsd  0x10(%rdi),%xmm2
addsd  %xmm2,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm2
mulsd  0x8(%rdi),%xmm0
addsd  %xmm2,%xmm0
ret
movsd  0x10(%rdi),%xmm2
movsd  0x30(%rdi),%xmm3
addsd  %xmm2,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm2
movsd  0x8(%rdi),%xmm4
mulsd  %xmm0,%xmm4
addsd  %xmm2,%xmm4
addsd  0x20(%rdi),%xmm4
movsd  0x28(%rdi),%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm4,%xmm2
addsd  %xmm3,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm1,%xmm3
addsd  %xmm2,%xmm3
movsd  0x38(%rdi),%xmm2
mulsd  0xe68(%rip),%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm2
jmp    1265 <evalDerivDisp+0x165>
movsd  0xe53(%rip),%xmm2
movaps %xmm2,%xmm0
ret
mulsd  0x8(%rdi),%xmm0
ret
movsd  0x10(%rdi),%xmm2
addsd  %xmm2,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  0x8(%rdi),%xmm0
mulsd  %xmm1,%xmm2
addsd  %xmm2,%xmm0
addsd  0x20(%rdi),%xmm0
ret
movsd  0x10(%rdi),%xmm2
addsd  %xmm2,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm2
movsd  0x8(%rdi),%xmm3
mulsd  %xmm0,%xmm3
addsd  %xmm2,%xmm3
addsd  0x20(%rdi),%xmm3
movsd  0x28(%rdi),%xmm1
mulsd  %xmm0,%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm3,%xmm1
movapd %xmm1,%xmm0
ret
movsd  0x10(%rdi),%xmm3
movsd  0x30(%rdi),%xmm2
addsd  %xmm3,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm1,%xmm3
movsd  0x8(%rdi),%xmm4
mulsd  %xmm0,%xmm4
addsd  %xmm3,%xmm4
addsd  0x20(%rdi),%xmm4
movsd  0x28(%rdi),%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
addsd  %xmm4,%xmm3
addsd  %xmm2,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm2
addsd  %xmm3,%xmm2
movapd %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @evalDerivDisp(double* %0, i32 %1, double %2, double %3) {
%5 = alloca double*
%6 = alloca i32
%7 = alloca double
%8 = alloca double
%9 = alloca double
store double* %0, double** %5
store i32 %1, i32* %6
store double %2, double* %7
store double %3, double* %8
%10 = load i32, i32* %6
switch i32 %10, label %165 [
i32 1, label %11
i32 2, label %12
i32 3, label %18
i32 4, label %18
i32 5, label %34
i32 6, label %54
i32 7, label %81
i32 8, label %116
i32 9, label %116
]
11: ; preds = %4
store double 0.000000e+00, double* %9
br label %166
12: ; preds = %4
%13 = load double*, double** %5
%14 = getelementptr inbounds double, double* %13, i64 1
%15 = load double, double* %14
%16 = load double, double* %7
%17 = fmul double %15, %16
store double %17, double* %9
br label %166
18: ; preds = %4, %4
%19 = load double*, double** %5
%20 = getelementptr inbounds double, double* %19, i64 1
%21 = load double, double* %20
%22 = load double, double* %7
%23 = load double*, double** %5
%24 = getelementptr inbounds double, double* %23, i64 2
%25 = load double, double* %24
%26 = fmul double %25, 2.000000e+00
%27 = load double, double* %7
%28 = fmul double %26, %27
%29 = load double, double* %7
%30 = fmul double %28, %29
%31 = load double, double* %8
%32 = fmul double %30, %31
%33 = call double @llvm.fmuladd.f64(double %21, double %22, double %32)
store double %33, double* %9
br label %166
34: ; preds = %4
%35 = load double*, double** %5
%36 = getelementptr inbounds double, double* %35, i64 1
%37 = load double, double* %36
%38 = load double, double* %7
%39 = load double*, double** %5
%40 = getelementptr inbounds double, double* %39, i64 2
%41 = load double, double* %40
%42 = fmul double %41, 2.000000e+00
%43 = load double, double* %7
%44 = fmul double %42, %43
%45 = load double, double* %7
%46 = fmul double %44, %45
%47 = load double, double* %8
%48 = fmul double %46, %47
%49 = call double @llvm.fmuladd.f64(double %37, double %38, double %48)
%50 = load double*, double** %5
%51 = getelementptr inbounds double, double* %50, i64 4
%52 = load double, double* %51
%53 = fadd double %49, %52
store double %53, double* %9
br label %166
54: ; preds = %4
%55 = load double*, double** %5
%56 = getelementptr inbounds double, double* %55, i64 1
%57 = load double, double* %56
%58 = load double, double* %7
%59 = load double*, double** %5
%60 = getelementptr inbounds double, double* %59, i64 2
%61 = load double, double* %60
%62 = fmul double %61, 2.000000e+00
%63 = load double, double* %7
%64 = fmul double %62, %63
%65 = load double, double* %7
%66 = fmul double %64, %65
%67 = load double, double* %8
%68 = fmul double %66, %67
%69 = call double @llvm.fmuladd.f64(double %57, double %58, double %68)
%70 = load double*, double** %5
%71 = getelementptr inbounds double, double* %70, i64 4
%72 = load double, double* %71
%73 = fadd double %69, %72
%74 = load double*, double** %5
%75 = getelementptr inbounds double, double* %74, i64 5
%76 = load double, double* %75
%77 = load double, double* %7
%78 = fmul double %76, %77
%79 = load double, double* %7
%80 = call double @llvm.fmuladd.f64(double %78, double %79, double %73)
store double %80, double* %9
br label %166
81: ; preds = %4
%82 = load double*, double** %5
%83 = getelementptr inbounds double, double* %82, i64 1
%84 = load double, double* %83
%85 = load double, double* %7
%86 = load double*, double** %5
%87 = getelementptr inbounds double, double* %86, i64 2
%88 = load double, double* %87
%89 = fmul double %88, 2.000000e+00
%90 = load double, double* %7
%91 = fmul double %89, %90
%92 = load double, double* %7
%93 = fmul double %91, %92
%94 = load double, double* %8
%95 = fmul double %93, %94
%96 = call double @llvm.fmuladd.f64(double %84, double %85, double %95)
%97 = load double*, double** %5
%98 = getelementptr inbounds double, double* %97, i64 4
%99 = load double, double* %98
%100 = fadd double %96, %99
%101 = load double*, double** %5
%102 = getelementptr inbounds double, double* %101, i64 5
%103 = load double, double* %102
%104 = load double, double* %7
%105 = fmul double %103, %104
%106 = load double, double* %7
%107 = call double @llvm.fmuladd.f64(double %105, double %106, double %100)
%108 = load double*, double** %5
%109 = getelementptr inbounds double, double* %108, i64 6
%110 = load double, double* %109
%111 = fmul double %110, 2.000000e+00
%112 = load double, double* %7
%113 = fmul double %111, %112
%114 = load double, double* %8
%115 = call double @llvm.fmuladd.f64(double %113, double %114, double %107)
store double %115, double* %9
br label %166
116: ; preds = %4, %4
%117 = load double*, double** %5
%118 = getelementptr inbounds double, double* %117, i64 1
%119 = load double, double* %118
%120 = load double, double* %7
%121 = load double*, double** %5
%122 = getelementptr inbounds double, double* %121, i64 2
%123 = load double, double* %122
%124 = fmul double %123, 2.000000e+00
%125 = load double, double* %7
%126 = fmul double %124, %125
%127 = load double, double* %7
%128 = fmul double %126, %127
%129 = load double, double* %8
%130 = fmul double %128, %129
%131 = call double @llvm.fmuladd.f64(double %119, double %120, double %130)
%132 = load double*, double** %5
%133 = getelementptr inbounds double, double* %132, i64 4
%134 = load double, double* %133
%135 = fadd double %131, %134
%136 = load double*, double** %5
%137 = getelementptr inbounds double, double* %136, i64 5
%138 = load double, double* %137
%139 = load double, double* %7
%140 = fmul double %138, %139
%141 = load double, double* %7
%142 = call double @llvm.fmuladd.f64(double %140, double %141, double %135)
%143 = load double*, double** %5
%144 = getelementptr inbounds double, double* %143, i64 6
%145 = load double, double* %144
%146 = fmul double %145, 2.000000e+00
%147 = load double, double* %7
%148 = fmul double %146, %147
%149 = load double, double* %8
%150 = call double @llvm.fmuladd.f64(double %148, double %149, double %142)
%151 = load double*, double** %5
%152 = getelementptr inbounds double, double* %151, i64 7
%153 = load double, double* %152
%154 = fmul double %153, 3.000000e+00
%155 = load double, double* %7
%156 = fmul double %154, %155
%157 = load double, double* %7
%158 = fmul double %156, %157
%159 = load double, double* %7
%160 = fmul double %158, %159
%161 = load double, double* %8
%162 = fmul double %160, %161
%163 = load double, double* %8
%164 = call double @llvm.fmuladd.f64(double %162, double %163, double %150)
store double %164, double* %9
br label %166
165: ; preds = %4
store double 1.000000e+06, double* %9
br label %166
166: ; preds = %165, %116, %81, %54, %34, %18, %12, %11
%167 = load double, double* %9
ret double %167
}

LLVM IR (-O2):
define double @evalDerivDisp(double* %0, i32 %1, double %2, double %3) {
switch i32 %1, label %101 [
i32 1, label %102
i32 2, label %5
i32 3, label %9
i32 4, label %9
i32 5, label %19
i32 6, label %32
i32 7, label %49
i32 8, label %71
i32 9, label %71
]
5: ; preds = %4
%6 = getelementptr inbounds double, double* %0, i64 1
%7 = load double, double* %6
%8 = fmul double %7, %2
br label %102
9: ; preds = %4, %4
%10 = getelementptr inbounds double, double* %0, i64 1
%11 = load double, double* %10
%12 = getelementptr inbounds double, double* %0, i64 2
%13 = load double, double* %12
%14 = fmul double %13, 2.000000e+00
%15 = fmul double %14, %2
%16 = fmul double %15, %2
%17 = fmul double %16, %3
%18 = tail call double @llvm.fmuladd.f64(double %11, double %2, double %17)
br label %102
19: ; preds = %4
%20 = getelementptr inbounds double, double* %0, i64 1
%21 = load double, double* %20
%22 = getelementptr inbounds double, double* %0, i64 2
%23 = load double, double* %22
%24 = fmul double %23, 2.000000e+00
%25 = fmul double %24, %2
%26 = fmul double %25, %2
%27 = fmul double %26, %3
%28 = tail call double @llvm.fmuladd.f64(double %21, double %2, double %27)
%29 = getelementptr inbounds double, double* %0, i64 4
%30 = load double, double* %29
%31 = fadd double %30, %28
br label %102
32: ; preds = %4
%33 = getelementptr inbounds double, double* %0, i64 1
%34 = load double, double* %33
%35 = getelementptr inbounds double, double* %0, i64 2
%36 = load double, double* %35
%37 = fmul double %36, 2.000000e+00
%38 = fmul double %37, %2
%39 = fmul double %38, %2
%40 = fmul double %39, %3
%41 = tail call double @llvm.fmuladd.f64(double %34, double %2, double %40)
%42 = getelementptr inbounds double, double* %0, i64 4
%43 = load double, double* %42
%44 = fadd double %43, %41
%45 = getelementptr inbounds double, double* %0, i64 5
%46 = load double, double* %45
%47 = fmul double %46, %2
%48 = tail call double @llvm.fmuladd.f64(double %47, double %2, double %44)
br label %102
49: ; preds = %4
%50 = getelementptr inbounds double, double* %0, i64 1
%51 = load double, double* %50
%52 = getelementptr inbounds double, double* %0, i64 2
%53 = load double, double* %52
%54 = fmul double %53, 2.000000e+00
%55 = fmul double %54, %2
%56 = fmul double %55, %2
%57 = fmul double %56, %3
%58 = tail call double @llvm.fmuladd.f64(double %51, double %2, double %57)
%59 = getelementptr inbounds double, double* %0, i64 4
%60 = load double, double* %59
%61 = fadd double %60, %58
%62 = getelementptr inbounds double, double* %0, i64 5
%63 = load double, double* %62
%64 = fmul double %63, %2
%65 = tail call double @llvm.fmuladd.f64(double %64, double %2, double %61)
%66 = getelementptr inbounds double, double* %0, i64 6
%67 = load double, double* %66
%68 = fmul double %67, 2.000000e+00
%69 = fmul double %68, %2
%70 = tail call double @llvm.fmuladd.f64(double %69, double %3, double %65)
br label %102
71: ; preds = %4, %4
%72 = getelementptr inbounds double, double* %0, i64 1
%73 = load double, double* %72
%74 = getelementptr inbounds double, double* %0, i64 2
%75 = load double, double* %74
%76 = fmul double %75, 2.000000e+00
%77 = fmul double %76, %2
%78 = fmul double %77, %2
%79 = fmul double %78, %3
%80 = tail call double @llvm.fmuladd.f64(double %73, double %2, double %79)
%81 = getelementptr inbounds double, double* %0, i64 4
%82 = load double, double* %81
%83 = fadd double %82, %80
%84 = getelementptr inbounds double, double* %0, i64 5
%85 = load double, double* %84
%86 = fmul double %85, %2
%87 = tail call double @llvm.fmuladd.f64(double %86, double %2, double %83)
%88 = getelementptr inbounds double, double* %0, i64 6
%89 = load double, double* %88
%90 = fmul double %89, 2.000000e+00
%91 = fmul double %90, %2
%92 = tail call double @llvm.fmuladd.f64(double %91, double %3, double %87)
%93 = getelementptr inbounds double, double* %0, i64 7
%94 = load double, double* %93
%95 = fmul double %94, 3.000000e+00
%96 = fmul double %95, %2
%97 = fmul double %96, %2
%98 = fmul double %97, %2
%99 = fmul double %98, %3
%100 = tail call double @llvm.fmuladd.f64(double %99, double %3, double %92)
br label %102
101: ; preds = %4
br label %102
102: ; preds = %4, %101, %71, %49, %32, %19, %9, %5
%103 = phi double [ 1.000000e+06, %101 ], [ %100, %71 ], [ %70, %49 ], [ %48, %32 ], [ %31, %19 ], [ %18, %9 ], [ %8, %5 ], [ 0.000000e+00, %4 ]
ret double %103
}