double sum_combo_doubles(int a, double b, int c, double d, int e, double f,
                         int g, double h, int i, double j, int k, double l,
                         int m, double n, int o, double p, int q, double r,
                         int s) {
  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r +
         s;
}


x86 assembly (clang, -O0):
<sum_combo_doubles>:
push   %rbp
mov    %rsp,%rbp
mov    0x30(%rbp),%eax
movsd  0x28(%rbp),%xmm8
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movsd  %xmm1,-0x20(%rbp)
mov    %edx,-0x24(%rbp)
movsd  %xmm2,-0x30(%rbp)
mov    %ecx,-0x34(%rbp)
movsd  %xmm3,-0x40(%rbp)
mov    %r8d,-0x44(%rbp)
movsd  %xmm4,-0x50(%rbp)
mov    %r9d,-0x54(%rbp)
movsd  %xmm5,-0x60(%rbp)
movsd  %xmm6,-0x68(%rbp)
movsd  %xmm7,-0x70(%rbp)
cvtsi2sdl -0x4(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x24(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
cvtsi2sdl -0x34(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x40(%rbp),%xmm0
cvtsi2sdl -0x44(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x50(%rbp),%xmm0
cvtsi2sdl -0x54(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x60(%rbp),%xmm0
cvtsi2sdl 0x10(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x68(%rbp),%xmm0
cvtsi2sdl 0x18(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x70(%rbp),%xmm0
cvtsi2sdl 0x20(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  0x28(%rbp),%xmm0
cvtsi2sdl 0x30(%rbp),%xmm1
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sum_combo_doubles>:
cvtsi2sd %edi,%xmm8
cvtsi2sd %esi,%xmm9
addsd  %xmm8,%xmm0
addsd  %xmm9,%xmm0
xorps  %xmm8,%xmm8
cvtsi2sd %edx,%xmm8
addsd  %xmm1,%xmm0
addsd  %xmm8,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
addsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %r8d,%xmm1
addsd  %xmm3,%xmm0
addsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %r9d,%xmm1
addsd  %xmm4,%xmm0
addsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sdl 0x8(%rsp),%xmm1
addsd  %xmm5,%xmm0
addsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sdl 0x10(%rsp),%xmm1
addsd  %xmm6,%xmm0
addsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sdl 0x18(%rsp),%xmm1
addsd  %xmm7,%xmm0
addsd  %xmm1,%xmm0
addsd  0x20(%rsp),%xmm0
xorps  %xmm1,%xmm1
cvtsi2sdl 0x28(%rsp),%xmm1
addsd  %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @sum_combo_doubles(i32 %0, double %1, i32 %2, double %3, i32 %4, double %5, i32 %6, double %7, i32 %8, double %9, i32 %10, double %11, i32 %12, double %13, i32 %14, double %15, i32 %16, double %17, i32 %18) {
%20 = alloca i32
%21 = alloca double
%22 = alloca i32
%23 = alloca double
%24 = alloca i32
%25 = alloca double
%26 = alloca i32
%27 = alloca double
%28 = alloca i32
%29 = alloca double
%30 = alloca i32
%31 = alloca double
%32 = alloca i32
%33 = alloca double
%34 = alloca i32
%35 = alloca double
%36 = alloca i32
%37 = alloca double
%38 = alloca i32
store i32 %0, i32* %20
store double %1, double* %21
store i32 %2, i32* %22
store double %3, double* %23
store i32 %4, i32* %24
store double %5, double* %25
store i32 %6, i32* %26
store double %7, double* %27
store i32 %8, i32* %28
store double %9, double* %29
store i32 %10, i32* %30
store double %11, double* %31
store i32 %12, i32* %32
store double %13, double* %33
store i32 %14, i32* %34
store double %15, double* %35
store i32 %16, i32* %36
store double %17, double* %37
store i32 %18, i32* %38
%39 = load i32, i32* %20
%40 = sitofp i32 %39 to double
%41 = load double, double* %21
%42 = fadd double %40, %41
%43 = load i32, i32* %22
%44 = sitofp i32 %43 to double
%45 = fadd double %42, %44
%46 = load double, double* %23
%47 = fadd double %45, %46
%48 = load i32, i32* %24
%49 = sitofp i32 %48 to double
%50 = fadd double %47, %49
%51 = load double, double* %25
%52 = fadd double %50, %51
%53 = load i32, i32* %26
%54 = sitofp i32 %53 to double
%55 = fadd double %52, %54
%56 = load double, double* %27
%57 = fadd double %55, %56
%58 = load i32, i32* %28
%59 = sitofp i32 %58 to double
%60 = fadd double %57, %59
%61 = load double, double* %29
%62 = fadd double %60, %61
%63 = load i32, i32* %30
%64 = sitofp i32 %63 to double
%65 = fadd double %62, %64
%66 = load double, double* %31
%67 = fadd double %65, %66
%68 = load i32, i32* %32
%69 = sitofp i32 %68 to double
%70 = fadd double %67, %69
%71 = load double, double* %33
%72 = fadd double %70, %71
%73 = load i32, i32* %34
%74 = sitofp i32 %73 to double
%75 = fadd double %72, %74
%76 = load double, double* %35
%77 = fadd double %75, %76
%78 = load i32, i32* %36
%79 = sitofp i32 %78 to double
%80 = fadd double %77, %79
%81 = load double, double* %37
%82 = fadd double %80, %81
%83 = load i32, i32* %38
%84 = sitofp i32 %83 to double
%85 = fadd double %82, %84
ret double %85
}

LLVM IR (-O2):
define double @sum_combo_doubles(i32 %0, double %1, i32 %2, double %3, i32 %4, double %5, i32 %6, double %7, i32 %8, double %9, i32 %10, double %11, i32 %12, double %13, i32 %14, double %15, i32 %16, double %17, i32 %18) {
%20 = sitofp i32 %0 to double
%21 = fadd double %20, %1
%22 = sitofp i32 %2 to double
%23 = fadd double %21, %22
%24 = fadd double %23, %3
%25 = sitofp i32 %4 to double
%26 = fadd double %24, %25
%27 = fadd double %26, %5
%28 = sitofp i32 %6 to double
%29 = fadd double %27, %28
%30 = fadd double %29, %7
%31 = sitofp i32 %8 to double
%32 = fadd double %30, %31
%33 = fadd double %32, %9
%34 = sitofp i32 %10 to double
%35 = fadd double %33, %34
%36 = fadd double %35, %11
%37 = sitofp i32 %12 to double
%38 = fadd double %36, %37
%39 = fadd double %38, %13
%40 = sitofp i32 %14 to double
%41 = fadd double %39, %40
%42 = fadd double %41, %15
%43 = sitofp i32 %16 to double
%44 = fadd double %42, %43
%45 = fadd double %44, %17
%46 = sitofp i32 %18 to double
%47 = fadd double %45, %46
ret double %47
}