xref: /llvm-project/llvm/test/CodeGen/Thumb2/pacbti-m-frame-chain.ll (revision dff114b3565e4c981fcb40f24f72a0cb426294fe)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=none                          | FileCheck %s --check-prefix=R7
3; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=reserved                      | FileCheck %s --check-prefix=R7-RES
4; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=all                           | FileCheck %s --check-prefix=R7-ABI
5; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=none     -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11
6; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=reserved -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11-RES
7; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=all      -mattr=+aapcs-frame-chain | FileCheck %s --check-prefix=R11-ABI
8
9; int test1() {
10;     return 0;
11; }
12define i32 @test1() "sign-return-address"="non-leaf" {
13; R7-LABEL: test1:
14; R7:         .cfi_sections .debug_frame
15; R7-NEXT:    .cfi_startproc
16; R7-NEXT:  @ %bb.0: @ %entry
17; R7-NEXT:    movs r0, #0
18; R7-NEXT:    bx lr
19;
20; R7-RES-LABEL: test1:
21; R7-RES:         .cfi_sections .debug_frame
22; R7-RES-NEXT:    .cfi_startproc
23; R7-RES-NEXT:  @ %bb.0: @ %entry
24; R7-RES-NEXT:    movs r0, #0
25; R7-RES-NEXT:    bx lr
26;
27; R7-ABI-LABEL: test1:
28; R7-ABI:         .cfi_sections .debug_frame
29; R7-ABI-NEXT:    .cfi_startproc
30; R7-ABI-NEXT:  @ %bb.0: @ %entry
31; R7-ABI-NEXT:    pac r12, lr, sp
32; R7-ABI-NEXT:    .save {r7, lr}
33; R7-ABI-NEXT:    push {r7, lr}
34; R7-ABI-NEXT:    .cfi_def_cfa_offset 8
35; R7-ABI-NEXT:    .cfi_offset lr, -4
36; R7-ABI-NEXT:    .cfi_offset r7, -8
37; R7-ABI-NEXT:    .setfp r7, sp
38; R7-ABI-NEXT:    mov r7, sp
39; R7-ABI-NEXT:    .cfi_def_cfa_register r7
40; R7-ABI-NEXT:    .save {ra_auth_code}
41; R7-ABI-NEXT:    str r12, [sp, #-4]!
42; R7-ABI-NEXT:    .cfi_offset ra_auth_code, -12
43; R7-ABI-NEXT:    movs r0, #0
44; R7-ABI-NEXT:    ldr r12, [sp], #4
45; R7-ABI-NEXT:    pop.w {r7, lr}
46; R7-ABI-NEXT:    aut r12, lr, sp
47; R7-ABI-NEXT:    bx lr
48;
49; R11-LABEL: test1:
50; R11:         .cfi_sections .debug_frame
51; R11-NEXT:    .cfi_startproc
52; R11-NEXT:  @ %bb.0: @ %entry
53; R11-NEXT:    movs r0, #0
54; R11-NEXT:    bx lr
55;
56; R11-RES-LABEL: test1:
57; R11-RES:         .cfi_sections .debug_frame
58; R11-RES-NEXT:    .cfi_startproc
59; R11-RES-NEXT:  @ %bb.0: @ %entry
60; R11-RES-NEXT:    movs r0, #0
61; R11-RES-NEXT:    bx lr
62;
63; R11-ABI-LABEL: test1:
64; R11-ABI:         .cfi_sections .debug_frame
65; R11-ABI-NEXT:    .cfi_startproc
66; R11-ABI-NEXT:  @ %bb.0: @ %entry
67; R11-ABI-NEXT:    pac r12, lr, sp
68; R11-ABI-NEXT:    .save {ra_auth_code}
69; R11-ABI-NEXT:    str r12, [sp, #-4]!
70; R11-ABI-NEXT:    .cfi_def_cfa_offset 4
71; R11-ABI-NEXT:    .cfi_offset ra_auth_code, -4
72; R11-ABI-NEXT:    .save {r11, lr}
73; R11-ABI-NEXT:    push.w {r11, lr}
74; R11-ABI-NEXT:    .cfi_def_cfa_offset 12
75; R11-ABI-NEXT:    .cfi_offset lr, -8
76; R11-ABI-NEXT:    .cfi_offset r11, -12
77; R11-ABI-NEXT:    .setfp r11, sp
78; R11-ABI-NEXT:    mov r11, sp
79; R11-ABI-NEXT:    .cfi_def_cfa_register r11
80; R11-ABI-NEXT:    movs r0, #0
81; R11-ABI-NEXT:    pop.w {r11, lr}
82; R11-ABI-NEXT:    ldr r12, [sp], #4
83; R11-ABI-NEXT:    aut r12, lr, sp
84; R11-ABI-NEXT:    bx lr
85entry:
86    ret i32 0
87}
88
89; void foo(int n) {
90;   int a[n];
91;   bar(a);
92; }
93define dso_local void @test2(i32 noundef %n) "sign-return-address"="non-leaf" {
94; R7-LABEL: test2:
95; R7:         .cfi_startproc
96; R7-NEXT:  @ %bb.0: @ %entry
97; R7-NEXT:    pac r12, lr, sp
98; R7-NEXT:    .save {r4, r6, r7, ra_auth_code, lr}
99; R7-NEXT:    push.w {r4, r6, r7, r12, lr}
100; R7-NEXT:    .cfi_def_cfa_offset 20
101; R7-NEXT:    .cfi_offset lr, -4
102; R7-NEXT:    .cfi_offset ra_auth_code, -8
103; R7-NEXT:    .cfi_offset r7, -12
104; R7-NEXT:    .cfi_offset r6, -16
105; R7-NEXT:    .cfi_offset r4, -20
106; R7-NEXT:    .setfp r7, sp, #8
107; R7-NEXT:    add r7, sp, #8
108; R7-NEXT:    .cfi_def_cfa r7, 12
109; R7-NEXT:    .pad #4
110; R7-NEXT:    sub sp, #4
111; R7-NEXT:    movs r1, #7
112; R7-NEXT:    add.w r0, r1, r0, lsl #2
113; R7-NEXT:    bic r0, r0, #7
114; R7-NEXT:    sub.w r0, sp, r0
115; R7-NEXT:    mov sp, r0
116; R7-NEXT:    bl take_ptr
117; R7-NEXT:    sub.w r4, r7, #8
118; R7-NEXT:    mov sp, r4
119; R7-NEXT:    pop.w {r4, r6, r7, r12, lr}
120; R7-NEXT:    aut r12, lr, sp
121; R7-NEXT:    bx lr
122;
123; R7-RES-LABEL: test2:
124; R7-RES:         .cfi_startproc
125; R7-RES-NEXT:  @ %bb.0: @ %entry
126; R7-RES-NEXT:    pac r12, lr, sp
127; R7-RES-NEXT:    .save {r4, r6, r7, lr}
128; R7-RES-NEXT:    push {r4, r6, r7, lr}
129; R7-RES-NEXT:    .cfi_def_cfa_offset 16
130; R7-RES-NEXT:    .cfi_offset lr, -4
131; R7-RES-NEXT:    .cfi_offset r7, -8
132; R7-RES-NEXT:    .cfi_offset r6, -12
133; R7-RES-NEXT:    .cfi_offset r4, -16
134; R7-RES-NEXT:    .setfp r7, sp, #8
135; R7-RES-NEXT:    add r7, sp, #8
136; R7-RES-NEXT:    .cfi_def_cfa r7, 8
137; R7-RES-NEXT:    .save {ra_auth_code}
138; R7-RES-NEXT:    str r12, [sp, #-4]!
139; R7-RES-NEXT:    .cfi_offset ra_auth_code, -20
140; R7-RES-NEXT:    .pad #4
141; R7-RES-NEXT:    sub sp, #4
142; R7-RES-NEXT:    movs r1, #7
143; R7-RES-NEXT:    add.w r0, r1, r0, lsl #2
144; R7-RES-NEXT:    bic r0, r0, #7
145; R7-RES-NEXT:    sub.w r0, sp, r0
146; R7-RES-NEXT:    mov sp, r0
147; R7-RES-NEXT:    bl take_ptr
148; R7-RES-NEXT:    sub.w r4, r7, #12
149; R7-RES-NEXT:    mov sp, r4
150; R7-RES-NEXT:    ldr r12, [sp], #4
151; R7-RES-NEXT:    pop.w {r4, r6, r7, lr}
152; R7-RES-NEXT:    aut r12, lr, sp
153; R7-RES-NEXT:    bx lr
154;
155; R7-ABI-LABEL: test2:
156; R7-ABI:         .cfi_startproc
157; R7-ABI-NEXT:  @ %bb.0: @ %entry
158; R7-ABI-NEXT:    pac r12, lr, sp
159; R7-ABI-NEXT:    .save {r4, r6, r7, lr}
160; R7-ABI-NEXT:    push {r4, r6, r7, lr}
161; R7-ABI-NEXT:    .cfi_def_cfa_offset 16
162; R7-ABI-NEXT:    .cfi_offset lr, -4
163; R7-ABI-NEXT:    .cfi_offset r7, -8
164; R7-ABI-NEXT:    .cfi_offset r6, -12
165; R7-ABI-NEXT:    .cfi_offset r4, -16
166; R7-ABI-NEXT:    .setfp r7, sp, #8
167; R7-ABI-NEXT:    add r7, sp, #8
168; R7-ABI-NEXT:    .cfi_def_cfa r7, 8
169; R7-ABI-NEXT:    .save {ra_auth_code}
170; R7-ABI-NEXT:    str r12, [sp, #-4]!
171; R7-ABI-NEXT:    .cfi_offset ra_auth_code, -20
172; R7-ABI-NEXT:    .pad #4
173; R7-ABI-NEXT:    sub sp, #4
174; R7-ABI-NEXT:    movs r1, #7
175; R7-ABI-NEXT:    add.w r0, r1, r0, lsl #2
176; R7-ABI-NEXT:    bic r0, r0, #7
177; R7-ABI-NEXT:    sub.w r0, sp, r0
178; R7-ABI-NEXT:    mov sp, r0
179; R7-ABI-NEXT:    bl take_ptr
180; R7-ABI-NEXT:    sub.w r4, r7, #12
181; R7-ABI-NEXT:    mov sp, r4
182; R7-ABI-NEXT:    ldr r12, [sp], #4
183; R7-ABI-NEXT:    pop.w {r4, r6, r7, lr}
184; R7-ABI-NEXT:    aut r12, lr, sp
185; R7-ABI-NEXT:    bx lr
186;
187; R11-LABEL: test2:
188; R11:         .cfi_startproc
189; R11-NEXT:  @ %bb.0: @ %entry
190; R11-NEXT:    pac r12, lr, sp
191; R11-NEXT:    .save {r4, r7, r11, ra_auth_code, lr}
192; R11-NEXT:    push.w {r4, r7, r11, r12, lr}
193; R11-NEXT:    .cfi_def_cfa_offset 20
194; R11-NEXT:    .cfi_offset lr, -4
195; R11-NEXT:    .cfi_offset ra_auth_code, -8
196; R11-NEXT:    .cfi_offset r11, -12
197; R11-NEXT:    .cfi_offset r7, -16
198; R11-NEXT:    .cfi_offset r4, -20
199; R11-NEXT:    .setfp r11, sp, #8
200; R11-NEXT:    add.w r11, sp, #8
201; R11-NEXT:    .cfi_def_cfa r11, 12
202; R11-NEXT:    .pad #4
203; R11-NEXT:    sub sp, #4
204; R11-NEXT:    movs r1, #7
205; R11-NEXT:    add.w r0, r1, r0, lsl #2
206; R11-NEXT:    bic r0, r0, #7
207; R11-NEXT:    sub.w r0, sp, r0
208; R11-NEXT:    mov sp, r0
209; R11-NEXT:    bl take_ptr
210; R11-NEXT:    sub.w r4, r11, #8
211; R11-NEXT:    mov sp, r4
212; R11-NEXT:    pop.w {r4, r7, r11, r12, lr}
213; R11-NEXT:    aut r12, lr, sp
214; R11-NEXT:    bx lr
215;
216; R11-RES-LABEL: test2:
217; R11-RES:         .cfi_startproc
218; R11-RES-NEXT:  @ %bb.0: @ %entry
219; R11-RES-NEXT:    pac r12, lr, sp
220; R11-RES-NEXT:    .save {r4, r7, ra_auth_code}
221; R11-RES-NEXT:    push.w {r4, r7, r12}
222; R11-RES-NEXT:    .cfi_def_cfa_offset 12
223; R11-RES-NEXT:    .cfi_offset ra_auth_code, -4
224; R11-RES-NEXT:    .cfi_offset r7, -8
225; R11-RES-NEXT:    .cfi_offset r4, -12
226; R11-RES-NEXT:    .save {r11, lr}
227; R11-RES-NEXT:    push.w {r11, lr}
228; R11-RES-NEXT:    .cfi_def_cfa_offset 20
229; R11-RES-NEXT:    .cfi_offset lr, -16
230; R11-RES-NEXT:    .cfi_offset r11, -20
231; R11-RES-NEXT:    .setfp r11, sp
232; R11-RES-NEXT:    mov r11, sp
233; R11-RES-NEXT:    .cfi_def_cfa_register r11
234; R11-RES-NEXT:    .pad #4
235; R11-RES-NEXT:    sub sp, #4
236; R11-RES-NEXT:    movs r1, #7
237; R11-RES-NEXT:    add.w r0, r1, r0, lsl #2
238; R11-RES-NEXT:    bic r0, r0, #7
239; R11-RES-NEXT:    sub.w r0, sp, r0
240; R11-RES-NEXT:    mov sp, r0
241; R11-RES-NEXT:    bl take_ptr
242; R11-RES-NEXT:    mov sp, r11
243; R11-RES-NEXT:    pop.w {r11, lr}
244; R11-RES-NEXT:    pop.w {r4, r7, r12}
245; R11-RES-NEXT:    aut r12, lr, sp
246; R11-RES-NEXT:    bx lr
247;
248; R11-ABI-LABEL: test2:
249; R11-ABI:         .cfi_startproc
250; R11-ABI-NEXT:  @ %bb.0: @ %entry
251; R11-ABI-NEXT:    pac r12, lr, sp
252; R11-ABI-NEXT:    .save {r4, r7, ra_auth_code}
253; R11-ABI-NEXT:    push.w {r4, r7, r12}
254; R11-ABI-NEXT:    .cfi_def_cfa_offset 12
255; R11-ABI-NEXT:    .cfi_offset ra_auth_code, -4
256; R11-ABI-NEXT:    .cfi_offset r7, -8
257; R11-ABI-NEXT:    .cfi_offset r4, -12
258; R11-ABI-NEXT:    .save {r11, lr}
259; R11-ABI-NEXT:    push.w {r11, lr}
260; R11-ABI-NEXT:    .cfi_def_cfa_offset 20
261; R11-ABI-NEXT:    .cfi_offset lr, -16
262; R11-ABI-NEXT:    .cfi_offset r11, -20
263; R11-ABI-NEXT:    .setfp r11, sp
264; R11-ABI-NEXT:    mov r11, sp
265; R11-ABI-NEXT:    .cfi_def_cfa_register r11
266; R11-ABI-NEXT:    .pad #4
267; R11-ABI-NEXT:    sub sp, #4
268; R11-ABI-NEXT:    movs r1, #7
269; R11-ABI-NEXT:    add.w r0, r1, r0, lsl #2
270; R11-ABI-NEXT:    bic r0, r0, #7
271; R11-ABI-NEXT:    sub.w r0, sp, r0
272; R11-ABI-NEXT:    mov sp, r0
273; R11-ABI-NEXT:    bl take_ptr
274; R11-ABI-NEXT:    mov sp, r11
275; R11-ABI-NEXT:    pop.w {r11, lr}
276; R11-ABI-NEXT:    pop.w {r4, r7, r12}
277; R11-ABI-NEXT:    aut r12, lr, sp
278; R11-ABI-NEXT:    bx lr
279entry:
280  %vla = alloca i32, i32 %n, align 4
281  call void @take_ptr(ptr noundef nonnull %vla)
282  ret void
283}
284
285; void test3(int c, float e, int z) {
286;   if (c)
287;     knr();
288;   take_ptr(alloca(z));
289;   if (e)
290;     knr();
291; }
292define void @test3(i32 noundef %c, float noundef %e, i32 noundef %z) "sign-return-address"="non-leaf" {
293; R7-LABEL: test3:
294; R7:         .cfi_startproc
295; R7-NEXT:  @ %bb.0: @ %entry
296; R7-NEXT:    pac r12, lr, sp
297; R7-NEXT:    .save {r4, r5, r6, r7, r8, ra_auth_code, lr}
298; R7-NEXT:    push.w {r4, r5, r6, r7, r8, r12, lr}
299; R7-NEXT:    .cfi_def_cfa_offset 28
300; R7-NEXT:    .cfi_offset lr, -4
301; R7-NEXT:    .cfi_offset ra_auth_code, -8
302; R7-NEXT:    .cfi_offset r8, -12
303; R7-NEXT:    .cfi_offset r7, -16
304; R7-NEXT:    .cfi_offset r6, -20
305; R7-NEXT:    .cfi_offset r5, -24
306; R7-NEXT:    .cfi_offset r4, -28
307; R7-NEXT:    .setfp r7, sp, #12
308; R7-NEXT:    add r7, sp, #12
309; R7-NEXT:    .cfi_def_cfa r7, 16
310; R7-NEXT:    .pad #4
311; R7-NEXT:    sub sp, #4
312; R7-NEXT:    cmp r0, #0
313; R7-NEXT:    mov r5, r2
314; R7-NEXT:    mov r4, r1
315; R7-NEXT:    it ne
316; R7-NEXT:    blne knr
317; R7-NEXT:    adds r0, r5, #7
318; R7-NEXT:    bic r0, r0, #7
319; R7-NEXT:    sub.w r0, sp, r0
320; R7-NEXT:    mov sp, r0
321; R7-NEXT:    bl take_ptr
322; R7-NEXT:    mov r0, r4
323; R7-NEXT:    movs r1, #0
324; R7-NEXT:    bl __aeabi_fcmpeq
325; R7-NEXT:    cmp r0, #0
326; R7-NEXT:    it eq
327; R7-NEXT:    bleq knr
328; R7-NEXT:    sub.w r4, r7, #12
329; R7-NEXT:    mov sp, r4
330; R7-NEXT:    pop.w {r4, r5, r6, r7, r8, r12, lr}
331; R7-NEXT:    aut r12, lr, sp
332; R7-NEXT:    bx lr
333;
334; R7-RES-LABEL: test3:
335; R7-RES:         .cfi_startproc
336; R7-RES-NEXT:  @ %bb.0: @ %entry
337; R7-RES-NEXT:    pac r12, lr, sp
338; R7-RES-NEXT:    .save {r4, r5, r6, r7, lr}
339; R7-RES-NEXT:    push {r4, r5, r6, r7, lr}
340; R7-RES-NEXT:    .cfi_def_cfa_offset 20
341; R7-RES-NEXT:    .cfi_offset lr, -4
342; R7-RES-NEXT:    .cfi_offset r7, -8
343; R7-RES-NEXT:    .cfi_offset r6, -12
344; R7-RES-NEXT:    .cfi_offset r5, -16
345; R7-RES-NEXT:    .cfi_offset r4, -20
346; R7-RES-NEXT:    .setfp r7, sp, #12
347; R7-RES-NEXT:    add r7, sp, #12
348; R7-RES-NEXT:    .cfi_def_cfa r7, 8
349; R7-RES-NEXT:    .save {r8, ra_auth_code}
350; R7-RES-NEXT:    push.w {r8, r12}
351; R7-RES-NEXT:    .cfi_offset ra_auth_code, -24
352; R7-RES-NEXT:    .cfi_offset r8, -28
353; R7-RES-NEXT:    .pad #4
354; R7-RES-NEXT:    sub sp, #4
355; R7-RES-NEXT:    cmp r0, #0
356; R7-RES-NEXT:    mov r5, r2
357; R7-RES-NEXT:    mov r4, r1
358; R7-RES-NEXT:    it ne
359; R7-RES-NEXT:    blne knr
360; R7-RES-NEXT:    adds r0, r5, #7
361; R7-RES-NEXT:    bic r0, r0, #7
362; R7-RES-NEXT:    sub.w r0, sp, r0
363; R7-RES-NEXT:    mov sp, r0
364; R7-RES-NEXT:    bl take_ptr
365; R7-RES-NEXT:    mov r0, r4
366; R7-RES-NEXT:    movs r1, #0
367; R7-RES-NEXT:    bl __aeabi_fcmpeq
368; R7-RES-NEXT:    cmp r0, #0
369; R7-RES-NEXT:    it eq
370; R7-RES-NEXT:    bleq knr
371; R7-RES-NEXT:    sub.w r4, r7, #20
372; R7-RES-NEXT:    mov sp, r4
373; R7-RES-NEXT:    pop.w {r8, r12}
374; R7-RES-NEXT:    pop.w {r4, r5, r6, r7, lr}
375; R7-RES-NEXT:    aut r12, lr, sp
376; R7-RES-NEXT:    bx lr
377;
378; R7-ABI-LABEL: test3:
379; R7-ABI:         .cfi_startproc
380; R7-ABI-NEXT:  @ %bb.0: @ %entry
381; R7-ABI-NEXT:    pac r12, lr, sp
382; R7-ABI-NEXT:    .save {r4, r5, r6, r7, lr}
383; R7-ABI-NEXT:    push {r4, r5, r6, r7, lr}
384; R7-ABI-NEXT:    .cfi_def_cfa_offset 20
385; R7-ABI-NEXT:    .cfi_offset lr, -4
386; R7-ABI-NEXT:    .cfi_offset r7, -8
387; R7-ABI-NEXT:    .cfi_offset r6, -12
388; R7-ABI-NEXT:    .cfi_offset r5, -16
389; R7-ABI-NEXT:    .cfi_offset r4, -20
390; R7-ABI-NEXT:    .setfp r7, sp, #12
391; R7-ABI-NEXT:    add r7, sp, #12
392; R7-ABI-NEXT:    .cfi_def_cfa r7, 8
393; R7-ABI-NEXT:    .save {r8, ra_auth_code}
394; R7-ABI-NEXT:    push.w {r8, r12}
395; R7-ABI-NEXT:    .cfi_offset ra_auth_code, -24
396; R7-ABI-NEXT:    .cfi_offset r8, -28
397; R7-ABI-NEXT:    .pad #4
398; R7-ABI-NEXT:    sub sp, #4
399; R7-ABI-NEXT:    cmp r0, #0
400; R7-ABI-NEXT:    mov r5, r2
401; R7-ABI-NEXT:    mov r4, r1
402; R7-ABI-NEXT:    it ne
403; R7-ABI-NEXT:    blne knr
404; R7-ABI-NEXT:    adds r0, r5, #7
405; R7-ABI-NEXT:    bic r0, r0, #7
406; R7-ABI-NEXT:    sub.w r0, sp, r0
407; R7-ABI-NEXT:    mov sp, r0
408; R7-ABI-NEXT:    bl take_ptr
409; R7-ABI-NEXT:    mov r0, r4
410; R7-ABI-NEXT:    movs r1, #0
411; R7-ABI-NEXT:    bl __aeabi_fcmpeq
412; R7-ABI-NEXT:    cmp r0, #0
413; R7-ABI-NEXT:    it eq
414; R7-ABI-NEXT:    bleq knr
415; R7-ABI-NEXT:    sub.w r4, r7, #20
416; R7-ABI-NEXT:    mov sp, r4
417; R7-ABI-NEXT:    pop.w {r8, r12}
418; R7-ABI-NEXT:    pop.w {r4, r5, r6, r7, lr}
419; R7-ABI-NEXT:    aut r12, lr, sp
420; R7-ABI-NEXT:    bx lr
421;
422; R11-LABEL: test3:
423; R11:         .cfi_startproc
424; R11-NEXT:  @ %bb.0: @ %entry
425; R11-NEXT:    pac r12, lr, sp
426; R11-NEXT:    .save {r4, r5, r6, r7, r11, ra_auth_code, lr}
427; R11-NEXT:    push.w {r4, r5, r6, r7, r11, r12, lr}
428; R11-NEXT:    .cfi_def_cfa_offset 28
429; R11-NEXT:    .cfi_offset lr, -4
430; R11-NEXT:    .cfi_offset ra_auth_code, -8
431; R11-NEXT:    .cfi_offset r11, -12
432; R11-NEXT:    .cfi_offset r7, -16
433; R11-NEXT:    .cfi_offset r6, -20
434; R11-NEXT:    .cfi_offset r5, -24
435; R11-NEXT:    .cfi_offset r4, -28
436; R11-NEXT:    .setfp r11, sp, #16
437; R11-NEXT:    add.w r11, sp, #16
438; R11-NEXT:    .cfi_def_cfa r11, 12
439; R11-NEXT:    .pad #4
440; R11-NEXT:    sub sp, #4
441; R11-NEXT:    cmp r0, #0
442; R11-NEXT:    mov r5, r2
443; R11-NEXT:    mov r4, r1
444; R11-NEXT:    it ne
445; R11-NEXT:    blne knr
446; R11-NEXT:    adds r0, r5, #7
447; R11-NEXT:    bic r0, r0, #7
448; R11-NEXT:    sub.w r0, sp, r0
449; R11-NEXT:    mov sp, r0
450; R11-NEXT:    bl take_ptr
451; R11-NEXT:    mov r0, r4
452; R11-NEXT:    movs r1, #0
453; R11-NEXT:    bl __aeabi_fcmpeq
454; R11-NEXT:    cmp r0, #0
455; R11-NEXT:    it eq
456; R11-NEXT:    bleq knr
457; R11-NEXT:    sub.w r4, r11, #16
458; R11-NEXT:    mov sp, r4
459; R11-NEXT:    pop.w {r4, r5, r6, r7, r11, r12, lr}
460; R11-NEXT:    aut r12, lr, sp
461; R11-NEXT:    bx lr
462;
463; R11-RES-LABEL: test3:
464; R11-RES:         .cfi_startproc
465; R11-RES-NEXT:  @ %bb.0: @ %entry
466; R11-RES-NEXT:    pac r12, lr, sp
467; R11-RES-NEXT:    .save {r4, r5, r6, r7, ra_auth_code}
468; R11-RES-NEXT:    push.w {r4, r5, r6, r7, r12}
469; R11-RES-NEXT:    .cfi_def_cfa_offset 20
470; R11-RES-NEXT:    .cfi_offset ra_auth_code, -4
471; R11-RES-NEXT:    .cfi_offset r7, -8
472; R11-RES-NEXT:    .cfi_offset r6, -12
473; R11-RES-NEXT:    .cfi_offset r5, -16
474; R11-RES-NEXT:    .cfi_offset r4, -20
475; R11-RES-NEXT:    .save {r11, lr}
476; R11-RES-NEXT:    push.w {r11, lr}
477; R11-RES-NEXT:    .cfi_def_cfa_offset 28
478; R11-RES-NEXT:    .cfi_offset lr, -24
479; R11-RES-NEXT:    .cfi_offset r11, -28
480; R11-RES-NEXT:    .setfp r11, sp
481; R11-RES-NEXT:    mov r11, sp
482; R11-RES-NEXT:    .cfi_def_cfa_register r11
483; R11-RES-NEXT:    .pad #4
484; R11-RES-NEXT:    sub sp, #4
485; R11-RES-NEXT:    cmp r0, #0
486; R11-RES-NEXT:    mov r5, r2
487; R11-RES-NEXT:    mov r4, r1
488; R11-RES-NEXT:    it ne
489; R11-RES-NEXT:    blne knr
490; R11-RES-NEXT:    adds r0, r5, #7
491; R11-RES-NEXT:    bic r0, r0, #7
492; R11-RES-NEXT:    sub.w r0, sp, r0
493; R11-RES-NEXT:    mov sp, r0
494; R11-RES-NEXT:    bl take_ptr
495; R11-RES-NEXT:    mov r0, r4
496; R11-RES-NEXT:    movs r1, #0
497; R11-RES-NEXT:    bl __aeabi_fcmpeq
498; R11-RES-NEXT:    cmp r0, #0
499; R11-RES-NEXT:    it eq
500; R11-RES-NEXT:    bleq knr
501; R11-RES-NEXT:    mov sp, r11
502; R11-RES-NEXT:    pop.w {r11, lr}
503; R11-RES-NEXT:    pop.w {r4, r5, r6, r7, r12}
504; R11-RES-NEXT:    aut r12, lr, sp
505; R11-RES-NEXT:    bx lr
506;
507; R11-ABI-LABEL: test3:
508; R11-ABI:         .cfi_startproc
509; R11-ABI-NEXT:  @ %bb.0: @ %entry
510; R11-ABI-NEXT:    pac r12, lr, sp
511; R11-ABI-NEXT:    .save {r4, r5, r6, r7, ra_auth_code}
512; R11-ABI-NEXT:    push.w {r4, r5, r6, r7, r12}
513; R11-ABI-NEXT:    .cfi_def_cfa_offset 20
514; R11-ABI-NEXT:    .cfi_offset ra_auth_code, -4
515; R11-ABI-NEXT:    .cfi_offset r7, -8
516; R11-ABI-NEXT:    .cfi_offset r6, -12
517; R11-ABI-NEXT:    .cfi_offset r5, -16
518; R11-ABI-NEXT:    .cfi_offset r4, -20
519; R11-ABI-NEXT:    .save {r11, lr}
520; R11-ABI-NEXT:    push.w {r11, lr}
521; R11-ABI-NEXT:    .cfi_def_cfa_offset 28
522; R11-ABI-NEXT:    .cfi_offset lr, -24
523; R11-ABI-NEXT:    .cfi_offset r11, -28
524; R11-ABI-NEXT:    .setfp r11, sp
525; R11-ABI-NEXT:    mov r11, sp
526; R11-ABI-NEXT:    .cfi_def_cfa_register r11
527; R11-ABI-NEXT:    .pad #4
528; R11-ABI-NEXT:    sub sp, #4
529; R11-ABI-NEXT:    cmp r0, #0
530; R11-ABI-NEXT:    mov r5, r2
531; R11-ABI-NEXT:    mov r4, r1
532; R11-ABI-NEXT:    it ne
533; R11-ABI-NEXT:    blne knr
534; R11-ABI-NEXT:    adds r0, r5, #7
535; R11-ABI-NEXT:    bic r0, r0, #7
536; R11-ABI-NEXT:    sub.w r0, sp, r0
537; R11-ABI-NEXT:    mov sp, r0
538; R11-ABI-NEXT:    bl take_ptr
539; R11-ABI-NEXT:    mov r0, r4
540; R11-ABI-NEXT:    movs r1, #0
541; R11-ABI-NEXT:    bl __aeabi_fcmpeq
542; R11-ABI-NEXT:    cmp r0, #0
543; R11-ABI-NEXT:    it eq
544; R11-ABI-NEXT:    bleq knr
545; R11-ABI-NEXT:    mov sp, r11
546; R11-ABI-NEXT:    pop.w {r11, lr}
547; R11-ABI-NEXT:    pop.w {r4, r5, r6, r7, r12}
548; R11-ABI-NEXT:    aut r12, lr, sp
549; R11-ABI-NEXT:    bx lr
550entry:
551  %tobool.not = icmp eq i32 %c, 0
552  br i1 %tobool.not, label %if.end, label %if.then
553
554if.then:                                          ; preds = %entry
555  tail call void @knr()
556  br label %if.end
557
558if.end:                                           ; preds = %if.then, %entry
559  %0 = alloca i8, i32 %z, align 8
560  call void @take_ptr(ptr noundef nonnull %0)
561  %tobool1 = fcmp une float %e, 0.000000e+00
562  br i1 %tobool1, label %if.then2, label %if.end3
563
564if.then2:                                         ; preds = %if.end
565  call void @knr()
566  br label %if.end3
567
568if.end3:                                          ; preds = %if.then2, %if.end
569  ret void
570}
571
572declare void @knr(...)
573declare void @take_ptr(ptr noundef)
574