xref: /llvm-project/llvm/test/CodeGen/ARM/ehabi.ll (revision 4a2bd78f5b0d0661c23dff9c4b93a393a49dbf9a)
1; ARM EHABI integrated test
2
3; This test case checks whether the ARM unwind directives are properly
4; generated or not.
5
6; The purpose of the test:
7; (1) .fnstart and .fnend directives should wrap the function.
8; (2) .setfp directive should be available if frame pointer is not eliminated.
9; (3) .save directive should come with push instruction.
10; (4) .vsave directive should come with vpush instruction.
11; (5) .pad directive should come with stack pointer adjustment.
12; (6) .cantunwind directive should be available if the function is marked with
13;     nounwind function attribute.
14
15; We have to check several cases:
16; (1) arm with -frame-pointer=all
17; (2) arm without -frame-pointer=all
18; (3) armv7 with -frame-pointer=all
19; (4) armv7 without -frame-pointer=all
20
21; RUN: llc -mtriple arm-unknown-linux-gnueabi \
22; RUN:     -frame-pointer=all -filetype=asm -o - %s \
23; RUN:   | FileCheck %s --check-prefix=CHECK-FP
24
25; RUN: llc -mtriple arm-unknown-linux-gnueabi \
26; RUN:     -filetype=asm -o - %s \
27; RUN:   | FileCheck %s --check-prefix=CHECK-FP-ELIM
28
29; RUN: llc -mtriple armv7-unknown-linux-gnueabi \
30; RUN:     -frame-pointer=all -filetype=asm -o - %s \
31; RUN:   | FileCheck %s --check-prefix=CHECK-V7-FP
32
33; RUN: llc -mtriple armv7-unknown-linux-gnueabi \
34; RUN:     -filetype=asm -o - %s \
35; RUN:   | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM
36
37; RUN: llc -mtriple arm-unknown-linux-musleabi \
38; RUN:     -frame-pointer=all -filetype=asm -o - %s \
39; RUN:   | FileCheck %s --check-prefix=CHECK-FP
40
41; RUN: llc -mtriple arm-unknown-linux-musleabi \
42; RUN:     -filetype=asm -o - %s \
43; RUN:   | FileCheck %s --check-prefix=CHECK-FP-ELIM
44
45; RUN: llc -mtriple armv7-unknown-linux-musleabi \
46; RUN:     -frame-pointer=all -filetype=asm -o - %s \
47; RUN:   | FileCheck %s --check-prefix=CHECK-V7-FP
48
49; RUN: llc -mtriple armv7-unknown-linux-musleabi \
50; RUN:     -filetype=asm -o - %s \
51; RUN:   | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM
52
53; RUN: llc -mtriple arm-unknown-linux-androideabi \
54; RUN:     -frame-pointer=all -filetype=asm -o - %s \
55; RUN:   | FileCheck %s --check-prefix=CHECK-FP
56
57; RUN: llc -mtriple arm-unknown-linux-androideabi \
58; RUN:     -filetype=asm -o - %s \
59; RUN:   | FileCheck %s --check-prefix=CHECK-FP-ELIM
60
61; RUN: llc -mtriple armv7-unknown-linux-androideabi \
62; RUN:     -frame-pointer=all -filetype=asm -o - %s \
63; RUN:   | FileCheck %s --check-prefix=CHECK-V7-FP
64
65; RUN: llc -mtriple armv7-unknown-linux-androideabi \
66; RUN:     -filetype=asm -o - %s \
67; RUN:   | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM
68
69; RUN: llc -mtriple arm-unknown-netbsd-eabi \
70; RUN:     -frame-pointer=all -filetype=asm -o - %s \
71; RUN:   | FileCheck %s --check-prefix=DWARF-FP
72
73; RUN: llc -mtriple arm-unknown-netbsd-eabi \
74; RUN:     -filetype=asm -o - %s \
75; RUN:   | FileCheck %s --check-prefix=DWARF-FP-ELIM
76
77; RUN: llc -mtriple armv7-unknown-netbsd-eabi \
78; RUN:     -frame-pointer=all -filetype=asm -o - %s \
79; RUN:   | FileCheck %s --check-prefix=DWARF-V7-FP
80
81; RUN: llc -mtriple armv7-unknown-netbsd-eabi \
82; RUN:     -filetype=asm -o - %s \
83; RUN:   | FileCheck %s --check-prefix=DWARF-V7-FP-ELIM
84
85; RUN: llc -mtriple thumbv7-windows-gnu \
86; RUN:     -filetype=asm -exception-model=dwarf -o - %s \
87; RUN:   | FileCheck %s --check-prefix=DWARF-WIN-FP-ELIM
88
89; RUN: llc -mtriple thumbv7-windows-gnu \
90; RUN:     -filetype=asm -o - %s \
91; RUN:   | FileCheck %s --check-prefix=SEH-WIN-FP-ELIM
92
93;-------------------------------------------------------------------------------
94; Test 1
95;-------------------------------------------------------------------------------
96; This is the LLVM assembly generated from following C++ code:
97;
98;   extern void print(int, int, int, int, int);
99;   extern void print(double, double, double, double, double);
100;
101;   void test(int a, int b, int c, int d, int e,
102;             double m, double n, double p, double q, double r) {
103;     try {
104;       print(a, b, c, d, e);
105;     } catch (...) {
106;       print(m, n, p, q, r);
107;     }
108;   }
109
110declare void @_Z5printiiiii(i32, i32, i32, i32, i32)
111
112declare void @_Z5printddddd(double, double, double, double, double)
113
114define void @_Z4testiiiiiddddd(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e,
115                               double %m, double %n, double %p,
116                               double %q, double %r) personality ptr @__gxx_personality_v0 {
117entry:
118  invoke void @_Z5printiiiii(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e)
119          to label %try.cont unwind label %lpad
120
121lpad:
122  %0 = landingpad { ptr, i32 }
123          catch ptr null
124  %1 = extractvalue { ptr, i32 } %0, 0
125  %2 = tail call ptr @__cxa_begin_catch(ptr %1)
126  invoke void @_Z5printddddd(double %m, double %n, double %p,
127                             double %q, double %r)
128          to label %invoke.cont2 unwind label %lpad1
129
130invoke.cont2:
131  tail call void @__cxa_end_catch()
132  br label %try.cont
133
134try.cont:
135  ret void
136
137lpad1:
138  %3 = landingpad { ptr, i32 }
139          cleanup
140  invoke void @__cxa_end_catch()
141          to label %eh.resume unwind label %terminate.lpad
142
143eh.resume:
144  resume { ptr, i32 } %3
145
146terminate.lpad:
147  %4 = landingpad { ptr, i32 }
148          catch ptr null
149  %5 = extractvalue { ptr, i32 } %4, 0
150  tail call void @__clang_call_terminate(ptr %5)
151  unreachable
152}
153
154declare void @__clang_call_terminate(ptr)
155
156declare i32 @__gxx_personality_v0(...)
157
158declare ptr @__cxa_begin_catch(ptr)
159
160declare void @__cxa_end_catch()
161
162declare void @_ZSt9terminatev()
163
164; CHECK-FP-LABEL: _Z4testiiiiiddddd:
165; CHECK-FP:   .fnstart
166; CHECK-FP:   .save  {r4, r5, r6, r7, r8, r9, r10, r11, lr}
167; CHECK-FP:   push   {r4, r5, r6, r7, r8, r9, r10, r11, lr}
168; CHECK-FP:   .setfp r11, sp, #28
169; CHECK-FP:   add    r11, sp, #28
170; CHECK-FP:   .pad   #44
171; CHECK-FP:   sub    sp, sp, #44
172; CHECK-FP:   .personality __gxx_personality_v0
173; CHECK-FP:   .handlerdata
174; CHECK-FP:   .fnend
175
176; CHECK-FP-ELIM-LABEL: _Z4testiiiiiddddd:
177; CHECK-FP-ELIM:   .fnstart
178; CHECK-FP-ELIM:   .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
179; CHECK-FP-ELIM:   push  {r4, r5, r6, r7, r8, r9, r10, r11, lr}
180; CHECK-FP-ELIM:   .pad  #36
181; CHECK-FP-ELIM:   sub   sp, sp, #36
182; CHECK-FP-ELIM:   .personality __gxx_personality_v0
183; CHECK-FP-ELIM:   .handlerdata
184; CHECK-FP-ELIM:   .fnend
185
186; CHECK-V7-FP-LABEL: _Z4testiiiiiddddd:
187; CHECK-V7-FP:   .fnstart
188; CHECK-V7-FP:   .save  {r11, lr}
189; CHECK-V7-FP:   push   {r11, lr}
190; CHECK-V7-FP:   .setfp r11, sp
191; CHECK-V7-FP:   mov    r11, sp
192; CHECK-V7-FP:   .vsave {d8, d9, d10, d11, d12}
193; CHECK-V7-FP:   vpush  {d8, d9, d10, d11, d12}
194; CHECK-V7-FP:   .pad   #24
195; CHECK-V7-FP:   sub    sp, sp, #24
196; CHECK-V7-FP:   .personality __gxx_personality_v0
197; CHECK-V7-FP:   .handlerdata
198; CHECK-V7-FP:   .fnend
199
200; CHECK-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
201; CHECK-V7-FP-ELIM:   .fnstart
202; CHECK-V7-FP-ELIM:   .save  {r11, lr}
203; CHECK-V7-FP-ELIM:   push   {r11, lr}
204; CHECK-V7-FP-ELIM:   .vsave {d8, d9, d10, d11, d12}
205; CHECK-V7-FP-ELIM:   vpush  {d8, d9, d10, d11, d12}
206; CHECK-V7-FP-ELIM:   .pad   #24
207; CHECK-V7-FP-ELIM:   sub    sp, sp, #24
208; CHECK-V7-FP-ELIM:   .personality __gxx_personality_v0
209; CHECK-V7-FP-ELIM:   .handlerdata
210; CHECK-V7-FP-ELIM:   .fnend
211
212; DWARF-FP-LABEL: _Z4testiiiiiddddd:
213; DWARF-FP:    .cfi_startproc
214; DWARF-FP:    .cfi_personality 0, __gxx_personality_v0
215; DWARF-FP:    .cfi_lsda 0, .Lexception0
216; DWARF-FP:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
217; DWARF-FP:    .cfi_def_cfa_offset 36
218; DWARF-FP:    .cfi_offset lr, -4
219; DWARF-FP:    .cfi_offset r11, -8
220; DWARF-FP:    .cfi_offset r10, -12
221; DWARF-FP:    .cfi_offset r9, -16
222; DWARF-FP:    .cfi_offset r8, -20
223; DWARF-FP:    .cfi_offset r7, -24
224; DWARF-FP:    .cfi_offset r6, -28
225; DWARF-FP:    .cfi_offset r5, -32
226; DWARF-FP:    .cfi_offset r4, -36
227; DWARF-FP:    add r11, sp, #28
228; DWARF-FP:    .cfi_def_cfa r11, 8
229; DWARF-FP:    sub sp, sp, #44
230; DWARF-FP:    sub sp, r11, #28
231; DWARF-FP:    pop {r4, r5, r6, r7, r8, r9, r10, r11, lr}
232; DWARF-FP:    mov pc, lr
233; DWARF-FP:    .cfi_endproc
234
235; DWARF-FP-ELIM-LABEL: _Z4testiiiiiddddd:
236; DWARF-FP-ELIM:    .cfi_startproc
237; DWARF-FP-ELIM:    .cfi_personality 0, __gxx_personality_v0
238; DWARF-FP-ELIM:    .cfi_lsda 0, .Lexception0
239; DWARF-FP-ELIM:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
240; DWARF-FP-ELIM:    .cfi_def_cfa_offset 36
241; DWARF-FP-ELIM:    .cfi_offset lr, -4
242; DWARF-FP-ELIM:    .cfi_offset r11, -8
243; DWARF-FP-ELIM:    .cfi_offset r10, -12
244; DWARF-FP-ELIM:    .cfi_offset r9, -16
245; DWARF-FP-ELIM:    .cfi_offset r8, -20
246; DWARF-FP-ELIM:    .cfi_offset r7, -24
247; DWARF-FP-ELIM:    .cfi_offset r6, -28
248; DWARF-FP-ELIM:    .cfi_offset r5, -32
249; DWARF-FP-ELIM:    .cfi_offset r4, -36
250; DWARF-FP-ELIM:    sub sp, sp, #36
251; DWARF-FP-ELIM:    .cfi_def_cfa_offset 72
252; DWARF-FP-ELIM:    add sp, sp, #36
253; DWARF-FP-ELIM:    pop {r4, r5, r6, r7, r8, r9, r10, r11, lr}
254; DWARF-FP-ELIM:    mov pc, lr
255; DWARF-FP-ELIM:    .cfi_endproc
256
257; DWARF-V7-FP-LABEL: _Z4testiiiiiddddd:
258; DWARF-V7-FP:    .cfi_startproc
259; DWARF-V7-FP:    .cfi_personality 0, __gxx_personality_v0
260; DWARF-V7-FP:    .cfi_lsda 0, .Lexception0
261; DWARF-V7-FP:    push {r11, lr}
262; DWARF-V7-FP:    .cfi_def_cfa_offset 8
263; DWARF-V7-FP:    .cfi_offset lr, -4
264; DWARF-V7-FP:    .cfi_offset r11, -8
265; DWARF-V7-FP:    mov r11, sp
266; DWARF-V7-FP:    .cfi_def_cfa_register r11
267; DWARF-V7-FP:    vpush {d8, d9, d10, d11, d12}
268; DWARF-V7-FP:    .cfi_offset d12, -16
269; DWARF-V7-FP:    .cfi_offset d11, -24
270; DWARF-V7-FP:    .cfi_offset d10, -32
271; DWARF-V7-FP:    .cfi_offset d9, -40
272; DWARF-V7-FP:    sub sp, sp, #24
273; DWARF-V7-FP:    sub sp, r11, #40
274; DWARF-V7-FP:    vpop {d8, d9, d10, d11, d12}
275; DWARF-V7-FP:    pop {r11, pc}
276; DWARF-V7-FP:    .cfi_endproc
277
278; DWARF-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
279; DWARF-V7-FP-ELIM:    .cfi_startproc
280; DWARF-V7-FP-ELIM:    .cfi_personality 0, __gxx_personality_v0
281; DWARF-V7-FP-ELIM:    .cfi_lsda 0, .Lexception0
282; DWARF-V7-FP-ELIM:    push {r11, lr}
283; DWARF-V7-FP-ELIM:    .cfi_def_cfa_offset 8
284; DWARF-V7-FP-ELIM:    .cfi_offset lr, -4
285; DWARF-V7-FP-ELIM:    .cfi_offset r11, -8
286; DWARF-V7-FP-ELIM:    vpush {d8, d9, d10, d11, d12}
287; DWARF-V7-FP-ELIM:    .cfi_offset d12, -16
288; DWARF-V7-FP-ELIM:    .cfi_offset d11, -24
289; DWARF-V7-FP-ELIM:    .cfi_offset d10, -32
290; DWARF-V7-FP-ELIM:    .cfi_offset d9, -40
291; DWARF-V7-FP-ELIM:    sub sp, sp, #24
292; DWARF-V7-FP-ELIM:    .cfi_def_cfa_offset 72
293; DWARF-V7-FP-ELIM:    add sp, sp, #24
294; DWARF-V7-FP-ELIM:    vpop {d8, d9, d10, d11, d12}
295; DWARF-V7-FP-ELIM:    pop {r11, pc}
296; DWARF-V7-FP-ELIM:    .cfi_endproc
297
298; DWARF-WIN-FP-ELIM-LABEL: _Z4testiiiiiddddd:
299; DWARF-WIN-FP-ELIM:    .cfi_startproc
300; DWARF-WIN-FP-ELIM:    .cfi_personality 0, __gxx_personality_v0
301; DWARF-WIN-FP-ELIM:    .cfi_lsda 0, .Lexception0
302; DWARF-WIN-FP-ELIM:    push {r4, lr}
303; DWARF-WIN-FP-ELIM:    .cfi_def_cfa_offset 8
304; DWARF-WIN-FP-ELIM:    .cfi_offset lr, -4
305; DWARF-WIN-FP-ELIM:    .cfi_offset r4, -8
306; DWARF-WIN-FP-ELIM:    vpush {d8, d9, d10, d11, d12}
307; DWARF-WIN-FP-ELIM:    .cfi_offset d12, -16
308; DWARF-WIN-FP-ELIM:    .cfi_offset d11, -24
309; DWARF-WIN-FP-ELIM:    .cfi_offset d10, -32
310; DWARF-WIN-FP-ELIM:    .cfi_offset d9, -40
311; DWARF-WIN-FP-ELIM:    sub sp, #8
312; DWARF-WIN-FP-ELIM:    .cfi_def_cfa_offset 56
313; DWARF-WIN-FP-ELIM:    add sp, #8
314; DWARF-WIN-FP-ELIM:    vpop {d8, d9, d10, d11, d12}
315; DWARF-WIN-FP-ELIM:    pop {r4, pc}
316; DWARF-WIN-FP-ELIM:    .cfi_endproc
317
318; SEH-WIN-FP-ELIM-LABEL: _Z4testiiiiiddddd:
319; SEH-WIN-FP-ELIM:    .seh_proc _Z4testiiiiiddddd
320; SEH-WIN-FP-ELIM:    .seh_handler __gxx_personality_v0, %unwind, %except
321; SEH-WIN-FP-ELIM:    push {r4, lr}
322; SEH-WIN-FP-ELIM:    .seh_save_regs {r4, lr}
323; SEH-WIN-FP-ELIM:    vpush {d8, d9, d10, d11, d12}
324; SEH-WIN-FP-ELIM:    .seh_save_fregs {d8-d12}
325; SEH-WIN-FP-ELIM:    sub sp, #8
326; SEH-WIN-FP-ELIM:    .seh_stackalloc 8
327; SEH-WIN-FP-ELIM:    .seh_endprologue
328; SEH-WIN-FP-ELIM:    .seh_startepilogue
329; SEH-WIN-FP-ELIM:    add sp, #8
330; SEH-WIN-FP-ELIM:    .seh_stackalloc 8
331; SEH-WIN-FP-ELIM:    vpop {d8, d9, d10, d11, d12}
332; SEH-WIN-FP-ELIM:    .seh_save_fregs {d8-d12}
333; SEH-WIN-FP-ELIM:    pop {r4, pc}
334; SEH-WIN-FP-ELIM:    .seh_save_regs {r4, lr}
335; SEH-WIN-FP-ELIM:    .seh_endepilogue
336; SEH-WIN-FP-ELIM:    .seh_endproc
337
338;-------------------------------------------------------------------------------
339; Test 2
340;-------------------------------------------------------------------------------
341
342declare void @throw_exception_2()
343
344define void @test2() {
345entry:
346  call void @throw_exception_2()
347  ret void
348}
349
350; CHECK-FP-LABEL: test2:
351; CHECK-FP:   .fnstart
352; CHECK-FP:   .save  {r11, lr}
353; CHECK-FP:   push   {r11, lr}
354; CHECK-FP:   .setfp r11, sp
355; CHECK-FP:   mov    r11, sp
356; CHECK-FP:   pop    {r11, lr}
357; CHECK-FP:   mov    pc, lr
358; CHECK-FP:   .fnend
359
360; CHECK-FP-ELIM-LABEL: test2:
361; CHECK-FP-ELIM:   .fnstart
362; CHECK-FP-ELIM:   .save {r11, lr}
363; CHECK-FP-ELIM:   push  {r11, lr}
364; CHECK-FP-ELIM:   pop   {r11, lr}
365; CHECK-FP-ELIM:   mov   pc, lr
366; CHECK-FP-ELIM:   .fnend
367
368; CHECK-V7-FP-LABEL: test2:
369; CHECK-V7-FP:   .fnstart
370; CHECK-V7-FP:   .save  {r11, lr}
371; CHECK-V7-FP:   push   {r11, lr}
372; CHECK-V7-FP:   .setfp r11, sp
373; CHECK-V7-FP:   mov    r11, sp
374; CHECK-V7-FP:   pop    {r11, pc}
375; CHECK-V7-FP:   .fnend
376
377; CHECK-V7-FP-ELIM-LABEL: test2:
378; CHECK-V7-FP-ELIM:   .fnstart
379; CHECK-V7-FP-ELIM:   .save {r11, lr}
380; CHECK-V7-FP-ELIM:   push  {r11, lr}
381; CHECK-V7-FP-ELIM:   pop   {r11, pc}
382; CHECK-V7-FP-ELIM:   .fnend
383
384; DWARF-FP-LABEL: test2:
385; DWARF-FP:    .cfi_startproc
386; DWARF-FP:    push {r11, lr}
387; DWARF-FP:    .cfi_def_cfa_offset 8
388; DWARF-FP:    .cfi_offset lr, -4
389; DWARF-FP:    .cfi_offset r11, -8
390; DWARF-FP:    mov  r11, sp
391; DWARF-FP:    .cfi_def_cfa_register r11
392; DWARF-FP:    pop  {r11, lr}
393; DWARF-FP:    mov  pc, lr
394; DWARF-FP:    .cfi_endproc
395
396; DWARF-FP-ELIM-LABEL: test2:
397; DWARF-FP-ELIM:    .cfi_startproc
398; DWARF-FP-ELIM:    push {r11, lr}
399; DWARF-FP-ELIM:    .cfi_def_cfa_offset 8
400; DWARF-FP-ELIM:    .cfi_offset lr, -4
401; DWARF-FP-ELIM:    .cfi_offset r11, -8
402; DWARF-FP-ELIM:    pop  {r11, lr}
403; DWARF-FP-ELIM:    mov  pc, lr
404; DWARF-FP-ELIM:    .cfi_endproc
405
406; DWARF-V7-FP-LABEL: test2:
407; DWARF-V7-FP:    .cfi_startproc
408; DWARF-V7-FP:    push {r11, lr}
409; DWARF-V7-FP:    .cfi_def_cfa_offset 8
410; DWARF-V7-FP:    .cfi_offset lr, -4
411; DWARF-V7-FP:    .cfi_offset r11, -8
412; DWARF-V7-FP:    mov  r11, sp
413; DWARF-V7-FP:    .cfi_def_cfa_register r11
414; DWARF-V7-FP:    pop  {r11, pc}
415; DWARF-V7-FP:    .cfi_endproc
416
417; DWARF-V7-FP-ELIM-LABEL: test2:
418; DWARF-V7-FP-ELIM:    .cfi_startproc
419; DWARF-V7-FP-ELIM:    push {r11, lr}
420; DWARF-V7-FP-ELIM:    .cfi_def_cfa_offset 8
421; DWARF-V7-FP-ELIM:    .cfi_offset lr, -4
422; DWARF-V7-FP-ELIM:    .cfi_offset r11, -8
423; DWARF-V7-FP-ELIM:    pop  {r11, pc}
424; DWARF-V7-FP-ELIM:    .cfi_endproc
425
426; DWARF-WIN-FP-ELIM-LABEL: test2:
427; DWARF-WIN-FP-ELIM:    .cfi_startproc
428; DWARF-WIN-FP-ELIM:    push.w {r11, lr}
429; DWARF-WIN-FP-ELIM:    .cfi_def_cfa_offset 8
430; DWARF-WIN-FP-ELIM:    .cfi_offset lr, -4
431; DWARF-WIN-FP-ELIM:    .cfi_offset r11, -8
432; DWARF-WIN-FP-ELIM:    pop.w  {r11, pc}
433; DWARF-WIN-FP-ELIM:    .cfi_endproc
434
435; SEH-WIN-FP-ELIM-LABEL: test2:
436; SEH-WIN-FP-ELIM:    .seh_proc test2
437; SEH-WIN-FP-ELIM:    push.w {r11, lr}
438; SEH-WIN-FP-ELIM:    .seh_save_regs_w {r11, lr}
439; SEH-WIN-FP-ELIM:    .seh_endprologue
440; SEH-WIN-FP-ELIM:    .seh_startepilogue
441; SEH-WIN-FP-ELIM:    pop.w  {r11, pc}
442; SEH-WIN-FP-ELIM:    .seh_endepilogue
443; SEH-WIN-FP-ELIM:    .seh_endproc
444
445
446;-------------------------------------------------------------------------------
447; Test 3
448;-------------------------------------------------------------------------------
449
450declare void @throw_exception_3(i32)
451
452define i32 @test3(i32 %a, i32 %b, i32 %c, i32 %d,
453                  i32 %e, i32 %f, i32 %g, i32 %h) {
454entry:
455  %add = add nsw i32 %b, %a
456  %add1 = add nsw i32 %add, %c
457  %add2 = add nsw i32 %add1, %d
458  tail call void @throw_exception_3(i32 %add2)
459  %add3 = add nsw i32 %f, %e
460  %add4 = add nsw i32 %add3, %g
461  %add5 = add nsw i32 %add4, %h
462  tail call void @throw_exception_3(i32 %add5)
463  %add6 = add nsw i32 %add5, %add2
464  ret i32 %add6
465}
466
467; CHECK-FP-LABEL: test3:
468; CHECK-FP:   .fnstart
469; CHECK-FP:   .save  {r4, r5, r11, lr}
470; CHECK-FP:   push   {r4, r5, r11, lr}
471; CHECK-FP:   .setfp r11, sp, #8
472; CHECK-FP:   add    r11, sp, #8
473; CHECK-FP:   pop    {r4, r5, r11, lr}
474; CHECK-FP:   mov    pc, lr
475; CHECK-FP:   .fnend
476
477; CHECK-FP-ELIM-LABEL: test3:
478; CHECK-FP-ELIM:   .fnstart
479; CHECK-FP-ELIM:   .save {r4, r5, r11, lr}
480; CHECK-FP-ELIM:   push  {r4, r5, r11, lr}
481; CHECK-FP-ELIM:   pop   {r4, r5, r11, lr}
482; CHECK-FP-ELIM:   mov   pc, lr
483; CHECK-FP-ELIM:   .fnend
484
485; CHECK-V7-FP-LABEL: test3:
486; CHECK-V7-FP:   .fnstart
487; CHECK-V7-FP:   .save  {r4, r5, r11, lr}
488; CHECK-V7-FP:   push   {r4, r5, r11, lr}
489; CHECK-V7-FP:   .setfp r11, sp, #8
490; CHECK-V7-FP:   add    r11, sp, #8
491; CHECK-V7-FP:   pop    {r4, r5, r11, pc}
492; CHECK-V7-FP:   .fnend
493
494; CHECK-V7-FP-ELIM-LABEL: test3:
495; CHECK-V7-FP-ELIM:   .fnstart
496; CHECK-V7-FP-ELIM:   .save {r4, r5, r11, lr}
497; CHECK-V7-FP-ELIM:   push  {r4, r5, r11, lr}
498; CHECK-V7-FP-ELIM:   pop   {r4, r5, r11, pc}
499; CHECK-V7-FP-ELIM:   .fnend
500
501; DWARF-FP-LABEL: test3:
502; DWARF-FP:    .cfi_startproc
503; DWARF-FP:    push {r4, r5, r11, lr}
504; DWARF-FP:    .cfi_def_cfa_offset 16
505; DWARF-FP:    .cfi_offset lr, -4
506; DWARF-FP:    .cfi_offset r11, -8
507; DWARF-FP:    .cfi_offset r5, -12
508; DWARF-FP:    .cfi_offset r4, -16
509; DWARF-FP:    add  r11, sp, #8
510; DWARF-FP:    .cfi_def_cfa r11, 8
511; DWARF-FP:    pop  {r4, r5, r11, lr}
512; DWARF-FP:    mov  pc, lr
513; DWARF-FP:    .cfi_endproc
514
515; DWARF-FP-ELIM-LABEL: test3:
516; DWARF-FP-ELIM:    .cfi_startproc
517; DWARF-FP-ELIM:    push {r4, r5, r11, lr}
518; DWARF-FP-ELIM:    .cfi_def_cfa_offset 16
519; DWARF-FP-ELIM:    .cfi_offset lr, -4
520; DWARF-FP-ELIM:    .cfi_offset r11, -8
521; DWARF-FP-ELIM:    .cfi_offset r5, -12
522; DWARF-FP-ELIM:    .cfi_offset r4, -16
523; DWARF-FP-ELIM:    pop  {r4, r5, r11, lr}
524; DWARF-FP-ELIM:    mov  pc, lr
525; DWARF-FP-ELIM:    .cfi_endproc
526
527; DWARF-V7-FP-LABEL: test3:
528; DWARF-V7-FP:    .cfi_startproc
529; DWARF-V7-FP:    push {r4, r5, r11, lr}
530; DWARF-V7-FP:    .cfi_def_cfa_offset 16
531; DWARF-V7-FP:    .cfi_offset lr, -4
532; DWARF-V7-FP:    .cfi_offset r11, -8
533; DWARF-V7-FP:    .cfi_offset r5, -12
534; DWARF-V7-FP:    .cfi_offset r4, -16
535; DWARF-V7-FP:    add  r11, sp, #8
536; DWARF-V7-FP:    .cfi_def_cfa r11, 8
537; DWARF-V7-FP:    pop  {r4, r5, r11, pc}
538; DWARF-V7-FP:    .cfi_endproc
539
540; DWARF-V7-FP-ELIM-LABEL: test3:
541; DWARF-V7-FP-ELIM:    .cfi_startproc
542; DWARF-V7-FP-ELIM:    push {r4, r5, r11, lr}
543; DWARF-V7-FP-ELIM:    .cfi_def_cfa_offset 16
544; DWARF-V7-FP-ELIM:    .cfi_offset lr, -4
545; DWARF-V7-FP-ELIM:    .cfi_offset r11, -8
546; DWARF-V7-FP-ELIM:    .cfi_offset r5, -12
547; DWARF-V7-FP-ELIM:    .cfi_offset r4, -16
548; DWARF-V7-FP-ELIM:    pop  {r4, r5, r11, pc}
549; DWARF-V7-FP-ELIM:    .cfi_endproc
550
551; DWARF-WIN-FP-ELIM-LABEL: test3:
552; DWARF-WIN-FP-ELIM:    .cfi_startproc
553; DWARF-WIN-FP-ELIM:    push.w {r4, r5, r11, lr}
554; DWARF-WIN-FP-ELIM:    .cfi_def_cfa_offset 16
555; DWARF-WIN-FP-ELIM:    .cfi_offset lr, -4
556; DWARF-WIN-FP-ELIM:    .cfi_offset r11, -8
557; DWARF-WIN-FP-ELIM:    .cfi_offset r5, -12
558; DWARF-WIN-FP-ELIM:    .cfi_offset r4, -16
559; DWARF-WIN-FP-ELIM:    pop.w  {r4, r5, r11, pc}
560; DWARF-WIN-FP-ELIM:    .cfi_endproc
561
562; SEH-WIN-FP-ELIM-LABEL: test3:
563; SEH-WIN-FP-ELIM:    .seh_proc test3
564; SEH-WIN-FP-ELIM:    push.w {r4, r5, r11, lr}
565; SEH-WIN-FP-ELIM:    .seh_save_regs_w {r4-r5, r11, lr}
566; SEH-WIN-FP-ELIM:    .seh_endprologue
567; SEH-WIN-FP-ELIM:    .seh_startepilogue
568; SEH-WIN-FP-ELIM:    pop.w  {r4, r5, r11, pc}
569; SEH-WIN-FP-ELIM:    .seh_save_regs_w {r4-r5, r11, lr}
570; SEH-WIN-FP-ELIM:    .seh_endepilogue
571; SEH-WIN-FP-ELIM:    .seh_endproc
572
573
574;-------------------------------------------------------------------------------
575; Test 4
576;-------------------------------------------------------------------------------
577
578define void @test4() nounwind "frame-pointer"="none" {
579entry:
580  ret void
581}
582
583; CHECK-FP-LABEL: test4:
584; CHECK-FP:   .fnstart
585; CHECK-FP:   mov pc, lr
586; CHECK-FP:   .cantunwind
587; CHECK-FP:   .fnend
588
589; CHECK-FP-ELIM-LABEL: test4:
590; CHECK-FP-ELIM:   .fnstart
591; CHECK-FP-ELIM:   mov pc, lr
592; CHECK-FP-ELIM:   .cantunwind
593; CHECK-FP-ELIM:   .fnend
594
595; CHECK-V7-FP-LABEL: test4:
596; CHECK-V7-FP:   .fnstart
597; CHECK-V7-FP:   bx lr
598; CHECK-V7-FP:   .cantunwind
599; CHECK-V7-FP:   .fnend
600
601; CHECK-V7-FP-ELIM-LABEL: test4:
602; CHECK-V7-FP-ELIM:   .fnstart
603; CHECK-V7-FP-ELIM:   bx lr
604; CHECK-V7-FP-ELIM:   .cantunwind
605; CHECK-V7-FP-ELIM:   .fnend
606
607; DWARF-FP-LABEL: test4:
608; DWARF-FP-NOT: .cfi_startproc
609; DWARF-FP:    mov pc, lr
610; DWARF-FP-NOT: .cfi_endproc
611; DWARF-FP:    .size test4,
612
613; DWARF-FP-ELIM-LABEL: test4:
614; DWARF-FP-ELIM-NOT: .cfi_startproc
615; DWARF-FP-ELIM:     mov pc, lr
616; DWARF-FP-ELIM-NOT: .cfi_endproc
617; DWARF-FP-ELIM:     .size test4,
618
619; DWARF-V7-FP-LABEL: test4:
620; DWARF-V7-FP-NOT: .cfi_startproc
621; DWARF-V7-FP:    bx lr
622; DWARF-V7-FP-NOT: .cfi_endproc
623; DWARF-V7-FP:    .size test4,
624
625; DWARF-V7-FP-ELIM-LABEL: test4:
626; DWARF-V7-FP-ELIM-NOT: .cfi_startproc
627; DWARF-V7-FP-ELIM:     bx lr
628; DWARF-V7-FP-ELIM-NOT: .cfi_endproc
629; DWARF-V7-FP-ELIM:     .size test4,
630
631; DWARF-WIN-FP-ELIM-LABEL: test4:
632; DWARF-WIN-FP-ELIM-NOT: .cfi_startproc
633; DWARF-WIN-FP-ELIM:     bx lr
634; DWARF-WIN-FP-ELIM-NOT: .cfi_endproc
635
636; SEH-WIN-FP-ELIM-LABEL: test4:
637; SEH-WIN-FP-ELIM-NOT: .seh_proc test4
638; SEH-WIN-FP-ELIM:     bx lr
639; SEH-WIN-FP-ELIM-NOT: .seh_endproc
640