diff options
author | Chris Lattner <sabre@nondot.org> | 2009-11-02 06:28:16 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-11-02 06:28:16 +0000 |
commit | e01985c95f63e96f3620c27fee6d8b33c2d0bbf8 (patch) | |
tree | 6644f94069d4f4fb1878bd1bfe53a7a1f166ed2b /lib/Transforms | |
parent | 574fa9e83caf11a65b3dec6e901f65d076ae3dde (diff) |
restore some code I removed in r85788, refactor it into
a shared place instead of duplicating it 4 times.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85792 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index 026c9f568c..553c94bebc 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -386,6 +386,20 @@ private: if (BBExecutable.count(I.getParent())) // Inst is executable? visit(I); } + + /// RemoveFromOverdefinedPHIs - If I has any entries in the + /// UsersOfOverdefinedPHIs map for PN, remove them now. + void RemoveFromOverdefinedPHIs(Instruction *I, PHINode *PN) { + if (UsersOfOverdefinedPHIs.empty()) return; + std::multimap<PHINode*, Instruction*>::iterator It, E; + tie(It, E) = UsersOfOverdefinedPHIs.equal_range(PN); + while (It != E) { + if (It->second == I) + UsersOfOverdefinedPHIs.erase(It++); + else + ++It; + } + } private: friend class InstVisitor<SCCPSolver>; @@ -904,8 +918,8 @@ void SCCPSolver::visitBinaryOperator(Instruction &I) { // added ourselves to the UsersOfOverdefinedPHIs list for the PHIs, // make sure to clean out any entries that we put there, for // efficiency. - UsersOfOverdefinedPHIs.erase(PN1); - UsersOfOverdefinedPHIs.erase(PN2); + RemoveFromOverdefinedPHIs(&I, PN1); + RemoveFromOverdefinedPHIs(&I, PN2); } markOverdefined(&I); @@ -986,8 +1000,8 @@ void SCCPSolver::visitCmpInst(CmpInst &I) { // added ourselves to the UsersOfOverdefinedPHIs list for the PHIs, // make sure to clean out any entries that we put there, for // efficiency. - UsersOfOverdefinedPHIs.erase(PN1); - UsersOfOverdefinedPHIs.erase(PN2); + RemoveFromOverdefinedPHIs(&I, PN1); + RemoveFromOverdefinedPHIs(&I, PN2); } markOverdefined(&I); |