x(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, x, y) {
  foo(__builtin_alloca(8));
  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r +
         s + t + u + v + x + y;
}


x86 assembly (clang, -O0):
<x>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
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,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9d,-0x18(%rbp)
lea    -0x20(%rbp),%rdi
mov    $0x0,%al
call   1030 <foo@plt>
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
add    0x58(%rbp),%eax
add    0x60(%rbp),%eax
add    0x68(%rbp),%eax
add    0x70(%rbp),%eax
add    0x78(%rbp),%eax
add    0x80(%rbp),%eax
add    0x88(%rbp),%eax
add    0x90(%rbp),%eax
add    0x98(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<x>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %r9d,%r14d
mov    %r8d,%r15d
mov    %ecx,%r12d
mov    %edx,%r13d
mov    %esi,%ebp
mov    %edi,%ebx
mov    %rsp,%rdi
xor    %eax,%eax
call   1030 <foo@plt>
add    %ebp,%ebx
add    %r13d,%ebx
add    %r12d,%ebx
add    %r15d,%ebx
add    %r14d,%ebx
add    0x40(%rsp),%ebx
add    0x48(%rsp),%ebx
add    0x50(%rsp),%ebx
add    0x58(%rsp),%ebx
add    0x60(%rsp),%ebx
add    0x68(%rsp),%ebx
add    0x70(%rsp),%ebx
add    0x78(%rsp),%ebx
add    0x80(%rsp),%ebx
add    0x88(%rsp),%ebx
add    0x90(%rsp),%ebx
add    0x98(%rsp),%ebx
add    0xa0(%rsp),%ebx
add    0xa8(%rsp),%ebx
add    0xb0(%rsp),%ebx
add    0xb8(%rsp),%ebx
add    0xc0(%rsp),%ebx
add    0xc8(%rsp),%ebx
mov    %ebx,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @x(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) {
%25 = alloca [8 x i8]
%26 = getelementptr inbounds [8 x i8], [8 x i8]* %25, i64 0, i64 0
%27 = call i32 (i8*, ...) bitcast (i32 (...)* @foo to i32 (i8*, ...)*)(i8* %26)
%28 = add nsw i32 %1, %0
%29 = add nsw i32 %28, %2
%30 = add nsw i32 %29, %3
%31 = add nsw i32 %30, %4
%32 = add nsw i32 %31, %5
%33 = add nsw i32 %32, %6
%34 = add nsw i32 %33, %7
%35 = add nsw i32 %34, %8
%36 = add nsw i32 %35, %9
%37 = add nsw i32 %36, %10
%38 = add nsw i32 %37, %11
%39 = add nsw i32 %38, %12
%40 = add nsw i32 %39, %13
%41 = add nsw i32 %40, %14
%42 = add nsw i32 %41, %15
%43 = add nsw i32 %42, %16
%44 = add nsw i32 %43, %17
%45 = add nsw i32 %44, %18
%46 = add nsw i32 %45, %19
%47 = add nsw i32 %46, %20
%48 = add nsw i32 %47, %21
%49 = add nsw i32 %48, %22
%50 = add nsw i32 %49, %23
ret i32 %50
}