[llvm-commits] CVS: llvm/lib/Transforms/Scalar/GVNPRE.cpp

Owen Anderson resistor at mac.com
Tue Jun 26 16:30:02 PDT 2007



Changes in directory llvm/lib/Transforms/Scalar:

GVNPRE.cpp updated: 1.58 -> 1.59
---
Log message:

1. Correct some comments and clean  up some dead code.
2. When calculating ANTIC_IN, only iterate the changed blocks.  For most average
inputs this is a small speedup, but for cases with unusual CFGs, this can be a significant win.


---
Diffs of the changes:  (+27 -22)

 GVNPRE.cpp |   49 +++++++++++++++++++++++++++----------------------
 1 files changed, 27 insertions(+), 22 deletions(-)


Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.58 llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.59
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.58	Mon Jun 25 13:25:31 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp	Tue Jun 26 18:29:41 2007
@@ -377,7 +377,7 @@
                            SmallPtrSet<Value*, 32>& currExps,
                            SmallPtrSet<Value*, 32>& currTemps,
                            std::set<BasicBlock*>& visited);
-    unsigned buildsets(Function& F);
+    void buildsets(Function& F);
     
     void insertion_pre(Value* e, BasicBlock* BB,
                        std::map<BasicBlock*, Value*>& avail,
@@ -895,7 +895,7 @@
 
 /// buildsets - Phase 1 of the main algorithm.  Construct the AVAIL_OUT
 /// and the ANTIC_IN sets.
-unsigned GVNPRE::buildsets(Function& F) {
+void GVNPRE::buildsets(Function& F) {
   std::map<BasicBlock*, SmallPtrSet<Value*, 32> > generatedExpressions;
   std::map<BasicBlock*, SmallPtrSet<PHINode*, 32> > generatedPhis;
   std::map<BasicBlock*, SmallPtrSet<Value*, 32> > generatedTemporaries;
@@ -937,32 +937,42 @@
   // Phase 1, Part 2: calculate ANTIC_IN
   
   std::set<BasicBlock*> visited;
+  SmallPtrSet<BasicBlock*, 4> block_changed;
+  for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
+    block_changed.insert(FI);
   
   bool changed = true;
   unsigned iterations = 0;
+  
   while (changed) {
     changed = false;
     SmallPtrSet<Value*, 32> anticOut;
     
-    // Top-down walk of the postdominator tree
+    // Postorder walk of the CFG
     for (po_iterator<BasicBlock*> BBI = po_begin(&F.getEntryBlock()),
          BBE = po_end(&F.getEntryBlock()); BBI != BBE; ++BBI) {
       BasicBlock* BB = *BBI;
-      if (BB == 0)
-        continue;
       
-      unsigned ret = buildsets_anticin(BB, anticOut,generatedExpressions[BB],
-                                       generatedTemporaries[BB], visited);
-      
-      if (ret == 0) {
-        changed = true;
-        continue;
-      } else {
-        visited.insert(BB);
-        if (ret == 2) {
-          DOUT << "CHANGED: " << BB->getName() << "\n";
+      if (block_changed.count(BB) != 0) {
+        unsigned ret = buildsets_anticin(BB, anticOut,generatedExpressions[BB],
+                                         generatedTemporaries[BB], visited);
+      
+        if (ret == 0) {
+          changed = true;
+          continue;
+        } else {
+          visited.insert(BB);
+        
+          if (ret == 2)
+           for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
+                 PI != PE; ++PI) {
+              block_changed.insert(*PI);
+           }
+          else
+            block_changed.erase(BB);
+        
+          changed |= (ret == 2);
         }
-        changed |= (ret == 2);
       }
     }
     
@@ -970,8 +980,6 @@
   }
   
   DOUT << "ITERATIONS: " << iterations << "\n";
-  
-  return 0; // No bail, no changes
 }
 
 /// insertion_pre - When a partial redundancy has been identified, eliminate it
@@ -1173,10 +1181,7 @@
   // This phase calculates the AVAIL_OUT and ANTIC_IN sets
   // NOTE: If full postdom information is no available, this will bail
   // early, performing GVN but not PRE
-  unsigned bail = buildsets(F);
-  //If a bail occurred, terminate early
-  if (bail != 0)
-    return (bail == 2);
+  buildsets(F);
   
   // Phase 2: Insert
   // This phase inserts values to make partially redundant values






More information about the llvm-commits mailing list