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

Owen Anderson resistor at mac.com
Thu Jun 21 20:14:26 PDT 2007



Changes in directory llvm/lib/Transforms/Scalar:

GVNPRE.cpp updated: 1.51 -> 1.52
---
Log message:

Avoid excessive calls to find_leader when calculating AVAIL_OUT.  This reduces the time to optimize 403.gcc from 23.5s to 21.9s.


---
Diffs of the changes:  (+76 -30)

 GVNPRE.cpp |  106 +++++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 76 insertions(+), 30 deletions(-)


Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.51 llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.52
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.51	Thu Jun 21 19:43:22 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp	Thu Jun 21 22:14:03 2007
@@ -367,45 +367,47 @@
   
     // Helper fuctions
     // FIXME: eliminate or document these better
-    void dump(const SmallPtrSet<Value*, 32>& s) const;
-    void clean(SmallPtrSet<Value*, 32>& set);
+    void dump(const SmallPtrSet<Value*, 32>& s) const __attribute__((noinline));
+    void clean(SmallPtrSet<Value*, 32>& set) __attribute__((noinline));
     Value* find_leader(SmallPtrSet<Value*, 32>& vals,
-                       uint32_t v);
-    Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ);
+                       uint32_t v) __attribute__((noinline));
+    Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) __attribute__((noinline));
     void phi_translate_set(SmallPtrSet<Value*, 32>& anticIn, BasicBlock* pred,
-                           BasicBlock* succ, SmallPtrSet<Value*, 32>& out) ;
+                           BasicBlock* succ, SmallPtrSet<Value*, 32>& out)  __attribute__((noinline));
     
     void topo_sort(SmallPtrSet<Value*, 32>& set,
-                   std::vector<Value*>& vec);
+                   std::vector<Value*>& vec) __attribute__((noinline));
     
-    void cleanup();
-    bool elimination();
+    void cleanup() __attribute__((noinline));
+    bool elimination() __attribute__((noinline));
     
-    void val_insert(SmallPtrSet<Value*, 32>& s, Value* v);
-    void val_replace(SmallPtrSet<Value*, 32>& s, Value* v);
-    bool dependsOnInvoke(Value* V);
+    void val_insert(SmallPtrSet<Value*, 32>& s, Value* v) __attribute__((noinline));
+    void val_replace(SmallPtrSet<Value*, 32>& s, Value* v) __attribute__((noinline));
+    bool dependsOnInvoke(Value* V) __attribute__((noinline));
     void buildsets_availout(BasicBlock::iterator I,
                             SmallPtrSet<Value*, 32>& currAvail,
                             SmallPtrSet<PHINode*, 32>& currPhis,
                             SmallPtrSet<Value*, 32>& currExps,
-                            SmallPtrSet<Value*, 32>& currTemps);
+                            SmallPtrSet<Value*, 32>& currTemps,
+                            BitVector& availNumbers,
+                            BitVector& expNumbers) __attribute__((noinline));
     bool buildsets_anticout(BasicBlock* BB,
                             SmallPtrSet<Value*, 32>& anticOut,
-                            std::set<BasicBlock*>& visited);
+                            std::set<BasicBlock*>& visited) __attribute__((noinline));
     unsigned buildsets_anticin(BasicBlock* BB,
                            SmallPtrSet<Value*, 32>& anticOut,
                            SmallPtrSet<Value*, 32>& currExps,
                            SmallPtrSet<Value*, 32>& currTemps,
-                           std::set<BasicBlock*>& visited);
-    unsigned buildsets(Function& F);
+                           std::set<BasicBlock*>& visited) __attribute__((noinline));
+    unsigned buildsets(Function& F) __attribute__((noinline));
     
     void insertion_pre(Value* e, BasicBlock* BB,
                        std::map<BasicBlock*, Value*>& avail,
-                       SmallPtrSet<Value*, 32>& new_set);
+                       SmallPtrSet<Value*, 32>& new_set) __attribute__((noinline));
     unsigned insertion_mergepoint(std::vector<Value*>& workList,
                                   df_iterator<DomTreeNode*>& D,
-                                  SmallPtrSet<Value*, 32>& new_set);
-    bool insertion(Function& F);
+                                  SmallPtrSet<Value*, 32>& new_set) __attribute__((noinline));
+    bool insertion(Function& F) __attribute__((noinline));
   
   };
   
@@ -795,10 +797,15 @@
                                 SmallPtrSet<Value*, 32>& currAvail,
                                 SmallPtrSet<PHINode*, 32>& currPhis,
                                 SmallPtrSet<Value*, 32>& currExps,
-                                SmallPtrSet<Value*, 32>& currTemps) {
+                                SmallPtrSet<Value*, 32>& currTemps,
+                                BitVector& availNumbers,
+                                BitVector& expNumbers) {
   // Handle PHI nodes...
   if (PHINode* p = dyn_cast<PHINode>(I)) {
     VN.lookup_or_add(p);
+    expNumbers.resize(VN.size());
+    availNumbers.resize(VN.size());
+    
     currPhis.insert(p);
     
   // Handle binary ops...
@@ -806,13 +813,26 @@
     Value* leftValue = BO->getOperand(0);
     Value* rightValue = BO->getOperand(1);
     
-    VN.lookup_or_add(BO);
+    unsigned num = VN.lookup_or_add(BO);
+    expNumbers.resize(VN.size());
+    availNumbers.resize(VN.size());
       
     if (isa<Instruction>(leftValue))
-      val_insert(currExps, leftValue);
+      if (!expNumbers.test(VN.lookup(leftValue)-1)) {
+        currExps.insert(leftValue);
+        expNumbers.set(VN.lookup(leftValue)-1);
+      }
+    
     if (isa<Instruction>(rightValue))
-      val_insert(currExps, rightValue);
-    val_insert(currExps, BO);
+      if (!expNumbers.test(VN.lookup(rightValue)-1)) {
+        currExps.insert(rightValue);
+        expNumbers.set(VN.lookup(rightValue)-1);
+      }
+    
+    if (!expNumbers.test(VN.lookup(BO)-1)) {
+      currExps.insert(BO);
+      expNumbers.set(num-1);
+    }
     
   // Handle cmp ops...
   } else if (CmpInst* C = dyn_cast<CmpInst>(I)) {
@@ -820,21 +840,41 @@
     Value* rightValue = C->getOperand(1);
       
     VN.lookup_or_add(C);
-      
+    
+    unsigned num = VN.lookup_or_add(C);
+    expNumbers.resize(VN.size());
+    availNumbers.resize(VN.size());
+    
     if (isa<Instruction>(leftValue))
-      val_insert(currExps, leftValue);
+      if (!expNumbers.test(VN.lookup(leftValue)-1)) {
+        currExps.insert(leftValue);
+        expNumbers.set(VN.lookup(leftValue)-1);
+      }
     if (isa<Instruction>(rightValue))
-      val_insert(currExps, rightValue);
-    val_insert(currExps, C);
-      
+      if (!expNumbers.test(VN.lookup(rightValue)-1)) {
+        currExps.insert(rightValue);
+        expNumbers.set(VN.lookup(rightValue)-1);
+      }
+    
+    if (!expNumbers.test(VN.lookup(C)-1)) {
+      currExps.insert(C);
+      expNumbers.set(num-1);
+    }
+    
   // Handle unsupported ops
   } else if (!I->isTerminator()){
     VN.lookup_or_add(I);
+    expNumbers.resize(VN.size());
+    availNumbers.resize(VN.size());
+    
     currTemps.insert(I);
   }
     
   if (!I->isTerminator())
-    val_insert(currAvail, I);
+    if (!availNumbers.test(VN.lookup(I)-1)) {
+      currAvail.insert(I);
+      availNumbers.set(VN.lookup(I)-1);
+    }
 }
 
 /// buildsets_anticout - When walking the postdom tree, calculate the ANTIC_OUT
@@ -953,10 +993,16 @@
     currAvail.insert(availableOut[DI->getIDom()->getBlock()].begin(),
                      availableOut[DI->getIDom()->getBlock()].end());
     
+    BitVector availNumbers(VN.size());
+    for (SmallPtrSet<Value*, 32>::iterator I = currAvail.begin(),
+        E = currAvail.end(); I != E; ++I)
+      availNumbers.set(VN.lookup(*I));
     
+    BitVector expNumbers(VN.size());
     for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
          BI != BE; ++BI)
-      buildsets_availout(BI, currAvail, currPhis, currExps, currTemps);
+      buildsets_availout(BI, currAvail, currPhis, currExps,
+                         currTemps, availNumbers, expNumbers);
       
   }
   






More information about the llvm-commits mailing list