Bug fix for PR1279. When isDead is propagate by copy coalescing, we keep length
authorEvan Cheng <evan.cheng@apple.com>
Fri, 30 Mar 2007 20:18:35 +0000 (20:18 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 30 Mar 2007 20:18:35 +0000 (20:18 +0000)
of dead def live interval at 1 to avoid multiple def's targeting the same
register. The previous patch missed a case where the source operand is live-in.
In that case, remove the whole interval.

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

lib/CodeGen/LiveIntervalAnalysis.cpp

index ff7b555d5637a25fc3cb835cb520c6f2d5ae9a6e..bc4f6016f36825c1057254909c2550b283ae2b1c 100644 (file)
@@ -915,6 +915,7 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI,
 
   // Check if it is necessary to propagate "isDead" property before intervals
   // are joined.
+  MachineBasicBlock *CopyBB = CopyMI->getParent();
   MachineOperand *mopd = CopyMI->findRegisterDefOperand(DstReg);
   bool isDead = mopd->isDead();
   bool isShorten = false;
@@ -941,9 +942,15 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI,
         isShorten = true;
         RemoveStart = getDefIndex(getInstructionIndex(LastUse));
         RemoveEnd   = SrcEnd;
-      } else if (RemoveStart > 0)
-        // A dead def should have a single cycle interval.
-        ++RemoveStart;
+      } else {
+        MachineInstr *SrcMI = getInstructionFromIndex(SrcStart);
+        if (SrcMI) {
+          MachineOperand *mops = SrcMI->findRegisterDefOperand(SrcReg);
+          if (mops)
+            // A dead def should have a single cycle interval.
+            ++RemoveStart;
+        }
+      }
     }
   }
 
@@ -959,7 +966,6 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI,
 
     LiveVariables::VarInfo& dvi = lv_->getVarInfo(repDstReg);
     // Is the value used in the current BB or any immediate successroe BB?
-    MachineBasicBlock *CopyBB = CopyMI->getParent();
     if (dvi.UsedBlocks[CopyBB->getNumber()])
       goto TryJoin;
     for (MachineBasicBlock::succ_iterator SI = CopyBB->succ_begin(),
@@ -1018,7 +1024,6 @@ TryJoin:
         if (SrcMI) {
           MachineOperand *mops = SrcMI->findRegisterDefOperand(SrcReg);
           if (mops)
-            // FIXME: mops == NULL means SrcMI defines a subregister?
             mops->setIsDead();
         }
       }