diff options
author | Dale Johannesen <dalej@apple.com> | 2010-11-30 20:23:21 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2010-11-30 20:23:21 +0000 |
commit | f619b5a665f9972cde28f14e7b94b51502104b15 (patch) | |
tree | 7e19ec8c72690a4587fb3fc3284212e0bde7b71d /lib/Transforms | |
parent | c7373f8158c162509ce7aef932ccf01aa9419de7 (diff) | |
download | external_llvm-f619b5a665f9972cde28f14e7b94b51502104b15.zip external_llvm-f619b5a665f9972cde28f14e7b94b51502104b15.tar.gz external_llvm-f619b5a665f9972cde28f14e7b94b51502104b15.tar.bz2 |
Avoid exponential growth of a table. It feels like
there should be a better way to do this. PR 8679.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120457 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index 621508f..20254d7 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -481,6 +481,23 @@ private: } } + /// InsertInOverdefinedPHIs - Insert an entry in the UsersOfOverdefinedPHIS + /// map for I and PN, but if one is there already, do not create another. + /// (Duplicate entries do not break anything directly, but can lead to + /// exponential growth of the table in rare cases.) + void InsertInOverdefinedPHIs(Instruction *I, PHINode *PN) { + std::multimap<PHINode*, Instruction*>::iterator J, E; + bool found = false; + tie(J, E) = UsersOfOverdefinedPHIs.equal_range(PN); + for (; J != E; ++J) + if (J->second == I) { + found = true; + break; + } + if (!found) + UsersOfOverdefinedPHIs.insert(std::make_pair(PN, I)); + } + private: friend class InstVisitor<SCCPSolver>; @@ -973,9 +990,9 @@ void SCCPSolver::visitBinaryOperator(Instruction &I) { if (Result.isConstant()) { markConstant(IV, &I, Result.getConstant()); // Remember that this instruction is virtually using the PHI node - // operands. - UsersOfOverdefinedPHIs.insert(std::make_pair(PN1, &I)); - UsersOfOverdefinedPHIs.insert(std::make_pair(PN2, &I)); + // operands. + InsertInOverdefinedPHIs(&I, PN1); + InsertInOverdefinedPHIs(&I, PN2); return; } @@ -1056,8 +1073,8 @@ void SCCPSolver::visitCmpInst(CmpInst &I) { markConstant(&I, Result.getConstant()); // Remember that this instruction is virtually using the PHI node // operands. - UsersOfOverdefinedPHIs.insert(std::make_pair(PN1, &I)); - UsersOfOverdefinedPHIs.insert(std::make_pair(PN2, &I)); + InsertInOverdefinedPHIs(&I, PN1); + InsertInOverdefinedPHIs(&I, PN2); return; } |