[llvm] r330183 - Fix incorrect choice of callee-saved registers save/restore points
Momchil Velikov via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 17 01:37:38 PDT 2018
Author: chill
Date: Tue Apr 17 01:37:38 2018
New Revision: 330183
URL: http://llvm.org/viewvc/llvm-project?rev=330183&view=rev
Log:
Fix incorrect choice of callee-saved registers save/restore points
Make the shrink wrapping pass pay attention to uses/defs of the stack pointer.
Differential revision: https://reviews.llvm.org/D45524
Modified:
llvm/trunk/lib/CodeGen/ShrinkWrap.cpp
Modified: llvm/trunk/lib/CodeGen/ShrinkWrap.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ShrinkWrap.cpp?rev=330183&r1=330182&r2=330183&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/ShrinkWrap.cpp (original)
+++ llvm/trunk/lib/CodeGen/ShrinkWrap.cpp Tue Apr 17 01:37:38 2018
@@ -68,6 +68,7 @@
#include "llvm/CodeGen/RegisterScavenging.h"
#include "llvm/CodeGen/TargetFrameLowering.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
+#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/Attributes.h"
@@ -138,6 +139,9 @@ class ShrinkWrap : public MachineFunctio
/// Current opcode for frame destroy.
unsigned FrameDestroyOpcode;
+ /// Stack pointer register, used by llvm.{savestack,restorestack}
+ unsigned SP;
+
/// Entry block.
const MachineBasicBlock *Entry;
@@ -186,9 +190,11 @@ class ShrinkWrap : public MachineFunctio
MBFI = &getAnalysis<MachineBlockFrequencyInfo>();
MLI = &getAnalysis<MachineLoopInfo>();
EntryFreq = MBFI->getEntryFreq();
- const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
+ const TargetSubtargetInfo &Subtarget = MF.getSubtarget();
+ const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
FrameSetupOpcode = TII.getCallFrameSetupOpcode();
FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
+ SP = Subtarget.getTargetLowering()->getStackPointerRegisterToSaveRestore();
Entry = &MF.front();
CurrentCSRs.clear();
MachineFunc = &MF;
@@ -262,7 +268,13 @@ bool ShrinkWrap::useOrDefCSROrFI(const M
continue;
assert(TargetRegisterInfo::isPhysicalRegister(PhysReg) &&
"Unallocated register?!");
- UseOrDefCSR = RCI.getLastCalleeSavedAlias(PhysReg);
+ // The stack pointer is not normally described as a callee-saved register
+ // in calling convention definitions, so we need to watch for it
+ // separately. An SP mentioned by a call instruction, we can ignore,
+ // though, as it's harmless and we do not want to effectively disable tail
+ // calls by forcing the restore point to post-dominate them.
+ UseOrDefCSR = (!MI.isCall() && PhysReg == SP) ||
+ RCI.getLastCalleeSavedAlias(PhysReg);
} else if (MO.isRegMask()) {
// Check if this regmask clobbers any of the CSRs.
for (unsigned Reg : getCurrentCSRs(RS)) {
More information about the llvm-commits
mailing list