When merging a PHI operand's live interval into the PHI's live interval, we need...
authorOwen Anderson <resistor@mac.com>
Tue, 29 Jul 2008 21:17:08 +0000 (21:17 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 29 Jul 2008 21:17:08 +0000 (21:17 +0000)
the operand's interval that share the relevant value number, not just the range that immediately precedes the PHI.

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

lib/CodeGen/StrongPHIElimination.cpp

index 399e61541843c7490790283c54b8130e732f64ea..3d23efec7b091b7498f3dbfc9b6bf5884c18ffe7 100644 (file)
@@ -786,21 +786,29 @@ void StrongPHIElimination::mergeLiveIntervals(unsigned primary,
   LiveInterval& RHS = LI.getOrCreateInterval(secondary);
   
   LI.computeNumbering();
-  
   const LiveRange* RangeMergingIn =
                    RHS.getLiveRangeContaining(LI.getMBBEndIdx(pred));
+  VNInfo* RHSVN = RangeMergingIn->valno;
   VNInfo* NewVN = LHS.getNextValue(RangeMergingIn->valno->def,
                                    RangeMergingIn->valno->copy,
                                    LI.getVNInfoAllocator());
-  NewVN->hasPHIKill = true;
-  LiveRange NewRange(RangeMergingIn->start, RangeMergingIn->end, NewVN);
-  
-  if (RHS.containsOneValue())
+                                   
+  for (LiveInterval::iterator RI = RHS.begin(), RE = RHS.end();
+       RI != RE; )
+    if (RI->valno == RHSVN) {
+      NewVN->hasPHIKill = true;
+      LiveRange NewRange(RI->start, RI->end, NewVN);
+      LHS.addRange(NewRange);
+      
+      unsigned start = RI->start;
+      unsigned end = RI->end;
+      ++RI;
+      RHS.removeRange(start, end, true);
+    } else
+      ++RI;
+  
+  if (RHS.begin() == RHS.end())
     LI.removeInterval(RHS.reg);
-  else
-    RHS.removeRange(RangeMergingIn->start, RangeMergingIn->end, true);
-  
-  LHS.addRange(NewRange);
 }
 
 bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) {