Dead PHI instructions need to be handled specially.
authorOwen Anderson <resistor@mac.com>
Wed, 26 Mar 2008 03:03:23 +0000 (03:03 +0000)
committerOwen Anderson <resistor@mac.com>
Wed, 26 Mar 2008 03:03:23 +0000 (03:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48811 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StrongPHIElimination.cpp

index 87801da2bd0000faf828d036a7fba945d8551099..eedf8adcc62c8d80c574e00f45407073adaa0313 100644 (file)
@@ -414,6 +414,12 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
   while (P != FirstNonPHI && P->getOpcode() == TargetInstrInfo::PHI) {
     unsigned DestReg = P->getOperand(0).getReg();
 
+    // Don't both doing PHI elimination for dead PHI's.
+    if (P->registerDefIsDead(DestReg)) {
+      ++P;
+      continue;
+    }
+
     LiveInterval& PI = LI.getOrCreateInterval(DestReg);
     unsigned pIdx = LI.getInstructionIndex(FirstNonPHI);
     VNInfo* PVN = PI.getLiveRangeContaining(pIdx)->valno;
@@ -911,6 +917,22 @@ bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) {
   
   for (std::vector<MachineInstr*>::iterator I = phis.begin(), E = phis.end();
        I != E; ++I) {
+    // If this is a dead PHI node, then remove it from LiveIntervals.
+    unsigned DestReg = (*I)->getOperand(0).getReg();
+    if ((*I)->registerDefIsDead(DestReg)) {
+      LiveInterval& PI = LI.getInterval(DestReg);
+      
+      if (PI.containsOneValue()) {
+        LI.removeInterval(DestReg);
+      } else {
+        MachineBasicBlock::iterator PIter = *I;
+        while (PIter->getOpcode() == TargetInstrInfo::PHI) ++PIter;
+        unsigned idx = LI.getInstructionIndex(PIter);
+        
+        PI.removeRange(*PI.getLiveRangeContaining(idx), true);
+      }
+    }
+      
     LI.RemoveMachineInstrFromMaps(*I);
     (*I)->eraseFromParent();
   }