[llvm-commits] [llvm] r106816 - /llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp

Dale Johannesen dalej at apple.com
Thu Jun 24 17:49:43 PDT 2010


Author: johannes
Date: Thu Jun 24 19:49:43 2010
New Revision: 106816

URL: http://llvm.org/viewvc/llvm-project?rev=106816&view=rev
Log:
Fix a case where an earlyclobber operand of an asm
is reused as an input.  PR 4118.  Testcase is too big,
as usual with bugs in this area, but there's one in
the PR.


Modified:
    llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp

Modified: llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp?rev=106816&r1=106815&r2=106816&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp (original)
+++ llvm/trunk/lib/CodeGen/VirtRegRewriter.cpp Thu Jun 24 19:49:43 2010
@@ -2033,6 +2033,21 @@
           CanReuse = !ReusedOperands.isClobbered(PhysReg) &&
             Spills.canClobberPhysReg(PhysReg);
         }
+        // If this is an asm, and PhysReg is used elsewhere as an earlyclobber
+        // operand, we can't also use it as an input.  (Outputs always come
+        // before inputs, so we can stop looking at i.)
+        if (MI.getOpcode()==TargetOpcode::INLINEASM) {
+          for (unsigned k=0; k<i; ++k) {
+            MachineOperand &MOk = MI.getOperand(k);
+            if (!MOk.isReg() || MOk.getReg()==0)
+              continue;
+            unsigned VirtRegk = MOk.getReg();
+            if (VirtRegk == PhysReg && MOk.isEarlyClobber()) {
+              CanReuse = false;
+              break;
+            }
+          }
+        }
 
         if (CanReuse) {
           // If this stack slot value is already available, reuse it!
@@ -2103,6 +2118,8 @@
         // To avoid this problem, and to avoid doing a load right after a store,
         // we emit a copy from PhysReg into the designated register for this
         // operand.
+        //
+        // This case also applies to an earlyclobber'd PhysReg.
         unsigned DesignatedReg = VRM->getPhys(VirtReg);
         assert(DesignatedReg && "Must map virtreg to physreg!");
 





More information about the llvm-commits mailing list