diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-06-15 05:35:14 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-06-15 05:35:14 +0000 |
commit | 0272be206a0d1369736dfee456bfa7430ccd5e02 (patch) | |
tree | 8ee9fd669e93d8a2c7b16053d8ff5f28fb317676 /llvm/lib/CodeGen/PrologEpilogInserter.cpp | |
parent | bc85ec86560649dc9eeb923dc45ecdedb3f54bbd (diff) | |
download | llvm-0272be206a0d1369736dfee456bfa7430ccd5e02.zip llvm-0272be206a0d1369736dfee456bfa7430ccd5e02.tar.gz llvm-0272be206a0d1369736dfee456bfa7430ccd5e02.tar.bz2 |
Don't force SP-relative addressing for statepoints
Summary:
... when the offset is not statically known.
Prioritize addresses relative to the stack pointer in the stackmap, but
fallback gracefully to other modes of addressing if the offset to the
stack pointer is not a known constant.
Patch by Oscar Blumberg!
Reviewers: sanjoy
Subscribers: llvm-commits, majnemer, rnk, sanjoy, thanm
Differential Revision: http://reviews.llvm.org/D21259
llvm-svn: 272756
Diffstat (limited to 'llvm/lib/CodeGen/PrologEpilogInserter.cpp')
-rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index bd7f34b..33935c42 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -1094,9 +1094,16 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn, "DBG_VALUE machine instruction"); unsigned Reg; MachineOperand &Offset = MI->getOperand(i + 1); - const unsigned refOffset = - TFI->getFrameIndexReferenceFromSP(Fn, MI->getOperand(i).getIndex(), - Reg); + int refOffset; + // First try to get an offset relative to SP. If that's not + // possible use whatever the target usually uses. + auto SPOffset = TFI->getFrameIndexReferenceFromSP( + Fn, MI->getOperand(i).getIndex(), Reg, /*AllowSPAdjustment*/ false); + if (SPOffset) + refOffset = *SPOffset; + else + refOffset = TFI->getFrameIndexReference( + Fn, MI->getOperand(i).getIndex(), Reg); Offset.setImm(Offset.getImm() + refOffset); MI->getOperand(i).ChangeToRegister(Reg, false /*isDef*/); |