[llvm-commits] [llvm] r90575 - /llvm/trunk/lib/CodeGen/TailDuplication.cpp

Evan Cheng evan.cheng at apple.com
Fri Dec 4 11:09:10 PST 2009


Author: evancheng
Date: Fri Dec  4 13:09:10 2009
New Revision: 90575

URL: http://llvm.org/viewvc/llvm-project?rev=90575&view=rev
Log:
Handle recursive PHI's.

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

Modified: llvm/trunk/lib/CodeGen/TailDuplication.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TailDuplication.cpp?rev=90575&r1=90574&r2=90575&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/TailDuplication.cpp (original)
+++ llvm/trunk/lib/CodeGen/TailDuplication.cpp Fri Dec  4 13:09:10 2009
@@ -38,7 +38,7 @@
                   cl::desc("Maximum instructions to consider tail duplicating"),
                   cl::init(2), cl::Hidden);
 
-typedef std::vector<unsigned> AvailableValsTy;
+typedef std::vector<std::pair<MachineBasicBlock*,unsigned> > AvailableValsTy;
 
 namespace {
   /// TailDuplicatePass - Perform tail duplication.
@@ -64,7 +64,8 @@
     virtual const char *getPassName() const { return "Tail Duplication"; }
 
   private:
-    void AddSSAUpdateEntry(unsigned OrigReg, unsigned NewReg);
+    void AddSSAUpdateEntry(unsigned OrigReg, unsigned NewReg,
+                           MachineBasicBlock *BB);
     void ProcessPHI(MachineInstr *MI, MachineBasicBlock *TailBB,
                     MachineBasicBlock *PredBB,
                     DenseMap<unsigned, unsigned> &LocalVRMap);
@@ -151,14 +152,14 @@
 
 /// AddSSAUpdateEntry - Add a definition and source virtual registers pair for
 /// SSA update.
-void TailDuplicatePass::AddSSAUpdateEntry(unsigned OrigReg, unsigned NewReg) {
-  DenseMap<unsigned, AvailableValsTy>::iterator LI =
-    SSAUpdateVals.find(OrigReg);
+void TailDuplicatePass::AddSSAUpdateEntry(unsigned OrigReg, unsigned NewReg,
+                                          MachineBasicBlock *BB) {
+  DenseMap<unsigned, AvailableValsTy>::iterator LI= SSAUpdateVals.find(OrigReg);
   if (LI != SSAUpdateVals.end())
-    LI->second.push_back(NewReg);
+    LI->second.push_back(std::make_pair(BB, NewReg));
   else {
     AvailableValsTy Vals;
-    Vals.push_back(NewReg);
+    Vals.push_back(std::make_pair(BB, NewReg));
     SSAUpdateVals.insert(std::make_pair(OrigReg, Vals));
     SSAUpdateVRs.push_back(OrigReg);
   }
@@ -176,7 +177,7 @@
   unsigned SrcReg = MI->getOperand(SrcOpIdx).getReg();
   LocalVRMap.insert(std::make_pair(DefReg, SrcReg));
   if (isDefLiveOut(DefReg, TailBB, MRI))
-    AddSSAUpdateEntry(DefReg, SrcReg);
+    AddSSAUpdateEntry(DefReg, SrcReg, PredBB);
 
   // Remove PredBB from the PHI node.
   MI->RemoveOperand(SrcOpIdx+1);
@@ -206,7 +207,7 @@
       MO.setReg(NewReg);
       LocalVRMap.insert(std::make_pair(Reg, NewReg));
       if (isDefLiveOut(Reg, TailBB, MRI))
-        AddSSAUpdateEntry(Reg, NewReg);
+        AddSSAUpdateEntry(Reg, NewReg, PredBB);
     } else {
       DenseMap<unsigned, unsigned>::iterator VI = LocalVRMap.find(Reg);
       if (VI != LocalVRMap.end())
@@ -240,15 +241,14 @@
           II->RemoveOperand(i+1);
           II->RemoveOperand(i);
         }
-        DenseMap<unsigned, AvailableValsTy>::iterator LI =
-          SSAUpdateVals.find(Reg);
+        DenseMap<unsigned,AvailableValsTy>::iterator LI=SSAUpdateVals.find(Reg);
         if (LI == SSAUpdateVals.end())
           break;
         for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
-          unsigned NewReg = LI->second[j];
-          MachineInstr *DefMI = MRI->getVRegDef(NewReg);
-          II->addOperand(MachineOperand::CreateReg(NewReg, false));
-          II->addOperand(MachineOperand::CreateMBB(DefMI->getParent()));
+          MachineBasicBlock *SrcBB = LI->second[j].first;
+          unsigned SrcReg = LI->second[j].second;
+          II->addOperand(MachineOperand::CreateReg(SrcReg, false));
+          II->addOperand(MachineOperand::CreateMBB(SrcBB));
         }
         break;
       }
@@ -449,9 +449,9 @@
       DenseMap<unsigned, AvailableValsTy>::iterator LI =
         SSAUpdateVals.find(VReg);  
       for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
-        unsigned NewReg = LI->second[j];
-        MachineInstr *DefMI = MRI->getVRegDef(NewReg);
-        SSAUpdate.AddAvailableValue(DefMI->getParent(), NewReg);
+        MachineBasicBlock *SrcBB = LI->second[j].first;
+        unsigned SrcReg = LI->second[j].second;
+        SSAUpdate.AddAvailableValue(SrcBB, SrcReg);
       }
 
       // Rewrite uses that are outside of the original def's block.





More information about the llvm-commits mailing list