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

Owen Anderson resistor at mac.com
Tue Jul 29 17:21:17 PDT 2008


Author: resistor
Date: Tue Jul 29 19:21:16 2008
New Revision: 54185

URL: http://llvm.org/viewvc/llvm-project?rev=54185&view=rev
Log:
When merging live intervals, we also need to merge in any live ranges that are inputs to two-address instructions
that themselves define a range we already care about.

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=54185&r1=54184&r2=54185&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original)
+++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Tue Jul 29 19:21:16 2008
@@ -792,20 +792,49 @@
   VNInfo* NewVN = LHS.getNextValue(RangeMergingIn->valno->def,
                                    RangeMergingIn->valno->copy,
                                    LI.getVNInfoAllocator());
-                                   
-  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);
+
+  // If we discover that a live range was defined by a two-addr
+  // instruction, we need to merge over the input as well, even if
+  // it has a different VNInfo.
+  SmallPtrSet<VNInfo*, 4> MergedVNs;
+  MergedVNs.insert(RHSVN);
+  
+  DenseMap<VNInfo*, VNInfo*> VNMap;
+  VNMap.insert(std::make_pair(RangeMergingIn->valno, NewVN));
+  
+  bool changed = true;
+  while (changed) {
+    changed = false;
+    for (LiveInterval::iterator RI = RHS.begin(), RE = RHS.end();
+        RI != RE; )
+      if (MergedVNs.count(RI->valno)) {
+        NewVN->hasPHIKill = true;
+        LiveRange NewRange(RI->start, RI->end, VNMap[RI->valno]);
+        LHS.addRange(NewRange);
+      
+        MachineInstr* instr = LI.getInstructionFromIndex(RI->start);
+        for (unsigned i = 0; i < instr->getNumOperands(); ++i) {
+          if (instr->getOperand(i).isReg() &&
+              instr->getOperand(i).getReg() == secondary)
+            if (instr->isRegReDefinedByTwoAddr(secondary, i)) {
+              VNInfo* twoaddr = RHS.getLiveRangeContaining(RI->start-1)->valno;
+              MergedVNs.insert(twoaddr);
+              
+              VNInfo* NextVN = LHS.getNextValue(twoaddr->def,
+                                                twoaddr->copy,
+                                                LI.getVNInfoAllocator());
+              VNMap.insert(std::make_pair(twoaddr, NextVN));
+            }
+        }
       
-      unsigned start = RI->start;
-      unsigned end = RI->end;
-      ++RI;
-      RHS.removeRange(start, end, true);
-    } else
-      ++RI;
+        unsigned start = RI->start;
+        unsigned end = RI->end;
+        ++RI;
+        RHS.removeRange(start, end, true);
+        changed = true;
+      } else
+        ++RI;
+  }
   
   if (RHS.begin() == RHS.end())
     LI.removeInterval(RHS.reg);





More information about the llvm-commits mailing list