forked from OSchip/llvm-project
[NFC] Move functon from IndVarSimplify to SCEV
This function can be reused in other places. Differential Revision: https://reviews.llvm.org/D87274 Reviewed By: fhahn, lebedev.ri
This commit is contained in:
parent
1bb1eac6b1
commit
795e4ee9d2
|
@ -768,6 +768,11 @@ public:
|
|||
return getBackedgeTakenCount(L, ConstantMaximum);
|
||||
}
|
||||
|
||||
/// Return a symbolic upper bound for the backedge taken count of the loop.
|
||||
/// This is more general than getConstantMaxBackedgeTakenCount as it returns
|
||||
/// an arbitrary expression as opposed to only constants.
|
||||
const SCEV* computeMaxBackedgeTakenCount(const Loop *L);
|
||||
|
||||
/// Return true if the backedge taken count is either the value returned by
|
||||
/// getConstantMaxBackedgeTakenCount or zero.
|
||||
bool isBackedgeTakenCountMaxOrZero(const Loop *L);
|
||||
|
|
|
@ -12506,3 +12506,28 @@ bool ScalarEvolution::matchURem(const SCEV *Expr, const SCEV *&LHS,
|
|||
MatchURemWithDivisor(getNegativeSCEV(Mul->getOperand(0)));
|
||||
return false;
|
||||
}
|
||||
|
||||
const SCEV* ScalarEvolution::computeMaxBackedgeTakenCount(const Loop *L) {
|
||||
SmallVector<BasicBlock*, 16> ExitingBlocks;
|
||||
L->getExitingBlocks(ExitingBlocks);
|
||||
|
||||
// Form an expression for the maximum exit count possible for this loop. We
|
||||
// merge the max and exact information to approximate a version of
|
||||
// getConstantMaxBackedgeTakenCount which isn't restricted to just constants.
|
||||
SmallVector<const SCEV*, 4> ExitCounts;
|
||||
for (BasicBlock *ExitingBB : ExitingBlocks) {
|
||||
const SCEV *ExitCount = getExitCount(L, ExitingBB);
|
||||
if (isa<SCEVCouldNotCompute>(ExitCount))
|
||||
ExitCount = getExitCount(L, ExitingBB,
|
||||
ScalarEvolution::ConstantMaximum);
|
||||
if (!isa<SCEVCouldNotCompute>(ExitCount)) {
|
||||
assert(DT.dominates(ExitingBB, L->getLoopLatch()) &&
|
||||
"We should only have known counts for exiting blocks that "
|
||||
"dominate latch!");
|
||||
ExitCounts.push_back(ExitCount);
|
||||
}
|
||||
}
|
||||
if (ExitCounts.empty())
|
||||
return getCouldNotCompute();
|
||||
return getUMinFromMismatchedTypes(ExitCounts);
|
||||
}
|
||||
|
|
|
@ -2329,36 +2329,6 @@ bool IndVarSimplify::sinkUnusedInvariants(Loop *L) {
|
|||
return MadeAnyChanges;
|
||||
}
|
||||
|
||||
/// Return a symbolic upper bound for the backedge taken count of the loop.
|
||||
/// This is more general than getConstantMaxBackedgeTakenCount as it returns
|
||||
/// an arbitrary expression as opposed to only constants.
|
||||
/// TODO: Move into the ScalarEvolution class.
|
||||
static const SCEV* getMaxBackedgeTakenCount(ScalarEvolution &SE,
|
||||
DominatorTree &DT, Loop *L) {
|
||||
SmallVector<BasicBlock*, 16> ExitingBlocks;
|
||||
L->getExitingBlocks(ExitingBlocks);
|
||||
|
||||
// Form an expression for the maximum exit count possible for this loop. We
|
||||
// merge the max and exact information to approximate a version of
|
||||
// getConstantMaxBackedgeTakenCount which isn't restricted to just constants.
|
||||
SmallVector<const SCEV*, 4> ExitCounts;
|
||||
for (BasicBlock *ExitingBB : ExitingBlocks) {
|
||||
const SCEV *ExitCount = SE.getExitCount(L, ExitingBB);
|
||||
if (isa<SCEVCouldNotCompute>(ExitCount))
|
||||
ExitCount = SE.getExitCount(L, ExitingBB,
|
||||
ScalarEvolution::ConstantMaximum);
|
||||
if (!isa<SCEVCouldNotCompute>(ExitCount)) {
|
||||
assert(DT.dominates(ExitingBB, L->getLoopLatch()) &&
|
||||
"We should only have known counts for exiting blocks that "
|
||||
"dominate latch!");
|
||||
ExitCounts.push_back(ExitCount);
|
||||
}
|
||||
}
|
||||
if (ExitCounts.empty())
|
||||
return SE.getCouldNotCompute();
|
||||
return SE.getUMinFromMismatchedTypes(ExitCounts);
|
||||
}
|
||||
|
||||
bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &Rewriter) {
|
||||
SmallVector<BasicBlock*, 16> ExitingBlocks;
|
||||
L->getExitingBlocks(ExitingBlocks);
|
||||
|
@ -2391,7 +2361,7 @@ bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &Rewriter) {
|
|||
return false;
|
||||
|
||||
// Get a symbolic upper bound on the loop backedge taken count.
|
||||
const SCEV *MaxExitCount = getMaxBackedgeTakenCount(*SE, *DT, L);
|
||||
const SCEV *MaxExitCount = SE->computeMaxBackedgeTakenCount(L);
|
||||
if (isa<SCEVCouldNotCompute>(MaxExitCount))
|
||||
return false;
|
||||
|
||||
|
|
Loading…
Reference in New Issue