diff options
author | Kai Luo <lkail@cn.ibm.com> | 2022-06-06 09:08:02 +0000 |
---|---|---|
committer | Kai Luo <lkail@cn.ibm.com> | 2022-06-06 09:08:28 +0000 |
commit | 5018a5dcbe70a9e2e39341762ec0ca0ad76d28b4 (patch) | |
tree | 27e72cab4a7ed85d1dd5fe77b5b57e9c21d2771f /llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp | |
parent | eaf48dd9b079c005d92ed9ef858f12bc452e71ef (diff) | |
download | llvm-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.cpp | 15 |
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: |