xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/push-cfi.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s -check-prefix=LINUX -check-prefix=CHECK
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-apple-darwin | FileCheck %s -check-prefix=DARWIN -check-prefix=CHECK
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...)
5*9880d681SAndroid Build Coastguard Workerdeclare void @good(i32 %a, i32 %b, i32 %c, i32 %d)
6*9880d681SAndroid Build Coastguard Workerdeclare void @large(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f)
7*9880d681SAndroid Build Coastguard Workerdeclare void @empty()
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; When we use an invoke, we expect a .cfi_escape GNU_ARGS_SIZE
10*9880d681SAndroid Build Coastguard Worker; with size 16 before the invocation. Without FP, we also expect
11*9880d681SAndroid Build Coastguard Worker; .cfi_adjust_cfa_offset after each push.
12*9880d681SAndroid Build Coastguard Worker; Darwin should not generate pushes in either circumstance.
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_nofp:
14*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x10
15*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $4
16*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
17*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
18*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $3
19*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
20*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
21*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $2
22*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
23*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
24*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $1
25*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
26*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
27*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: call
28*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: addl $16, %esp
29*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_adjust_cfa_offset -16
30*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: .cfi_escape
31*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: pushl
32*9880d681SAndroid Build Coastguard Workerdefine void @test1_nofp() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
33*9880d681SAndroid Build Coastguard Workerentry:
34*9880d681SAndroid Build Coastguard Worker  invoke void @good(i32 1, i32 2, i32 3, i32 4)
35*9880d681SAndroid Build Coastguard Worker          to label %continue unwind label %cleanup
36*9880d681SAndroid Build Coastguard Workercontinue:
37*9880d681SAndroid Build Coastguard Worker  ret void
38*9880d681SAndroid Build Coastguard Workercleanup:
39*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
40*9880d681SAndroid Build Coastguard Worker     cleanup
41*9880d681SAndroid Build Coastguard Worker  ret void
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_fp:
45*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x10
46*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $4
47*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $3
48*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $2
49*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $1
50*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: call
51*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: addl $16, %esp
52*9880d681SAndroid Build Coastguard Worker; DARWIN: pushl %ebp
53*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: .cfi_escape
54*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: pushl
55*9880d681SAndroid Build Coastguard Workerdefine void @test1_fp() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
56*9880d681SAndroid Build Coastguard Workerentry:
57*9880d681SAndroid Build Coastguard Worker  invoke void @good(i32 1, i32 2, i32 3, i32 4)
58*9880d681SAndroid Build Coastguard Worker          to label %continue unwind label %cleanup
59*9880d681SAndroid Build Coastguard Workercontinue:
60*9880d681SAndroid Build Coastguard Worker  ret void
61*9880d681SAndroid Build Coastguard Workercleanup:
62*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
63*9880d681SAndroid Build Coastguard Worker     cleanup
64*9880d681SAndroid Build Coastguard Worker  ret void
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker; If the function has no handlers, we don't need to generate GNU_ARGS_SIZE,
68*9880d681SAndroid Build Coastguard Worker; even if it has an unwind table. Without FP, we still need cfi_adjust_cfa_offset,
69*9880d681SAndroid Build Coastguard Worker; so darwin should not generate pushes.
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_nofp:
71*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: .cfi_escape
72*9880d681SAndroid Build Coastguard Worker; LINUX: pushl   $4
73*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
74*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
75*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $3
76*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
77*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
78*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $2
79*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
80*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
81*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $1
82*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
83*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
84*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: call
85*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: addl $28, %esp
86*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_adjust_cfa_offset -16
87*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: .cfi_escape
88*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: pushl
89*9880d681SAndroid Build Coastguard Workerdefine void @test2_nofp() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker  call void @good(i32 1, i32 2, i32 3, i32 4)
92*9880d681SAndroid Build Coastguard Worker  ret void
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_fp:
96*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .cfi_escape
97*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .cfi_adjust_cfa_offset
98*9880d681SAndroid Build Coastguard Worker; CHECK: pushl   $4
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl   $3
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl   $2
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl   $1
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addl $24, %esp
104*9880d681SAndroid Build Coastguard Workerdefine void @test2_fp() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
105*9880d681SAndroid Build Coastguard Workerentry:
106*9880d681SAndroid Build Coastguard Worker  call void @good(i32 1, i32 2, i32 3, i32 4)
107*9880d681SAndroid Build Coastguard Worker  ret void
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; If we did not end up using any pushes, no need for GNU_ARGS_SIZE or
111*9880d681SAndroid Build Coastguard Worker; cfi_adjust_cfa_offset.
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_nofp:
113*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: .cfi_escape
114*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: .cfi_adjust_cfa_offset
115*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: pushl
116*9880d681SAndroid Build Coastguard Worker; LINUX: retl
117*9880d681SAndroid Build Coastguard Workerdefine void @test3_nofp() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
118*9880d681SAndroid Build Coastguard Workerentry:
119*9880d681SAndroid Build Coastguard Worker  invoke void @empty()
120*9880d681SAndroid Build Coastguard Worker          to label %continue unwind label %cleanup
121*9880d681SAndroid Build Coastguard Workercontinue:
122*9880d681SAndroid Build Coastguard Worker  ret void
123*9880d681SAndroid Build Coastguard Workercleanup:
124*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
125*9880d681SAndroid Build Coastguard Worker     cleanup
126*9880d681SAndroid Build Coastguard Worker  ret void
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; If we did not end up using any pushes, no need for GNU_ARGS_SIZE or
130*9880d681SAndroid Build Coastguard Worker; cfi_adjust_cfa_offset.
131*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_fp:
132*9880d681SAndroid Build Coastguard Worker; LINUX: pushl %ebp
133*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: .cfi_escape
134*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: .cfi_adjust_cfa_offset
135*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: pushl
136*9880d681SAndroid Build Coastguard Worker; LINUX: retl
137*9880d681SAndroid Build Coastguard Workerdefine void @test3_fp() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
138*9880d681SAndroid Build Coastguard Workerentry:
139*9880d681SAndroid Build Coastguard Worker  invoke void @empty()
140*9880d681SAndroid Build Coastguard Worker          to label %continue unwind label %cleanup
141*9880d681SAndroid Build Coastguard Workercontinue:
142*9880d681SAndroid Build Coastguard Worker  ret void
143*9880d681SAndroid Build Coastguard Workercleanup:
144*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
145*9880d681SAndroid Build Coastguard Worker     cleanup
146*9880d681SAndroid Build Coastguard Worker  ret void
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker; Different sized stacks need different GNU_ARGS_SIZEs
150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4:
151*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x10
152*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $4
153*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $3
154*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $2
155*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $1
156*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: call
157*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: addl $16, %esp
158*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x20
159*9880d681SAndroid Build Coastguard Worker; LINUX: subl    $8, %esp
160*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $11
161*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $10
162*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $9
163*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $8
164*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $7
165*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $6
166*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: calll   large
167*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: addl $32, %esp
168*9880d681SAndroid Build Coastguard Workerdefine void @test4() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
169*9880d681SAndroid Build Coastguard Workerentry:
170*9880d681SAndroid Build Coastguard Worker  invoke void @good(i32 1, i32 2, i32 3, i32 4)
171*9880d681SAndroid Build Coastguard Worker          to label %continue1 unwind label %cleanup
172*9880d681SAndroid Build Coastguard Workercontinue1:
173*9880d681SAndroid Build Coastguard Worker  invoke void @large(i32 6, i32 7, i32 8, i32 9, i32 10, i32 11)
174*9880d681SAndroid Build Coastguard Worker          to label %continue2 unwind label %cleanup
175*9880d681SAndroid Build Coastguard Workercontinue2:
176*9880d681SAndroid Build Coastguard Worker  ret void
177*9880d681SAndroid Build Coastguard Workercleanup:
178*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
179*9880d681SAndroid Build Coastguard Worker     cleanup
180*9880d681SAndroid Build Coastguard Worker  ret void
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker; If we did use pushes, we need to reset GNU_ARGS_SIZE before a call
184*9880d681SAndroid Build Coastguard Worker; without parameters, but don't need to adjust the cfa offset
185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5_nofp:
186*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x10
187*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $4
188*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
189*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
190*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $3
191*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
192*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
193*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $2
194*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
195*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
196*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $1
197*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: Ltmp{{[0-9]+}}:
198*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .cfi_adjust_cfa_offset 4
199*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: call
200*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: addl $16, %esp
201*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_adjust_cfa_offset -16
202*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: .cfi_adjust_cfa_offset
203*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x00
204*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: .cfi_adjust_cfa_offset
205*9880d681SAndroid Build Coastguard Worker; LINUX: call
206*9880d681SAndroid Build Coastguard Workerdefine void @test5_nofp() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
207*9880d681SAndroid Build Coastguard Workerentry:
208*9880d681SAndroid Build Coastguard Worker  invoke void @good(i32 1, i32 2, i32 3, i32 4)
209*9880d681SAndroid Build Coastguard Worker          to label %continue1 unwind label %cleanup
210*9880d681SAndroid Build Coastguard Workercontinue1:
211*9880d681SAndroid Build Coastguard Worker  invoke void @empty()
212*9880d681SAndroid Build Coastguard Worker          to label %continue2 unwind label %cleanup
213*9880d681SAndroid Build Coastguard Workercontinue2:
214*9880d681SAndroid Build Coastguard Worker  ret void
215*9880d681SAndroid Build Coastguard Workercleanup:
216*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
217*9880d681SAndroid Build Coastguard Worker     cleanup
218*9880d681SAndroid Build Coastguard Worker  ret void
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5_fp:
222*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x10
223*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $4
224*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $3
225*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $2
226*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: pushl   $1
227*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: call
228*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: addl $16, %esp
229*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x00
230*9880d681SAndroid Build Coastguard Worker; LINUX-NOT: .cfi_adjust_cfa_offset
231*9880d681SAndroid Build Coastguard Worker; LINUX: call
232*9880d681SAndroid Build Coastguard Workerdefine void @test5_fp() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
233*9880d681SAndroid Build Coastguard Workerentry:
234*9880d681SAndroid Build Coastguard Worker  invoke void @good(i32 1, i32 2, i32 3, i32 4)
235*9880d681SAndroid Build Coastguard Worker          to label %continue1 unwind label %cleanup
236*9880d681SAndroid Build Coastguard Workercontinue1:
237*9880d681SAndroid Build Coastguard Worker  invoke void @empty()
238*9880d681SAndroid Build Coastguard Worker          to label %continue2 unwind label %cleanup
239*9880d681SAndroid Build Coastguard Workercontinue2:
240*9880d681SAndroid Build Coastguard Worker  ret void
241*9880d681SAndroid Build Coastguard Workercleanup:
242*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
243*9880d681SAndroid Build Coastguard Worker     cleanup
244*9880d681SAndroid Build Coastguard Worker  ret void
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker; FIXME: This is actually inefficient - we don't need to repeat the .cfi_escape twice.
248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6:
249*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x10
250*9880d681SAndroid Build Coastguard Worker; LINUX: call
251*9880d681SAndroid Build Coastguard Worker; LINUX: .cfi_escape 0x2e, 0x10
252*9880d681SAndroid Build Coastguard Worker; LINUX: call
253*9880d681SAndroid Build Coastguard Workerdefine void @test6() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
254*9880d681SAndroid Build Coastguard Workerentry:
255*9880d681SAndroid Build Coastguard Worker  invoke void @good(i32 1, i32 2, i32 3, i32 4)
256*9880d681SAndroid Build Coastguard Worker          to label %continue1 unwind label %cleanup
257*9880d681SAndroid Build Coastguard Workercontinue1:
258*9880d681SAndroid Build Coastguard Worker  invoke void @good(i32 5, i32 6, i32 7, i32 8)
259*9880d681SAndroid Build Coastguard Worker          to label %continue2 unwind label %cleanup
260*9880d681SAndroid Build Coastguard Workercontinue2:
261*9880d681SAndroid Build Coastguard Worker  ret void
262*9880d681SAndroid Build Coastguard Workercleanup:
263*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
264*9880d681SAndroid Build Coastguard Worker     cleanup
265*9880d681SAndroid Build Coastguard Worker  ret void
266*9880d681SAndroid Build Coastguard Worker}
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker; Darwin should generate pushes in the presense of FP and an unwind table,
269*9880d681SAndroid Build Coastguard Worker; but not FP and invoke.
270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7:
271*9880d681SAndroid Build Coastguard Worker; DARWIN: pushl %ebp
272*9880d681SAndroid Build Coastguard Worker; DARWIN: movl %esp, %ebp
273*9880d681SAndroid Build Coastguard Worker; DARWIN: .cfi_def_cfa_register %ebp
274*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: .cfi_adjust_cfa_offset
275*9880d681SAndroid Build Coastguard Worker; DARWIN: pushl   $4
276*9880d681SAndroid Build Coastguard Worker; DARWIN-NEXT: pushl   $3
277*9880d681SAndroid Build Coastguard Worker; DARWIN-NEXT: pushl   $2
278*9880d681SAndroid Build Coastguard Worker; DARWIN-NEXT: pushl   $1
279*9880d681SAndroid Build Coastguard Worker; DARWIN-NEXT: call
280*9880d681SAndroid Build Coastguard Workerdefine void @test7() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
281*9880d681SAndroid Build Coastguard Workerentry:
282*9880d681SAndroid Build Coastguard Worker  call void @good(i32 1, i32 2, i32 3, i32 4)
283*9880d681SAndroid Build Coastguard Worker  ret void
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8:
287*9880d681SAndroid Build Coastguard Worker; DARWIN: pushl %ebp
288*9880d681SAndroid Build Coastguard Worker; DARWIN: movl %esp, %ebp
289*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: .cfi_adjust_cfa_offset
290*9880d681SAndroid Build Coastguard Worker; DARWIN-NOT: pushl
291*9880d681SAndroid Build Coastguard Workerdefine void @test8() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
292*9880d681SAndroid Build Coastguard Workerentry:
293*9880d681SAndroid Build Coastguard Worker  invoke void @good(i32 1, i32 2, i32 3, i32 4)
294*9880d681SAndroid Build Coastguard Worker          to label %continue unwind label %cleanup
295*9880d681SAndroid Build Coastguard Workercontinue:
296*9880d681SAndroid Build Coastguard Worker  ret void
297*9880d681SAndroid Build Coastguard Workercleanup:
298*9880d681SAndroid Build Coastguard Worker  landingpad { i8*, i32 }
299*9880d681SAndroid Build Coastguard Worker     cleanup
300*9880d681SAndroid Build Coastguard Worker  ret void
301*9880d681SAndroid Build Coastguard Worker}
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerattributes #0 = { optsize }
304*9880d681SAndroid Build Coastguard Workerattributes #1 = { optsize "no-frame-pointer-elim"="true" }
305