Skip to content

Commit 8f4b295

Browse files
author
git apple-llvm automerger
committed
Merge commit '42f628c84269' from llvm.org/master into apple/main
2 parents 1f7a118 + 42f628c commit 8f4b295

File tree

3 files changed

+93
-48
lines changed

3 files changed

+93
-48
lines changed

llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -488,15 +488,6 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF,
488488
MFFrame.setStackSize(StackSize);
489489

490490
if (StackSize) {
491-
// Determine if we want to store a backchain.
492-
bool StoreBackchain = MF.getFunction().hasFnAttribute("backchain");
493-
494-
// If we need backchain, save current stack pointer. R1 is free at this
495-
// point.
496-
if (StoreBackchain)
497-
BuildMI(MBB, MBBI, DL, ZII->get(SystemZ::LGR))
498-
.addReg(SystemZ::R1D, RegState::Define).addReg(SystemZ::R15D);
499-
500491
// Allocate StackSize bytes.
501492
int64_t Delta = -int64_t(StackSize);
502493
const unsigned ProbeSize = TLI.getStackProbeSize(MF);
@@ -512,18 +503,23 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF,
512503
.addImm(StackSize);
513504
}
514505
else {
506+
bool StoreBackchain = MF.getFunction().hasFnAttribute("backchain");
507+
// If we need backchain, save current stack pointer. R1 is free at
508+
// this point.
509+
if (StoreBackchain)
510+
BuildMI(MBB, MBBI, DL, ZII->get(SystemZ::LGR))
511+
.addReg(SystemZ::R1D, RegState::Define).addReg(SystemZ::R15D);
515512
emitIncrement(MBB, MBBI, DL, SystemZ::R15D, Delta, ZII);
516513
buildCFAOffs(MBB, MBBI, DL, SPOffsetFromCFA + Delta, ZII);
514+
if (StoreBackchain) {
515+
// The back chain is stored topmost with packed-stack.
516+
int Offset = usePackedStack(MF) ? SystemZMC::CallFrameSize - 8 : 0;
517+
BuildMI(MBB, MBBI, DL, ZII->get(SystemZ::STG))
518+
.addReg(SystemZ::R1D, RegState::Kill).addReg(SystemZ::R15D)
519+
.addImm(Offset).addReg(0);
520+
}
517521
}
518522
SPOffsetFromCFA += Delta;
519-
520-
if (StoreBackchain) {
521-
// The back chain is stored topmost with packed-stack.
522-
int Offset = usePackedStack(MF) ? SystemZMC::CallFrameSize - 8 : 0;
523-
BuildMI(MBB, MBBI, DL, ZII->get(SystemZ::STG))
524-
.addReg(SystemZ::R1D, RegState::Kill).addReg(SystemZ::R15D)
525-
.addImm(Offset).addReg(0);
526-
}
527523
}
528524

529525
if (HasFP) {
@@ -668,6 +664,13 @@ void SystemZFrameLowering::inlineStackProbe(MachineFunction &MF,
668664
.addMemOperand(MMO);
669665
};
670666

667+
bool StoreBackchain = MF.getFunction().hasFnAttribute("backchain");
668+
if (StoreBackchain)
669+
BuildMI(*MBB, MBBI, DL, ZII->get(SystemZ::LGR))
670+
.addReg(SystemZ::R1D, RegState::Define).addReg(SystemZ::R15D);
671+
672+
MachineBasicBlock *DoneMBB = nullptr;
673+
MachineBasicBlock *LoopMBB = nullptr;
671674
if (NumFullBlocks < 3) {
672675
// Emit unrolled probe statements.
673676
for (unsigned int i = 0; i < NumFullBlocks; i++)
@@ -677,38 +680,49 @@ void SystemZFrameLowering::inlineStackProbe(MachineFunction &MF,
677680
uint64_t LoopAlloc = ProbeSize * NumFullBlocks;
678681
SPOffsetFromCFA -= LoopAlloc;
679682

680-
BuildMI(*MBB, MBBI, DL, ZII->get(SystemZ::LGR), SystemZ::R1D)
683+
// Use R0D to hold the exit value.
684+
BuildMI(*MBB, MBBI, DL, ZII->get(SystemZ::LGR), SystemZ::R0D)
681685
.addReg(SystemZ::R15D);
682-
buildDefCFAReg(*MBB, MBBI, DL, SystemZ::R1D, ZII);
683-
emitIncrement(*MBB, MBBI, DL, SystemZ::R1D, -int64_t(LoopAlloc), ZII);
686+
buildDefCFAReg(*MBB, MBBI, DL, SystemZ::R0D, ZII);
687+
emitIncrement(*MBB, MBBI, DL, SystemZ::R0D, -int64_t(LoopAlloc), ZII);
684688
buildCFAOffs(*MBB, MBBI, DL, -int64_t(SystemZMC::CallFrameSize + LoopAlloc),
685689
ZII);
686690

687-
MachineBasicBlock *DoneMBB = SystemZ::splitBlockBefore(MBBI, MBB);
688-
MachineBasicBlock *LoopMBB = SystemZ::emitBlockAfter(MBB);
691+
DoneMBB = SystemZ::splitBlockBefore(MBBI, MBB);
692+
LoopMBB = SystemZ::emitBlockAfter(MBB);
689693
MBB->addSuccessor(LoopMBB);
690694
LoopMBB->addSuccessor(LoopMBB);
691695
LoopMBB->addSuccessor(DoneMBB);
692696

693697
MBB = LoopMBB;
694698
allocateAndProbe(*MBB, MBB->end(), ProbeSize, false/*EmitCFI*/);
695699
BuildMI(*MBB, MBB->end(), DL, ZII->get(SystemZ::CLGR))
696-
.addReg(SystemZ::R15D).addReg(SystemZ::R1D);
700+
.addReg(SystemZ::R15D).addReg(SystemZ::R0D);
697701
BuildMI(*MBB, MBB->end(), DL, ZII->get(SystemZ::BRC))
698702
.addImm(SystemZ::CCMASK_ICMP).addImm(SystemZ::CCMASK_CMP_GT).addMBB(MBB);
699703

700704
MBB = DoneMBB;
701705
MBBI = DoneMBB->begin();
702706
buildDefCFAReg(*MBB, MBBI, DL, SystemZ::R15D, ZII);
703-
704-
recomputeLiveIns(*DoneMBB);
705-
recomputeLiveIns(*LoopMBB);
706707
}
707708

708709
if (Residual)
709710
allocateAndProbe(*MBB, MBBI, Residual, true/*EmitCFI*/);
710711

712+
if (StoreBackchain) {
713+
// The back chain is stored topmost with packed-stack.
714+
int Offset = usePackedStack(MF) ? SystemZMC::CallFrameSize - 8 : 0;
715+
BuildMI(*MBB, MBBI, DL, ZII->get(SystemZ::STG))
716+
.addReg(SystemZ::R1D, RegState::Kill).addReg(SystemZ::R15D)
717+
.addImm(Offset).addReg(0);
718+
}
719+
711720
StackAllocMI->eraseFromParent();
721+
if (DoneMBB != nullptr) {
722+
// Compute the live-in lists for the new blocks.
723+
recomputeLiveIns(*DoneMBB);
724+
recomputeLiveIns(*LoopMBB);
725+
}
712726
}
713727

714728
bool SystemZFrameLowering::hasFP(const MachineFunction &MF) const {

llvm/test/CodeGen/SystemZ/stack-clash-dynamic-alloca.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
2+
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -verify-machineinstrs | FileCheck %s
33

44
define i32 @fun0(i32 %n) #0 {
55
; CHECK-LABEL: fun0:
@@ -92,14 +92,14 @@ define i32 @fun2(i32 %n) #0 "stack-probe-size"="4" {
9292
; CHECK-NEXT: stmg %r11, %r15, 88(%r15)
9393
; CHECK-NEXT: .cfi_offset %r11, -72
9494
; CHECK-NEXT: .cfi_offset %r15, -40
95-
; CHECK-NEXT: lgr %r1, %r15
96-
; CHECK-NEXT: .cfi_def_cfa_register %r1
97-
; CHECK-NEXT: aghi %r1, -160
95+
; CHECK-NEXT: lgr %r0, %r15
96+
; CHECK-NEXT: .cfi_def_cfa_register %r0
97+
; CHECK-NEXT: aghi %r0, -160
9898
; CHECK-NEXT: .cfi_def_cfa_offset 320
9999
; CHECK-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
100100
; CHECK-NEXT: aghi %r15, -8
101101
; CHECK-NEXT: cg %r0, 0(%r15)
102-
; CHECK-NEXT: clgrjh %r15, %r1, .LBB2_1
102+
; CHECK-NEXT: clgrjh %r15, %r0, .LBB2_1
103103
; CHECK-NEXT: # %bb.2:
104104
; CHECK-NEXT: .cfi_def_cfa_register %r15
105105
; CHECK-NEXT: lgr %r11, %r15

llvm/test/CodeGen/SystemZ/stack-clash-protection.ll

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -O3 | FileCheck %s
2+
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -O3 -verify-machineinstrs | FileCheck %s
33
;
44
; Test stack clash protection probing for static allocas.
55

@@ -48,14 +48,14 @@ define i32 @fun1() #0 {
4848
define i32 @fun2() #0 {
4949
; CHECK-LABEL: fun2:
5050
; CHECK: # %bb.0:
51-
; CHECK-NEXT: lgr %r1, %r15
52-
; CHECK-NEXT: .cfi_def_cfa_register %r1
53-
; CHECK-NEXT: agfi %r1, -69632
51+
; CHECK-NEXT: lgr %r0, %r15
52+
; CHECK-NEXT: .cfi_def_cfa_register %r0
53+
; CHECK-NEXT: agfi %r0, -69632
5454
; CHECK-NEXT: .cfi_def_cfa_offset 69792
5555
; CHECK-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
5656
; CHECK-NEXT: aghi %r15, -4096
5757
; CHECK-NEXT: cg %r0, 4088(%r15)
58-
; CHECK-NEXT: clgrjh %r15, %r1, .LBB2_1
58+
; CHECK-NEXT: clgrjh %r15, %r0, .LBB2_1
5959
; CHECK-NEXT: # %bb.2:
6060
; CHECK-NEXT: .cfi_def_cfa_register %r15
6161
; CHECK-NEXT: aghi %r15, -2544
@@ -81,15 +81,15 @@ define i32 @fun2() #0 {
8181
define void @fun3() #0 {
8282
; CHECK-LABEL: fun3:
8383
; CHECK: # %bb.0: # %entry
84-
; CHECK-NEXT: lgr %r1, %r15
85-
; CHECK-NEXT: .cfi_def_cfa_register %r1
86-
; CHECK-NEXT: aghi %r1, -28672
84+
; CHECK-NEXT: lgr %r0, %r15
85+
; CHECK-NEXT: .cfi_def_cfa_register %r0
86+
; CHECK-NEXT: aghi %r0, -28672
8787
; CHECK-NEXT: .cfi_def_cfa_offset 28832
8888
; CHECK-NEXT: .LBB3_1: # %entry
8989
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
9090
; CHECK-NEXT: aghi %r15, -4096
9191
; CHECK-NEXT: cg %r0, 4088(%r15)
92-
; CHECK-NEXT: clgrjh %r15, %r1, .LBB3_1
92+
; CHECK-NEXT: clgrjh %r15, %r0, .LBB3_1
9393
; CHECK-NEXT: # %bb.2: # %entry
9494
; CHECK-NEXT: .cfi_def_cfa_register %r15
9595
; CHECK-NEXT: mvhi 180(%r15), 0
@@ -110,15 +110,15 @@ entry:
110110
define void @fun4() #0 "stack-probe-size"="8192" {
111111
; CHECK-LABEL: fun4:
112112
; CHECK: # %bb.0: # %entry
113-
; CHECK-NEXT: lgr %r1, %r15
114-
; CHECK-NEXT: .cfi_def_cfa_register %r1
115-
; CHECK-NEXT: aghi %r1, -24576
113+
; CHECK-NEXT: lgr %r0, %r15
114+
; CHECK-NEXT: .cfi_def_cfa_register %r0
115+
; CHECK-NEXT: aghi %r0, -24576
116116
; CHECK-NEXT: .cfi_def_cfa_offset 24736
117117
; CHECK-NEXT: .LBB4_1: # %entry
118118
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
119119
; CHECK-NEXT: aghi %r15, -8192
120120
; CHECK-NEXT: cg %r0, 8184(%r15)
121-
; CHECK-NEXT: clgrjh %r15, %r1, .LBB4_1
121+
; CHECK-NEXT: clgrjh %r15, %r0, .LBB4_1
122122
; CHECK-NEXT: # %bb.2: # %entry
123123
; CHECK-NEXT: .cfi_def_cfa_register %r15
124124
; CHECK-NEXT: aghi %r15, -7608
@@ -166,15 +166,15 @@ entry:
166166
define void @fun6() #0 "stack-probe-size"="5" {
167167
; CHECK-LABEL: fun6:
168168
; CHECK: # %bb.0: # %entry
169-
; CHECK-NEXT: lgr %r1, %r15
170-
; CHECK-NEXT: .cfi_def_cfa_register %r1
171-
; CHECK-NEXT: aghi %r1, -4184
169+
; CHECK-NEXT: lgr %r0, %r15
170+
; CHECK-NEXT: .cfi_def_cfa_register %r0
171+
; CHECK-NEXT: aghi %r0, -4184
172172
; CHECK-NEXT: .cfi_def_cfa_offset 4344
173173
; CHECK-NEXT: .LBB6_1: # %entry
174174
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
175175
; CHECK-NEXT: aghi %r15, -8
176176
; CHECK-NEXT: cg %r0, 0(%r15)
177-
; CHECK-NEXT: clgrjh %r15, %r1, .LBB6_1
177+
; CHECK-NEXT: clgrjh %r15, %r0, .LBB6_1
178178
; CHECK-NEXT: # %bb.2: # %entry
179179
; CHECK-NEXT: .cfi_def_cfa_register %r15
180180
; CHECK-NEXT: mvhi 180(%r15), 0
@@ -237,6 +237,37 @@ define i32 @fun8() #0 {
237237
ret i32 %c
238238
}
239239

240+
define void @fun9() #0 "backchain" {
241+
; CHECK-LABEL: fun9:
242+
; CHECK: # %bb.0: # %entry
243+
; CHECK-NEXT: lgr %r1, %r15
244+
; CHECK-NEXT: lgr %r0, %r15
245+
; CHECK-NEXT: .cfi_def_cfa_register %r0
246+
; CHECK-NEXT: aghi %r0, -28672
247+
; CHECK-NEXT: .cfi_def_cfa_offset 28832
248+
; CHECK-NEXT: .LBB9_1: # %entry
249+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
250+
; CHECK-NEXT: aghi %r15, -4096
251+
; CHECK-NEXT: cg %r0, 4088(%r15)
252+
; CHECK-NEXT: clgrjh %r15, %r0, .LBB9_1
253+
; CHECK-NEXT: # %bb.2: # %entry
254+
; CHECK-NEXT: .cfi_def_cfa_register %r15
255+
; CHECK-NEXT: stg %r1, 0(%r15)
256+
; CHECK-NEXT: mvhi 180(%r15), 0
257+
; CHECK-NEXT: l %r0, 180(%r15)
258+
; CHECK-NEXT: aghi %r15, 28672
259+
; CHECK-NEXT: br %r14
260+
entry:
261+
%stack = alloca [7122 x i32], align 4
262+
%i = alloca i32, align 4
263+
%0 = bitcast [7122 x i32]* %stack to i8*
264+
%i.0.i.0..sroa_cast = bitcast i32* %i to i8*
265+
store volatile i32 0, i32* %i, align 4
266+
%i.0.i.0.6 = load volatile i32, i32* %i, align 4
267+
ret void
268+
}
269+
270+
240271
declare i32 @foo()
241272
attributes #0 = { "probe-stack"="inline-asm" }
242273

0 commit comments

Comments
 (0)