float sum_segregated(int a, int b, int c, int d, int e, int f, int g, int h,
                     int i, float j, float k, float l, float m, float n,
                     float o, float p, float q, float 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>:
push   %rbp
mov    %rsp,%rbp
mov    0x30(%rbp),%eax
movss  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)
movss  %xmm0,-0x1c(%rbp)
movss  %xmm1,-0x20(%rbp)
movss  %xmm2,-0x24(%rbp)
movss  %xmm3,-0x28(%rbp)
movss  %xmm4,-0x2c(%rbp)
movss  %xmm5,-0x30(%rbp)
movss  %xmm6,-0x34(%rbp)
movss  %xmm7,-0x38(%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
cvtsi2ss %eax,%xmm0
addss  -0x1c(%rbp),%xmm0
addss  -0x20(%rbp),%xmm0
addss  -0x24(%rbp),%xmm0
addss  -0x28(%rbp),%xmm0
addss  -0x2c(%rbp),%xmm0
addss  -0x30(%rbp),%xmm0
addss  -0x34(%rbp),%xmm0
addss  -0x38(%rbp),%xmm0
addss  0x28(%rbp),%xmm0
cvtsi2ssl 0x30(%rbp),%xmm1
addss  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sum_segregated>:
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
cvtsi2ss %edi,%xmm8
addss  %xmm8,%xmm0
addss  %xmm1,%xmm0
addss  %xmm2,%xmm0
addss  %xmm3,%xmm0
addss  %xmm4,%xmm0
addss  %xmm5,%xmm0
addss  %xmm6,%xmm0
addss  %xmm7,%xmm0
addss  0x20(%rsp),%xmm0
xorps  %xmm1,%xmm1
cvtsi2ssl 0x28(%rsp),%xmm1
addss  %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @sum_segregated(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, float %9, float %10, float %11, float %12, float %13, float %14, float %15, float %16, float %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 float
%30 = alloca float
%31 = alloca float
%32 = alloca float
%33 = alloca float
%34 = alloca float
%35 = alloca float
%36 = alloca float
%37 = alloca float
%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 float %9, float* %29
store float %10, float* %30
store float %11, float* %31
store float %12, float* %32
store float %13, float* %33
store float %14, float* %34
store float %15, float* %35
store float %16, float* %36
store float %17, float* %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 float
%57 = load float, float* %29
%58 = fadd float %56, %57
%59 = load float, float* %30
%60 = fadd float %58, %59
%61 = load float, float* %31
%62 = fadd float %60, %61
%63 = load float, float* %32
%64 = fadd float %62, %63
%65 = load float, float* %33
%66 = fadd float %64, %65
%67 = load float, float* %34
%68 = fadd float %66, %67
%69 = load float, float* %35
%70 = fadd float %68, %69
%71 = load float, float* %36
%72 = fadd float %70, %71
%73 = load float, float* %37
%74 = fadd float %72, %73
%75 = load i32, i32* %38
%76 = sitofp i32 %75 to float
%77 = fadd float %74, %76
ret float %77
}

LLVM IR (-O2):
define float @sum_segregated(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, float %9, float %10, float %11, float %12, float %13, float %14, float %15, float %16, float %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 float
%29 = fadd float %28, %9
%30 = fadd float %29, %10
%31 = fadd float %30, %11
%32 = fadd float %31, %12
%33 = fadd float %32, %13
%34 = fadd float %33, %14
%35 = fadd float %34, %15
%36 = fadd float %35, %16
%37 = fadd float %36, %17
%38 = sitofp i32 %18 to float
%39 = fadd float %37, %38
ret float %39
}