| ; RUN: llc < %s -mtriple=i686-windows -stackrealign | FileCheck %s | |
| declare void @good(i32 %a, i32 %b, i32 %c, i32 %d) | |
| declare void @oneparam(i32 %a) | |
| declare void @eightparams(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h) | |
| ; When there is no reserved call frame, check that additional alignment | |
| ; is added when the pushes don't add up to the required alignment. | |
| ; CHECK-LABEL: test5: | |
| ; CHECK: subl $16, %esp | |
| ; CHECK-NEXT: pushl $4 | |
| ; CHECK-NEXT: pushl $3 | |
| ; CHECK-NEXT: pushl $2 | |
| ; CHECK-NEXT: pushl $1 | |
| ; CHECK-NEXT: call | |
| define void @test5(i32 %k) { | |
| entry: | |
| %a = alloca i32, i32 %k | |
| call void @good(i32 1, i32 2, i32 3, i32 4) | |
| ret void | |
| } | |
| ; When the alignment adds up, do the transformation | |
| ; CHECK-LABEL: test5b: | |
| ; CHECK: pushl $8 | |
| ; CHECK-NEXT: pushl $7 | |
| ; CHECK-NEXT: pushl $6 | |
| ; CHECK-NEXT: pushl $5 | |
| ; CHECK-NEXT: pushl $4 | |
| ; CHECK-NEXT: pushl $3 | |
| ; CHECK-NEXT: pushl $2 | |
| ; CHECK-NEXT: pushl $1 | |
| ; CHECK-NEXT: call | |
| define void @test5b() optsize { | |
| entry: | |
| call void @eightparams(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8) | |
| ret void | |
| } | |
| ; When having to compensate for the alignment isn't worth it, | |
| ; don't use pushes. | |
| ; CHECK-LABEL: test5c: | |
| ; CHECK: movl $1, (%esp) | |
| ; CHECK-NEXT: call | |
| define void @test5c() optsize { | |
| entry: | |
| call void @oneparam(i32 1) | |
| ret void | |
| } | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 2, !"override-stack-alignment", i32 32} |