many_args(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w,
          x, y, z) {
  echo(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x,
       y, z);
}


x86 assembly (clang, -O0):
<many_args>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xf8,%rsp
mov    0xa8(%rbp),%eax
mov    0xa0(%rbp),%eax
mov    0x98(%rbp),%eax
mov    0x90(%rbp),%eax
mov    0x88(%rbp),%eax
mov    0x80(%rbp),%eax
mov    0x78(%rbp),%eax
mov    0x70(%rbp),%eax
mov    0x68(%rbp),%eax
mov    0x60(%rbp),%eax
mov    0x58(%rbp),%eax
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,-0x30(%rbp)
mov    %esi,-0x34(%rbp)
mov    %edx,-0x38(%rbp)
mov    %ecx,-0x3c(%rbp)
mov    %r8d,-0x40(%rbp)
mov    %r9d,-0x44(%rbp)
mov    -0x30(%rbp),%edi
mov    -0x34(%rbp),%esi
mov    -0x38(%rbp),%edx
mov    -0x3c(%rbp),%ecx
mov    -0x40(%rbp),%r8d
mov    -0x44(%rbp),%r9d
mov    0x10(%rbp),%eax
mov    %eax,-0x78(%rbp)
mov    0x18(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    0x20(%rbp),%eax
mov    %eax,-0x70(%rbp)
mov    0x28(%rbp),%eax
mov    %eax,-0x6c(%rbp)
mov    0x30(%rbp),%eax
mov    %eax,-0x68(%rbp)
mov    0x38(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    0x40(%rbp),%eax
mov    %eax,-0x60(%rbp)
mov    0x48(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    0x50(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    0x58(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    0x60(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    0x68(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    0x70(%rbp),%r13d
mov    0x78(%rbp),%r12d
mov    0x80(%rbp),%r15d
mov    0x88(%rbp),%r14d
mov    0x90(%rbp),%ebx
mov    0x98(%rbp),%r11d
mov    0xa0(%rbp),%r10d
mov    0xa8(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x78(%rbp),%eax
mov    %eax,(%rsp)
mov    -0x74(%rbp),%eax
mov    %eax,0x8(%rsp)
mov    -0x70(%rbp),%eax
mov    %eax,0x10(%rsp)
mov    -0x6c(%rbp),%eax
mov    %eax,0x18(%rsp)
mov    -0x68(%rbp),%eax
mov    %eax,0x20(%rsp)
mov    -0x64(%rbp),%eax
mov    %eax,0x28(%rsp)
mov    -0x60(%rbp),%eax
mov    %eax,0x30(%rsp)
mov    -0x5c(%rbp),%eax
mov    %eax,0x38(%rsp)
mov    -0x58(%rbp),%eax
mov    %eax,0x40(%rsp)
mov    -0x54(%rbp),%eax
mov    %eax,0x48(%rsp)
mov    -0x50(%rbp),%eax
mov    %eax,0x50(%rsp)
mov    -0x4c(%rbp),%eax
mov    %eax,0x58(%rsp)
mov    -0x48(%rbp),%eax
mov    %r13d,0x60(%rsp)
mov    %r12d,0x68(%rsp)
mov    %r15d,0x70(%rsp)
mov    %r14d,0x78(%rsp)
mov    %ebx,0x80(%rsp)
mov    %r11d,0x88(%rsp)
mov    %r10d,0x90(%rsp)
mov    %eax,0x98(%rsp)
mov    $0x0,%al
call   1030 <echo@plt>
mov    -0x2c(%rbp),%eax
add    $0xf8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

x86 assembly (clang, -O2):
<many_args>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    0xa0(%rsp),%r12d
mov    0xa8(%rsp),%r13d
mov    0xb0(%rsp),%ebx
mov    0xb8(%rsp),%ebp
mov    0xc0(%rsp),%r10d
mov    0xc8(%rsp),%r11d
mov    0xd0(%rsp),%r14d
mov    0xd8(%rsp),%r15d
xor    %eax,%eax
push   %r15
push   %r14
push   %r11
push   %r10
push   %rbp
push   %rbx
push   %r13
push   %r12
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
mov    0xd8(%rsp),%ebp
push   %rbp
call   1030 <echo@plt>
add    $0xa8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @many_args(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, i32 %15, i32 %16, i32 %17, i32 %18, i32 %19, i32 %20, i32 %21, i32 %22, i32 %23, i32 %24, i32 %25) {
%27 = tail call i32 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ...) bitcast (i32 (...)* @echo to i32 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ...)*)(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, i32 %15, i32 %16, i32 %17, i32 %18, i32 %19, i32 %20, i32 %21, i32 %22, i32 %23, i32 %24, i32 %25)
ret i32 undef
}