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); } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits