From: Owen Anderson Date: Mon, 18 Jun 2007 04:42:29 +0000 (+0000) Subject: Cache the results of dependsOnInvoke() X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=bbf1197be17bd0f258b8908a4c2c0b60b684db7e;p=oota-llvm.git Cache the results of dependsOnInvoke() git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37622 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp index 888976bddf8..c654d14c235 100644 --- a/lib/Transforms/Scalar/GVNPRE.cpp +++ b/lib/Transforms/Scalar/GVNPRE.cpp @@ -103,6 +103,7 @@ namespace { std::map > availableOut; std::map > anticipatedIn; + std::map invokeDep; virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesCFG(); @@ -135,6 +136,8 @@ namespace { std::map > availOut); void cleanup(); void elimination(); + + bool dependsOnInvoke(Value* V); }; @@ -285,11 +288,15 @@ void GVNPRE::phi_translate_set(std::set& anticIn, } } -bool dependsOnInvoke(Value* V) { +bool GVNPRE::dependsOnInvoke(Value* V) { if (!isa(V)) return false; User* U = cast(V); + std::map::iterator I = invokeDep.find(U); + if (I != invokeDep.end()) + return I->second; + std::vector worklist(U->op_begin(), U->op_end()); std::set visited; @@ -304,9 +311,15 @@ bool dependsOnInvoke(Value* V) { return true; User* curr = cast(current); - for (unsigned i = 0; i < curr->getNumOperands(); ++i) - if (visited.find(curr->getOperand(i)) == visited.end()) - worklist.push_back(curr->getOperand(i)); + std::map::iterator CI = invokeDep.find(curr); + if (CI != invokeDep.end()) { + if (CI->second) + 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; @@ -593,6 +606,7 @@ bool GVNPRE::runOnFunction(Function &F) { createdExpressions.clear(); availableOut.clear(); anticipatedIn.clear(); + invokeDep.clear(); std::map > generatedExpressions; std::map > generatedPhis;