unsigned int numerous_arguments(unsigned int a, unsigned int b, unsigned int c,
                                unsigned int d, unsigned int e, unsigned int f,
                                unsigned int g, unsigned int h, unsigned int i,
                                unsigned int j, unsigned int k, unsigned int l,
                                unsigned int m, unsigned int n,
                                unsigned int o) {
  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o;
}


x86 assembly (clang, -O0):
<numerous_arguments>:
push   %rbp
mov    %rsp,%rbp
mov    0x50(%rbp),%eax
mov    0x48(%rbp),%eax
mov    0x40(%rbp),%eax
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
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)
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
add    0x28(%rbp),%eax
add    0x30(%rbp),%eax
add    0x38(%rbp),%eax
add    0x40(%rbp),%eax
add    0x48(%rbp),%eax
add    0x50(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<numerous_arguments>:
lea    (%rdi,%rsi,1),%eax
add    %edx,%eax
add    %ecx,%eax
add    %r8d,%eax
add    %r9d,%eax
add    0x8(%rsp),%eax
add    0x10(%rsp),%eax
add    0x18(%rsp),%eax
add    0x20(%rsp),%eax
add    0x28(%rsp),%eax
add    0x30(%rsp),%eax
add    0x38(%rsp),%eax
add    0x40(%rsp),%eax
add    0x48(%rsp),%eax
ret

LLVM IR (-O0):
define i32 @numerous_arguments(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12, i32 %13, i32 %14) {
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%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 i32
%30 = alloca i32
store i32 %0, i32* %16
store i32 %1, i32* %17
store i32 %2, i32* %18
store i32 %3, i32* %19
store i32 %4, i32* %20
store i32 %5, i32* %21
store i32 %6, i32* %22
store i32 %7, i32* %23
store i32 %8, i32* %24
store i32 %9, i32* %25
store i32 %10, i32* %26
store i32 %11, i32* %27
store i32 %12, i32* %28
store i32 %13, i32* %29
store i32 %14, i32* %30
%31 = load i32, i32* %16
%32 = load i32, i32* %17
%33 = add i32 %31, %32
%34 = load i32, i32* %18
%35 = add i32 %33, %34
%36 = load i32, i32* %19
%37 = add i32 %35, %36
%38 = load i32, i32* %20
%39 = add i32 %37, %38
%40 = load i32, i32* %21
%41 = add i32 %39, %40
%42 = load i32, i32* %22
%43 = add i32 %41, %42
%44 = load i32, i32* %23
%45 = add i32 %43, %44
%46 = load i32, i32* %24
%47 = add i32 %45, %46
%48 = load i32, i32* %25
%49 = add i32 %47, %48
%50 = load i32, i32* %26
%51 = add i32 %49, %50
%52 = load i32, i32* %27
%53 = add i32 %51, %52
%54 = load i32, i32* %28
%55 = add i32 %53, %54
%56 = load i32, i32* %29
%57 = add i32 %55, %56
%58 = load i32, i32* %30
%59 = add i32 %57, %58
ret i32 %59
}

LLVM IR (-O2):
define i32 @numerous_arguments(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12, i32 %13, i32 %14) {
%16 = add i32 %1, %0
%17 = add i32 %16, %2
%18 = add i32 %17, %3
%19 = add i32 %18, %4
%20 = add i32 %19, %5
%21 = add i32 %20, %6
%22 = add i32 %21, %7
%23 = add i32 %22, %8
%24 = add i32 %23, %9
%25 = add i32 %24, %10
%26 = add i32 %25, %11
%27 = add i32 %26, %12
%28 = add i32 %27, %13
%29 = add i32 %28, %14
ret i32 %29
}