Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 10 Sep 2016 15:44:01 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r305681 - projects/clang390-import/contrib/llvm/lib/Target/PowerPC
Message-ID:  <201609101544.u8AFi16F097436@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 &&



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201609101544.u8AFi16F097436>