[llvm-commits] [llvm] r54077 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp

Owen Anderson resistor at mac.com
Fri Jul 25 16:38:08 PDT 2008


Author: resistor
Date: Fri Jul 25 18:38:08 2008
New Revision: 54077

URL: http://llvm.org/viewvc/llvm-project?rev=54077&view=rev
Log:
Fix the issues originally addressed in r54070.  After thinking about it some more, I realized that the right thing to do
is to have StrongPHIElimination use its knowledge of the PHIs before they're erased to update the intervals appropriate.  This is
both simpler and more accurate than the alternative, which was having LIA figure it out when it renumbered things, plus it's just
the right thing to do!

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

Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp?rev=54077&r1=54076&r2=54077&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original)
+++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Fri Jul 25 18:38:08 2008
@@ -741,7 +741,7 @@
   std::set<unsigned> RegHandled;
   for (SmallVector<std::pair<unsigned, MachineInstr*>, 4>::iterator I =
        InsertedPHIDests.begin(), E = InsertedPHIDests.end(); I != E; ++I)
-    if (!RegHandled.insert(I->first).second)
+    if (RegHandled.insert(I->first).second)
       LI.addLiveRangeToEndOfBlock(I->first, I->second);
 }
 
@@ -846,6 +846,19 @@
        I != E; ) {
     MachineInstr* PInstr = *(I++);
     
+    // Trim live intervals of input registers.  They are no longer live into
+    // this block.
+    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.removeRange(LI.getMBBStartIdx(PInstr->getParent()),
+                           LI.getInstructionIndex(PInstr),
+                           true);
+    }
+    
     // If this is a dead PHI node, then remove it from LiveIntervals.
     unsigned DestReg = PInstr->getOperand(0).getReg();
     LiveInterval& PI = LI.getInterval(DestReg);
@@ -860,7 +873,11 @@
       // If the PHI is not dead, then the valno defined by the PHI
       // now has an unknown def.
       unsigned idx = LI.getDefIndex(LI.getInstructionIndex(PInstr));
-      PI.getLiveRangeContaining(idx)->valno->def = ~0U;
+      const LiveRange* PLR = PI.getLiveRangeContaining(idx);
+      PLR->valno->def = ~0U;
+      LiveRange R (LI.getMBBStartIdx(PInstr->getParent()),
+                   PLR->start, PLR->valno);
+      PI.addRange(R);
     }
     
     LI.RemoveMachineInstrFromMaps(PInstr);





More information about the llvm-commits mailing list