Skip to content

Commit 1431150

Browse files
committed
Push/pop must also be split when frame pointer is reserved
1 parent bb8af0f commit 1431150

File tree

2 files changed

+172
-4
lines changed

2 files changed

+172
-4
lines changed

llvm/lib/Target/ARM/ARMSubtarget.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ ARMSubtarget::getPushPopSplitVariation(const MachineFunction &MF) const {
501501
// previous frame pointer (R7) and return address (LR) are adjacent on the
502502
// stack, to form a valid frame record.
503503
if (getFramePointerReg() == ARM::R7 &&
504-
MF.getTarget().Options.DisableFramePointerElim(MF))
504+
MF.getTarget().Options.FramePointerIsReserved(MF))
505505
return SplitR7;
506506

507507
// Returns SplitR11WindowsSEH when the stack pointer needs to be
@@ -519,7 +519,7 @@ ARMSubtarget::getPushPopSplitVariation(const MachineFunction &MF) const {
519519
// requiring R12 to be on the stack.
520520
if (MF.getInfo<ARMFunctionInfo>()->shouldSignReturnAddress() &&
521521
getFramePointerReg() == ARM::R11 &&
522-
MF.getTarget().Options.DisableFramePointerElim(MF))
522+
MF.getTarget().Options.FramePointerIsReserved(MF))
523523
return SplitR11AAPCSSignRA;
524524
return NoSplit;
525525
}

llvm/test/CodeGen/Thumb2/pacbti-m-frame-chain.ll

Lines changed: 170 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
22
; 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
34
; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=all | FileCheck %s --check-prefix=R7-ABI
4-
; 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
5-
; 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
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
68

79
; int test1() {
810
; return 0;
@@ -15,6 +17,13 @@ define i32 @test1() "sign-return-address"="non-leaf" {
1517
; R7-NEXT: movs r0, #0
1618
; R7-NEXT: bx lr
1719
;
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+
;
1827
; R7-ABI-LABEL: test1:
1928
; R7-ABI: .cfi_sections .debug_frame
2029
; R7-ABI-NEXT: .cfi_startproc
@@ -44,6 +53,13 @@ define i32 @test1() "sign-return-address"="non-leaf" {
4453
; R11-NEXT: movs r0, #0
4554
; R11-NEXT: bx lr
4655
;
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+
;
4763
; R11-ABI-LABEL: test1:
4864
; R11-ABI: .cfi_sections .debug_frame
4965
; R11-ABI-NEXT: .cfi_startproc
@@ -104,6 +120,38 @@ define dso_local void @test2(i32 noundef %n) "sign-return-address"="non-leaf" {
104120
; R7-NEXT: aut r12, lr, sp
105121
; R7-NEXT: bx lr
106122
;
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+
;
107155
; R7-ABI-LABEL: test2:
108156
; R7-ABI: .cfi_startproc
109157
; R7-ABI-NEXT: @ %bb.0: @ %entry
@@ -165,6 +213,38 @@ define dso_local void @test2(i32 noundef %n) "sign-return-address"="non-leaf" {
165213
; R11-NEXT: aut r12, lr, sp
166214
; R11-NEXT: bx lr
167215
;
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+
;
168248
; R11-ABI-LABEL: test2:
169249
; R11-ABI: .cfi_startproc
170250
; R11-ABI-NEXT: @ %bb.0: @ %entry
@@ -251,6 +331,50 @@ define void @test3(i32 noundef %c, float noundef %e, i32 noundef %z) "sign-retur
251331
; R7-NEXT: aut r12, lr, sp
252332
; R7-NEXT: bx lr
253333
;
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+
;
254378
; R7-ABI-LABEL: test3:
255379
; R7-ABI: .cfi_startproc
256380
; R7-ABI-NEXT: @ %bb.0: @ %entry
@@ -336,6 +460,50 @@ define void @test3(i32 noundef %c, float noundef %e, i32 noundef %z) "sign-retur
336460
; R11-NEXT: aut r12, lr, sp
337461
; R11-NEXT: bx lr
338462
;
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+
;
339507
; R11-ABI-LABEL: test3:
340508
; R11-ABI: .cfi_startproc
341509
; R11-ABI-NEXT: @ %bb.0: @ %entry

0 commit comments

Comments
 (0)