aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-11-02 06:28:16 +0000
committerChris Lattner <sabre@nondot.org>2009-11-02 06:28:16 +0000
commite01985c95f63e96f3620c27fee6d8b33c2d0bbf8 (patch)
tree6644f94069d4f4fb1878bd1bfe53a7a1f166ed2b /lib/Transforms
parent574fa9e83caf11a65b3dec6e901f65d076ae3dde (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.cpp22
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);