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

Owen Anderson resistor at mac.com
Fri Jun 1 15:00:56 PDT 2007



Changes in directory llvm/lib/Transforms/Scalar:

GVNPRE.cpp updated: 1.9 -> 1.10
---
Log message:

clean() needs to process things in topological order.


---
Diffs of the changes:  (+21 -28)

 GVNPRE.cpp |   49 +++++++++++++++++++++----------------------------
 1 files changed, 21 insertions(+), 28 deletions(-)


Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.9 llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.10
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.9	Fri Jun  1 12:34:47 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp	Fri Jun  1 17:00:37 2007
@@ -299,37 +299,30 @@
 
 // Remove all expressions whose operands are not themselves in the set
 void GVNPRE::clean(GVNPRE::ValueTable VN, std::set<GVNPRE::Expression>& set) {
-  unsigned size = set.size();
-  unsigned old = 0;
+  std::vector<Expression> worklist;
+  topo_sort(VN, set, worklist);
   
-  while (size != old) {
-    old = size;
-  
-    std::vector<Expression> worklist(set.begin(), set.end());
-    while (!worklist.empty()) {
-      Expression e = worklist.back();
-      worklist.pop_back();
-    
-      if (e.opcode == 0) // OPAQUE
-        continue;
-      
-      bool lhsValid = false;
-      for (std::set<Expression>::iterator I = set.begin(), E = set.end();
-           I != E; ++I)
-        if (VN[*I] == e.lhs);
-          lhsValid = true;
+  while (!worklist.empty()) {
+    Expression e = worklist.back();
+    worklist.pop_back();
+    
+    if (e.opcode == 0) // OPAQUE
+      continue;
+      
+    bool lhsValid = false;
+    for (std::set<Expression>::iterator I = set.begin(), E = set.end();
+         I != E; ++I)
+      if (VN[*I] == e.lhs);
+        lhsValid = true;
           
-      bool rhsValid = false;
-      for (std::set<Expression>::iterator I = set.begin(), E = set.end();
-           I != E; ++I)
-        if (VN[*I] == e.rhs);
-          rhsValid = true;
+    bool rhsValid = false;
+    for (std::set<Expression>::iterator I = set.begin(), E = set.end();
+         I != E; ++I)
+      if (VN[*I] == e.rhs);
+        rhsValid = true;
       
-      if (!lhsValid || !rhsValid)
-        set.erase(e);
-    }
-    
-    size = set.size();
+    if (!lhsValid || !rhsValid)
+      set.erase(e);
   }
 }
 






More information about the llvm-commits mailing list