mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 13:10:34 +00:00
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
This commit is contained in:
parent
c7373f8158
commit
f619b5a665
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user