1 ; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s
3 declare i32 @__gxx_personality_v0(...)
4 declare void @good(i32 %a, i32 %b, i32 %c, i32 %d)
5 declare void @large(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f)
8 ; We use an invoke, and expect a .cfi_escape GNU_ARGS_SIZE with size 16
9 ; before the invocation
11 ; CHECK: .cfi_escape 0x2e, 0x10
12 ; CHECK-NEXT: pushl $4
13 ; CHECK-NEXT: pushl $3
14 ; CHECK-NEXT: pushl $2
15 ; CHECK-NEXT: pushl $1
17 ; CHECK-NEXT: addl $16, %esp
18 define void @test1() optsize personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
20 invoke void @good(i32 1, i32 2, i32 3, i32 4)
21 to label %continue unwind label %cleanup
25 landingpad { i8*, i32 }
30 ; If the function has no handlers, we don't need to generate GNU_ARGS_SIZE,
31 ; even if it has an unwind table.
33 ; CHECK-NOT: .cfi_escape
35 ; CHECK-NEXT: pushl $3
36 ; CHECK-NEXT: pushl $2
37 ; CHECK-NEXT: pushl $1
39 ; CHECK-NEXT: addl $16, %esp
40 define void @test2() optsize personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
42 call void @good(i32 1, i32 2, i32 3, i32 4)
46 ; If we did not end up using any pushes, no need for GNU_ARGS_SIZE anywhere
48 ; CHECK-NOT: .cfi_escape
51 define void @test3() optsize personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
54 to label %continue unwind label %cleanup
58 landingpad { i8*, i32 }
63 ; Different sized stacks need different GNU_ARGS_SIZEs
65 ; CHECK: .cfi_escape 0x2e, 0x10
66 ; CHECK-NEXT: pushl $4
67 ; CHECK-NEXT: pushl $3
68 ; CHECK-NEXT: pushl $2
69 ; CHECK-NEXT: pushl $1
71 ; CHECK-NEXT: addl $16, %esp
72 ; CHECK: .cfi_escape 0x2e, 0x20
73 ; CHECK-NEXT: subl $8, %esp
74 ; CHECK-NEXT: pushl $11
75 ; CHECK-NEXT: pushl $10
76 ; CHECK-NEXT: pushl $9
77 ; CHECK-NEXT: pushl $8
78 ; CHECK-NEXT: pushl $7
79 ; CHECK-NEXT: pushl $6
80 ; CHECK-NEXT: calll large
81 ; CHECK-NEXT: addl $32, %esp
82 define void @test4() optsize personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
84 invoke void @good(i32 1, i32 2, i32 3, i32 4)
85 to label %continue1 unwind label %cleanup
87 invoke void @large(i32 6, i32 7, i32 8, i32 9, i32 10, i32 11)
88 to label %continue2 unwind label %cleanup
92 landingpad { i8*, i32 }
97 ; If we did use pushes, we need to reset GNU_ARGS_SIZE before a call
100 ; CHECK: .cfi_escape 0x2e, 0x10
101 ; CHECK-NEXT: pushl $4
102 ; CHECK-NEXT: pushl $3
103 ; CHECK-NEXT: pushl $2
104 ; CHECK-NEXT: pushl $1
106 ; CHECK-NEXT: addl $16, %esp
107 ; CHECK: .cfi_escape 0x2e, 0x00
109 define void @test5() optsize personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
111 invoke void @good(i32 1, i32 2, i32 3, i32 4)
112 to label %continue1 unwind label %cleanup
115 to label %continue2 unwind label %cleanup
119 landingpad { i8*, i32 }
124 ; This is actually inefficient - we don't need to repeat the .cfi_escape twice.
125 ; CHECK-LABEL: test6:
126 ; CHECK: .cfi_escape 0x2e, 0x10
128 ; CHECK: .cfi_escape 0x2e, 0x10
130 define void @test6() optsize personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
132 invoke void @good(i32 1, i32 2, i32 3, i32 4)
133 to label %continue1 unwind label %cleanup
135 invoke void @good(i32 5, i32 6, i32 7, i32 8)
136 to label %continue2 unwind label %cleanup
140 landingpad { i8*, i32 }