From: Owen Anderson Date: Fri, 1 Jun 2007 22:00:37 +0000 (+0000) Subject: clean() needs to process things in topological order. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=aa7d3351f0decfe678c782d08a7b53779b317c2d;p=oota-llvm.git clean() needs to process things in topological order. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37389 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp index f7040b03e17..4f5205434df 100644 --- a/lib/Transforms/Scalar/GVNPRE.cpp +++ b/lib/Transforms/Scalar/GVNPRE.cpp @@ -299,37 +299,30 @@ void GVNPRE::phi_translate(GVNPRE::ValueTable& VN, // Remove all expressions whose operands are not themselves in the set void GVNPRE::clean(GVNPRE::ValueTable VN, std::set& set) { - unsigned size = set.size(); - unsigned old = 0; + std::vector worklist; + topo_sort(VN, set, worklist); - while (size != old) { - old = size; - - std::vector worklist(set.begin(), set.end()); - while (!worklist.empty()) { - Expression e = worklist.back(); - worklist.pop_back(); + while (!worklist.empty()) { + Expression e = worklist.back(); + worklist.pop_back(); - if (e.opcode == 0) // OPAQUE - continue; + if (e.opcode == 0) // OPAQUE + continue; - bool lhsValid = false; - for (std::set::iterator I = set.begin(), E = set.end(); - I != E; ++I) - if (VN[*I] == e.lhs); - lhsValid = true; + bool lhsValid = false; + for (std::set::iterator I = set.begin(), E = set.end(); + I != E; ++I) + if (VN[*I] == e.lhs); + lhsValid = true; - bool rhsValid = false; - for (std::set::iterator I = set.begin(), E = set.end(); - I != E; ++I) - if (VN[*I] == e.rhs); - rhsValid = true; + bool rhsValid = false; + for (std::set::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); } }