aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
diff options
context:
space:
mode:
authorKai Luo <lkail@cn.ibm.com>2022-06-06 09:08:02 +0000
committerKai Luo <lkail@cn.ibm.com>2022-06-06 09:08:28 +0000
commit5018a5dcbe70a9e2e39341762ec0ca0ad76d28b4 (patch)
tree27e72cab4a7ed85d1dd5fe77b5b57e9c21d2771f /llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
parenteaf48dd9b079c005d92ed9ef858f12bc452e71ef (diff)
downloadllvm-5018a5dcbe70a9e2e39341762ec0ca0ad76d28b4.zip
llvm-5018a5dcbe70a9e2e39341762ec0ca0ad76d28b4.tar.gz
llvm-5018a5dcbe70a9e2e39341762ec0ca0ad76d28b4.tar.bz2
[PowerPC] Support huge frame size for PPC64
Support allocation of huge stack frame(>2g) on PPC64. For ELFv2 ABI on Linux, quoted from the spec 2.2.3.1 General Stack Frame Requirements > There is no maximum stack frame size defined. On AIX, XL allows such huge frame. Reviewed By: #powerpc, nemanjai Differential Revision: https://reviews.llvm.org/D107886
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
index ddcee1a..39bb005 100644
--- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
@@ -1477,7 +1477,7 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
OpC != TargetOpcode::PATCHPOINT && !ImmToIdxMap.count(OpC);
// Now add the frame object offset to the offset from r1.
- int Offset = MFI.getObjectOffset(FrameIndex);
+ int64_t Offset = MFI.getObjectOffset(FrameIndex);
Offset += MI.getOperand(OffsetOperandNo).getImm();
// If we're not using a Frame Pointer that has been set to the value of the
@@ -1537,13 +1537,16 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
// Insert a set of rA with the full offset value before the ld, st, or add
if (isInt<16>(Offset))
BuildMI(MBB, II, dl, TII.get(is64Bit ? PPC::LI8 : PPC::LI), SReg)
- .addImm(Offset);
- else {
+ .addImm(Offset);
+ else if (isInt<32>(Offset)) {
BuildMI(MBB, II, dl, TII.get(is64Bit ? PPC::LIS8 : PPC::LIS), SRegHi)
- .addImm(Offset >> 16);
+ .addImm(Offset >> 16);
BuildMI(MBB, II, dl, TII.get(is64Bit ? PPC::ORI8 : PPC::ORI), SReg)
- .addReg(SRegHi, RegState::Kill)
- .addImm(Offset);
+ .addReg(SRegHi, RegState::Kill)
+ .addImm(Offset);
+ } else {
+ assert(is64Bit && "Huge stack is only supported on PPC64");
+ TII.materializeImmPostRA(MBB, II, dl, SReg, Offset);
}
// Convert into indexed form of the instruction: