Make instcombine O(N) instead of O(N^2) in code where the same simplifiable constant is used many times.

Part of rdar://9471075.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131979 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2011-05-24 18:52:07 +00:00
parent 8ec0c1c07b
commit a4d4aeb387

View File

@ -1385,8 +1385,8 @@ static bool AddReachableCodeToWorklist(BasicBlock *BB,
Worklist.push_back(BB); Worklist.push_back(BB);
SmallVector<Instruction*, 128> InstrsForInstCombineWorklist; SmallVector<Instruction*, 128> InstrsForInstCombineWorklist;
SmallPtrSet<ConstantExpr*, 64> FoldedConstants; DenseMap<ConstantExpr*, Constant*> FoldedConstants;
do { do {
BB = Worklist.pop_back_val(); BB = Worklist.pop_back_val();
@ -1421,14 +1421,15 @@ static bool AddReachableCodeToWorklist(BasicBlock *BB,
i != e; ++i) { i != e; ++i) {
ConstantExpr *CE = dyn_cast<ConstantExpr>(i); ConstantExpr *CE = dyn_cast<ConstantExpr>(i);
if (CE == 0) continue; if (CE == 0) continue;
// If we already folded this constant, don't try again. Constant*& FoldRes = FoldedConstants[CE];
if (!FoldedConstants.insert(CE)) if (!FoldRes)
continue; FoldRes = ConstantFoldConstantExpression(CE, TD);
if (!FoldRes)
Constant *NewC = ConstantFoldConstantExpression(CE, TD); FoldRes = CE;
if (NewC && NewC != CE) {
*i = NewC; if (FoldRes != CE) {
*i = FoldRes;
MadeIRChange = true; MadeIRChange = true;
} }
} }