Fix a case where an earlyclobber operand of an asm
authorDale Johannesen <dalej@apple.com>
Fri, 25 Jun 2010 00:49:43 +0000 (00:49 +0000)
committerDale Johannesen <dalej@apple.com>
Fri, 25 Jun 2010 00:49:43 +0000 (00:49 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106816 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/VirtRegRewriter.cpp

index 361d35e8a897fcd2784a8289b987fb94dcbb054a..6370d8fa5cba6a312c4736548d6c0bd15602e1c1 100644 (file)
@@ -2033,6 +2033,21 @@ LocalRewriter::RewriteMBB(LiveIntervals *LIs,
           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 @@ LocalRewriter::RewriteMBB(LiveIntervals *LIs,
         // 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!");