mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-16 00:18:06 +00:00
Indvars: guard against exponential behavior in isHighCostExpansion.
This should always be done as a matter of principal. I don't have a case that exposes the problem. I just noticed this recently while scanning the code and realized I meant to fix it long ago. llvm-svn: 146438
This commit is contained in:
parent
a16a63f190
commit
67432b451b
@ -1238,7 +1238,11 @@ void IndVarSimplify::SimplifyAndExtend(Loop *L,
|
||||
/// BackedgeTakenInfo. If these expressions have not been reduced, then
|
||||
/// expanding them may incur additional cost (albeit in the loop preheader).
|
||||
static bool isHighCostExpansion(const SCEV *S, BranchInst *BI,
|
||||
SmallPtrSet<const SCEV*, 8> &Processed,
|
||||
ScalarEvolution *SE) {
|
||||
if (!Processed.insert(S))
|
||||
return false;
|
||||
|
||||
// If the backedge-taken count is a UDiv, it's very likely a UDiv that
|
||||
// ScalarEvolution's HowFarToZero or HowManyLessThans produced to compute a
|
||||
// precise expression, rather than a UDiv from the user's code. If we can't
|
||||
@ -1266,7 +1270,7 @@ static bool isHighCostExpansion(const SCEV *S, BranchInst *BI,
|
||||
if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(S)) {
|
||||
for (SCEVAddExpr::op_iterator I = Add->op_begin(), E = Add->op_end();
|
||||
I != E; ++I) {
|
||||
if (isHighCostExpansion(*I, BI, SE))
|
||||
if (isHighCostExpansion(*I, BI, Processed, SE))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -1309,7 +1313,8 @@ static bool canExpandBackedgeTakenCount(Loop *L, ScalarEvolution *SE) {
|
||||
if (!BI)
|
||||
return false;
|
||||
|
||||
if (isHighCostExpansion(BackedgeTakenCount, BI, SE))
|
||||
SmallPtrSet<const SCEV*, 8> Processed;
|
||||
if (isHighCostExpansion(BackedgeTakenCount, BI, Processed, SE))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user