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

Owen Anderson resistor at mac.com
Fri Jun 22 14:31:41 PDT 2007



Changes in directory llvm/lib/Transforms/Scalar:

GVNPRE.cpp updated: 1.54 -> 1.55
---
Log message:

Rework topo_sort so eliminate some behavior that scaled terribly.  This reduces the time to optimize 403.gcc from 18.2s to 17.5s, 
and has an even larger effect on larger testcases.


---
Diffs of the changes:  (+40 -57)

 GVNPRE.cpp |   97 +++++++++++++++++++++++++------------------------------------
 1 files changed, 40 insertions(+), 57 deletions(-)


Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.54 llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.55
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.54	Fri Jun 22 13:27:04 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp	Fri Jun 22 16:31:16 2007
@@ -650,71 +650,54 @@
 /// topo_sort - Given a set of values, sort them by topological
 /// order into the provided vector.
 void GVNPRE::topo_sort(SmallPtrSet<Value*, 32>& set, std::vector<Value*>& vec) {
-  SmallPtrSet<Value*, 32> toErase;
+  SmallPtrSet<Value*, 32> visited;
+  std::vector<Value*> stack;
   for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
        I != E; ++I) {
-    if (BinaryOperator* BO = dyn_cast<BinaryOperator>(*I))
-      for (SmallPtrSet<Value*, 32>::iterator SI = set.begin(); SI != E; ++SI) {
-        if (VN.lookup(BO->getOperand(0)) == VN.lookup(*SI) ||
-            VN.lookup(BO->getOperand(1)) == VN.lookup(*SI)) {
-          toErase.insert(*SI);
+    if (visited.count(*I) == 0)
+      stack.push_back(*I);
+    
+    while (!stack.empty()) {
+      Value* e = stack.back();
+  
+      if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
+        Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
+        Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
+    
+        if (l != 0 && isa<Instruction>(l) &&
+            visited.count(l) == 0)
+          stack.push_back(l);
+        else if (r != 0 && isa<Instruction>(r) &&
+                 visited.count(r) == 0)
+          stack.push_back(r);
+        else {
+          vec.push_back(e);
+          visited.insert(e);
+          stack.pop_back();
         }
-      }
-    else if (CmpInst* C = dyn_cast<CmpInst>(*I))
-      for (SmallPtrSet<Value*, 32>::iterator SI = set.begin(); SI != E; ++SI) {
-        if (VN.lookup(C->getOperand(0)) == VN.lookup(*SI) ||
-            VN.lookup(C->getOperand(1)) == VN.lookup(*SI)) {
-          toErase.insert(*SI);
+      } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
+        Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
+        Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
+      
+        if (l != 0 && isa<Instruction>(l) &&
+            visited.count(l) == 0)
+          stack.push_back(l);
+        else if (r != 0 && isa<Instruction>(r) &&
+                 visited.count(r) == 0)
+          stack.push_back(r);
+        else {
+          vec.push_back(e);
+          visited.insert(e);
+          stack.pop_back();
         }
-      }
-  }
-  
-  std::vector<Value*> Q;
-  for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
-       I != E; ++I) {
-    if (toErase.count(*I) == 0)
-      Q.push_back(*I);
-  }
-  
-  SmallPtrSet<Value*, 32> visited;
-  while (!Q.empty()) {
-    Value* e = Q.back();
-  
-    if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
-      Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
-      Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
-      
-      if (l != 0 && isa<Instruction>(l) &&
-          visited.count(l) == 0)
-        Q.push_back(l);
-      else if (r != 0 && isa<Instruction>(r) &&
-               visited.count(r) == 0)
-        Q.push_back(r);
-      else {
-        vec.push_back(e);
+      } else {
         visited.insert(e);
-        Q.pop_back();
-      }
-    } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
-      Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
-      Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
-      
-      if (l != 0 && isa<Instruction>(l) &&
-          visited.count(l) == 0)
-        Q.push_back(l);
-      else if (r != 0 && isa<Instruction>(r) &&
-               visited.count(r) == 0)
-        Q.push_back(r);
-      else {
         vec.push_back(e);
-        visited.insert(e);
-        Q.pop_back();
+        stack.pop_back();
       }
-    } else {
-      visited.insert(e);
-      vec.push_back(e);
-      Q.pop_back();
     }
+    
+    stack.clear();
   }
 }
 






More information about the llvm-commits mailing list