Only trim a live interval if the register is not used after the PHI node.
authorOwen Anderson <resistor@mac.com>
Wed, 6 Aug 2008 18:36:17 +0000 (18:36 +0000)
committerOwen Anderson <resistor@mac.com>
Wed, 6 Aug 2008 18:36:17 +0000 (18:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54421 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StrongPHIElimination.cpp

index 545544a3bdac521046711f3452b6e594de67754d..b276e80e92b681915b7cc5cd2f1abdcbfc78f42b 100644 (file)
@@ -896,13 +896,16 @@ bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) {
       }
     } else {
       // Trim live intervals of input registers.  They are no longer live into
-      // this block.
+      // this block if they died after the PHI.  If they lived after it, don't
+      // trim them because they might have other legitimate uses.
       for (unsigned i = 1; i < PInstr->getNumOperands(); i += 2) {
         unsigned reg = PInstr->getOperand(i).getReg();
         MachineBasicBlock* MBB = PInstr->getOperand(i+1).getMBB();
         LiveInterval& InputI = LI.getInterval(reg);
         if (MBB != PInstr->getParent() &&
-            InputI.liveAt(LI.getMBBStartIdx(PInstr->getParent())))
+            InputI.liveAt(LI.getMBBStartIdx(PInstr->getParent())) &&
+            InputI.expiredAt(LI.getInstructionIndex(PInstr) + 
+                             LiveIntervals::InstrSlots::NUM))
           InputI.removeRange(LI.getMBBStartIdx(PInstr->getParent()),
                              LI.getInstructionIndex(PInstr),
                              true);