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

Owen Anderson resistor at mac.com
Mon Dec 24 14:12:25 PST 2007


Author: resistor
Date: Mon Dec 24 16:12:23 2007
New Revision: 45347

URL: http://llvm.org/viewvc/llvm-project?rev=45347&view=rev
Log:
Flesh out the Briggs implementation a little bit more, fix a few FIXMEs.

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=45347&r1=45346&r2=45347&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original)
+++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Mon Dec 24 16:12:23 2007
@@ -102,7 +102,8 @@
                          std::set<unsigned>& PHIUnion,
                          std::vector<StrongPHIElimination::DomForestNode*>& DF,
                          std::vector<std::pair<unsigned, unsigned> >& locals);
-    void ScheduleCopies(MachineBasicBlock* MBB);
+    void ScheduleCopies(MachineBasicBlock* MBB, std::set<unsigned>& pushed);
+    void InsertCopies(MachineBasicBlock* MBB);
   };
 
   char StrongPHIElimination::ID = 0;
@@ -514,7 +515,8 @@
 ///
 /// Based on "Practical Improvements to the Construction and Destruction
 /// of Static Single Assignment Form" by Briggs, et al.
-void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB) {
+void StrongPHIElimination::ScheduleCopies(MachineBasicBlock* MBB,
+                                          std::set<unsigned>& pushed) {
   std::map<unsigned, unsigned>& copy_set= Waiting[MBB];
   
   std::map<unsigned, unsigned> worklist;
@@ -549,6 +551,7 @@
       if (isLiveOut(LV.getVarInfo(curr.second), MBB)) {
         // Insert copy from curr.second to a temporary
         // Push temporary on Stacks
+        // Insert temporary in pushed
       }
       
       // Insert copy from map[curr.first] to curr.second
@@ -583,6 +586,34 @@
   }
 }
 
+/// InsertCopies - insert copies into MBB and all of its successors
+void StrongPHIElimination::InsertCopies(MachineBasicBlock* MBB) {
+  std::set<unsigned> pushed;
+  
+  // Rewrite register uses from Stacks
+  for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
+      I != E; ++I)
+    for (unsigned i = 0; i < I->getNumOperands(); ++i)
+      if (I->getOperand(i).isRegister() &&
+          Stacks[I->getOperand(i).getReg()].size()) {
+        I->getOperand(i).setReg(Stacks[I->getOperand(i).getReg()].back());
+      }
+  
+  // Schedule the copies for this block
+  ScheduleCopies(MBB, pushed);
+  
+  // Recur to our successors
+  for (GraphTraits<MachineBasicBlock*>::ChildIteratorType I = 
+       GraphTraits<MachineBasicBlock*>::child_begin(MBB), E =
+       GraphTraits<MachineBasicBlock*>::child_end(MBB); I != E; ++I)
+    InsertCopies(*I);
+  
+  // As we exit this block, pop the names we pushed while processing it
+  for (std::set<unsigned>::iterator I = pushed.begin(), 
+       E = pushed.end(); I != E; ++I)
+    Stacks[*I].pop_back();
+}
+
 bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) {
   // Compute DFS numbers of each block
   computeDFS(Fn);
@@ -594,15 +625,8 @@
       processBlock(I);
   
   // Insert copies
-  MachineDominatorTree& MDT = getAnalysis<MachineDominatorTree>();
-  for (df_iterator<MachineDomTreeNode*> DI = df_begin(MDT.getRootNode()), 
-       DE = df_end(MDT.getRootNode()); DI != DE; ++DI) {
-    MachineBasicBlock* block = DI->getBlock();
-    
-    // FIXME: Do rewriting with Stacks
-    
-    ScheduleCopies(block);
-  }
+  // FIXME: This process should probably preserve LiveVariables
+  InsertCopies(Fn.begin());
   
   // FIXME: Perform renaming
   





More information about the llvm-commits mailing list