double sum_segregated_doubles(int a, int b, int c, int d, int e, int f, int g,
                              int h, int i, double j, double k, double l,
                              double m, double n, double o, double p, double 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_segregated_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)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9d,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
movsd  %xmm1,-0x28(%rbp)
movsd  %xmm2,-0x30(%rbp)
movsd  %xmm3,-0x38(%rbp)
movsd  %xmm4,-0x40(%rbp)
movsd  %xmm5,-0x48(%rbp)
movsd  %xmm6,-0x50(%rbp)
movsd  %xmm7,-0x58(%rbp)
mov    -0x4(%rbp),%eax
add    -0x8(%rbp),%eax
add    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
add    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
add    0x10(%rbp),%eax
add    0x18(%rbp),%eax
add    0x20(%rbp),%eax
cvtsi2sd %eax,%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  0x28(%rbp),%xmm0
cvtsi2sdl 0x30(%rbp),%xmm1
addsd  %xmm1,%xmm0
pop    %rbp
ret

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

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

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