[llvm] r317551 - [X86] Don't clobber reserved registers with stack adjustments

Bjorn Steinbrink via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 7 00:50:22 PST 2017


Author: bsteinbr
Date: Tue Nov  7 00:50:21 2017
New Revision: 317551

URL: http://llvm.org/viewvc/llvm-project?rev=317551&view=rev
Log:
[X86] Don't clobber reserved registers with stack adjustments

Summary:
Calls using invoke in funclet based functions are assumed to clobber
all registers, which causes the stack adjustment using pops to consider
all registers not defined by the call to be undefined, which can
unfortunately include the base pointer, if one is needed.

To prevent this (and possibly other hazards), skip reserved registers
when looking for candidate registers.

This fixes issue #45034 in the Rust compiler.

Reviewers: mkuper

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D39636

Added:
    llvm/trunk/test/CodeGen/X86/pop-stack-cleanup-msvc.ll
Modified:
    llvm/trunk/lib/Target/X86/X86FrameLowering.cpp

Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=317551&r1=317550&r2=317551&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Tue Nov  7 00:50:21 2017
@@ -2577,6 +2577,7 @@ bool X86FrameLowering::adjustStackWithPo
   unsigned Regs[2];
   unsigned FoundRegs = 0;
 
+  auto &MRI = MBB.getParent()->getRegInfo();
   auto RegMask = Prev->getOperand(1);
 
   auto &RegClass =
@@ -2590,6 +2591,10 @@ bool X86FrameLowering::adjustStackWithPo
     if (!RegMask.clobbersPhysReg(Candidate))
       continue;
 
+    // Don't clobber reserved registers
+    if (MRI.isReserved(Candidate))
+      continue;
+
     bool IsDef = false;
     for (const MachineOperand &MO : Prev->implicit_operands()) {
       if (MO.isReg() && MO.isDef() &&

Added: llvm/trunk/test/CodeGen/X86/pop-stack-cleanup-msvc.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pop-stack-cleanup-msvc.ll?rev=317551&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pop-stack-cleanup-msvc.ll (added)
+++ llvm/trunk/test/CodeGen/X86/pop-stack-cleanup-msvc.ll Tue Nov  7 00:50:21 2017
@@ -0,0 +1,26 @@
+; RUN: llc < %s | FileCheck %s
+
+target triple = "i686--windows-msvc"
+
+declare { i8*, i32 } @param2_ret2(i32, i32)
+declare i32 @__CxxFrameHandler3(...)
+
+
+define void @test_reserved_regs() minsize optsize personality i32 (...)* @__CxxFrameHandler3 {
+; CHECK-LABEL: test_reserved_regs:
+; CHECK: calll _param2_ret2
+; CHECK-NEXT: popl %ecx
+; CHECK-NEXT: popl %edi
+start:
+  %s = alloca i64
+  store i64 4, i64* %s
+  %0 = invoke { i8*, i32 } @param2_ret2(i32 0, i32 1)
+          to label %out unwind label %cleanup
+
+out:
+  ret void
+
+cleanup:
+  %cp = cleanuppad within none []
+  cleanupret from %cp unwind to caller
+}




More information about the llvm-commits mailing list