double sum_doubles(double a, double b, double c, double d, double e, double f,
                   double g, double h, double i, double j, double k, double l,
                   double m, double n, double o, double p, double q, double r,
                   double 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_doubles>:
push   %rbp
mov    %rsp,%rbp
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,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  %xmm6,-0x38(%rbp)
movsd  %xmm7,-0x40(%rbp)
movsd  -0x8(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
addsd  0x10(%rbp),%xmm0
addsd  0x18(%rbp),%xmm0
addsd  0x20(%rbp),%xmm0
addsd  0x28(%rbp),%xmm0
addsd  0x30(%rbp),%xmm0
addsd  0x38(%rbp),%xmm0
addsd  0x40(%rbp),%xmm0
addsd  0x48(%rbp),%xmm0
addsd  0x50(%rbp),%xmm0
addsd  0x58(%rbp),%xmm0
addsd  0x60(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sum_doubles>:
addsd  %xmm1,%xmm0
addsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
addsd  %xmm4,%xmm0
addsd  %xmm5,%xmm0
addsd  %xmm6,%xmm0
addsd  %xmm7,%xmm0
addsd  0x8(%rsp),%xmm0
addsd  0x10(%rsp),%xmm0
addsd  0x18(%rsp),%xmm0
addsd  0x20(%rsp),%xmm0
addsd  0x28(%rsp),%xmm0
addsd  0x30(%rsp),%xmm0
addsd  0x38(%rsp),%xmm0
addsd  0x40(%rsp),%xmm0
addsd  0x48(%rsp),%xmm0
addsd  0x50(%rsp),%xmm0
addsd  0x58(%rsp),%xmm0
ret

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

LLVM IR (-O2):
define double @sum_doubles(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) {
%20 = fadd double %0, %1
%21 = fadd double %20, %2
%22 = fadd double %21, %3
%23 = fadd double %22, %4
%24 = fadd double %23, %5
%25 = fadd double %24, %6
%26 = fadd double %25, %7
%27 = fadd double %26, %8
%28 = fadd double %27, %9
%29 = fadd double %28, %10
%30 = fadd double %29, %11
%31 = fadd double %30, %12
%32 = fadd double %31, %13
%33 = fadd double %32, %14
%34 = fadd double %33, %15
%35 = fadd double %34, %16
%36 = fadd double %35, %17
%37 = fadd double %36, %18
ret double %37
}