diff options
author | Owen Anderson <resistor@mac.com> | 2007-06-19 23:07:16 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-06-19 23:07:16 +0000 |
commit | 52471b102c89d6d7ac18f3e8c155843a0ea9f6ec (patch) | |
tree | a05950c314a09fc1450ac7b58906509e5a737304 /lib/Transforms | |
parent | c91c56cf435b2a51479b8135c2bb907d09a8df41 (diff) |
Make dependsOnInvoke much more specific in what it tests, which in turn make it much faster to run. This reduces the time to optimize lencondwith a debug build on PPC from ~450s to ~300s.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37667 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/GVNPRE.cpp | 52 |
1 files changed, 10 insertions, 42 deletions
diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp index 15fecca0d8..61bc3673cf 100644 --- a/lib/Transforms/Scalar/GVNPRE.cpp +++ b/lib/Transforms/Scalar/GVNPRE.cpp @@ -504,40 +504,14 @@ void GVNPRE::phi_translate_set(std::set<Value*>& anticIn, } bool GVNPRE::dependsOnInvoke(Value* V) { - if (!isa<User>(V)) - return false; - - User* U = cast<User>(V); - std::map<User*, bool>::iterator I = invokeDep.find(U); - if (I != invokeDep.end()) - return I->second; - - std::vector<Value*> worklist(U->op_begin(), U->op_end()); - std::set<Value*> visited; - - while (!worklist.empty()) { - Value* current = worklist.back(); - worklist.pop_back(); - visited.insert(current); - - if (!isa<User>(current)) - continue; - else if (isa<InvokeInst>(current)) - return true; - - User* curr = cast<User>(current); - std::map<User*, bool>::iterator CI = invokeDep.find(curr); - if (CI != invokeDep.end()) { - if (CI->second) + if (PHINode* p = dyn_cast<PHINode>(V)) { + for (PHINode::op_iterator I = p->op_begin(), E = p->op_end(); I != E; ++I) + if (isa<InvokeInst>(*I)) return true; - } else { - for (unsigned i = 0; i < curr->getNumOperands(); ++i) - if (visited.find(curr->getOperand(i)) == visited.end()) - worklist.push_back(curr->getOperand(i)); - } + return false; + } else { + return false; } - - return false; } // Remove all expressions whose operands are not themselves in the set @@ -557,10 +531,6 @@ void GVNPRE::clean(std::set<Value*>& set) { lhsValid = true; break; } - - // Check for dependency on invoke insts - // NOTE: This check is expensive, so don't do it if we - // don't have to if (lhsValid) lhsValid = !dependsOnInvoke(BO->getOperand(0)); @@ -572,10 +542,6 @@ void GVNPRE::clean(std::set<Value*>& set) { rhsValid = true; break; } - - // Check for dependency on invoke insts - // NOTE: This check is expensive, so don't do it if we - // don't have to if (rhsValid) rhsValid = !dependsOnInvoke(BO->getOperand(1)); @@ -590,7 +556,8 @@ void GVNPRE::clean(std::set<Value*>& set) { lhsValid = true; break; } - lhsValid &= !dependsOnInvoke(C->getOperand(0)); + if (lhsValid) + lhsValid = !dependsOnInvoke(C->getOperand(0)); bool rhsValid = !isa<Instruction>(C->getOperand(1)); if (!rhsValid) @@ -600,7 +567,8 @@ void GVNPRE::clean(std::set<Value*>& set) { rhsValid = true; break; } - rhsValid &= !dependsOnInvoke(C->getOperand(1)); + if (rhsValid) + rhsValid = !dependsOnInvoke(C->getOperand(1)); if (!lhsValid || !rhsValid) set.erase(C); |