svn commit: r305681 - projects/clang390-import/contrib/llvm/lib/Target/PowerPC
Dimitry Andric
dim at FreeBSD.org
Sat Sep 10 15:44:02 UTC 2016
Author: dim
Date: Sat Sep 10 15:44:00 2016
New Revision: 305681
URL: https://svnweb.freebsd.org/changeset/base/305681
Log:
Pull in r280188 from upstream llvm trunk (by Hal Finkel):
[PowerPC] Don't spill the frame pointer twice
When a function contains something, such as inline asm, which
explicitly clobbers the register used as the frame pointer, don't
spill it twice. If we need a frame pointer, it will be saved/restored
in the prologue/epilogue code. Explicitly spilling it again will
reuse the same spill slot used by the prologue/epilogue code, thus
clobbering the saved value. The same applies to the base-pointer or
PIC-base register.
Partially fixes PR26856. Thanks to Ulrich for his analysis and the
small inline-asm reproducer.
Modified:
projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
Modified: projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
==============================================================================
--- projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp Sat Sep 10 15:38:46 2016 (r305680)
+++ projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp Sat Sep 10 15:44:00 2016 (r305681)
@@ -1420,6 +1420,17 @@ void PPCFrameLowering::determineCalleeSa
FI->setPICBasePointerSaveIndex(PBPSI);
}
+ // Make sure we don't explicitly spill r31, because, for example, we have
+ // some inline asm which explicity clobbers it, when we otherwise have a
+ // frame pointer and are using r31's spill slot for the prologue/epilogue
+ // code. Same goes for the base pointer and the PIC base register.
+ if (needsFP(MF))
+ SavedRegs.reset(isPPC64 ? PPC::X31 : PPC::R31);
+ if (RegInfo->hasBasePointer(MF))
+ SavedRegs.reset(RegInfo->getBaseRegister(MF));
+ if (FI->usesPICBase())
+ SavedRegs.reset(PPC::R30);
+
// Reserve stack space to move the linkage area to in case of a tail call.
int TCSPDelta = 0;
if (MF.getTarget().Options.GuaranteedTailCallOpt &&
More information about the svn-src-projects
mailing list