SCEV] Do not use induction in isKnownPredicate for simplification umax.

During simplification umax we trigger isKnownPredicate twice. As a first attempt it
tries the induction. To do that it tries to get post increment of SCEV.
Re-writing the SCEV may result in simplification of umax. If the SCEV contains a lot
of umax operations this recursion becomes very slow.

The added test demonstrates the slow behavior.

To resolve this we use only simple ways to check whether the predicate is known.

Reviewers: sanjoy, mkazantsev
Reviewed By: sanjoy
Subscribers: lebedev.ri, javed.absar, llvm-commits
Differential Revision: https://reviews.llvm.org/D46046

llvm-svn: 331949
This commit is contained in:
Serguei Katkov 2018-05-10 01:40:43 +00:00
parent 553d451e95
commit 7d02f059e7
1 changed files with 6 additions and 5 deletions

View File

@ -3517,12 +3517,13 @@ ScalarEvolution::getUMaxExpr(SmallVectorImpl<const SCEV *> &Ops) {
for (unsigned i = 0, e = Ops.size()-1; i != e; ++i)
// X umax Y umax Y --> X umax Y
// X umax Y --> X, if X is always greater than Y
if (Ops[i] == Ops[i+1] ||
isKnownPredicate(ICmpInst::ICMP_UGE, Ops[i], Ops[i+1])) {
Ops.erase(Ops.begin()+i+1, Ops.begin()+i+2);
if (Ops[i] == Ops[i + 1] || isKnownViaNonRecursiveReasoning(
ICmpInst::ICMP_UGE, Ops[i], Ops[i + 1])) {
Ops.erase(Ops.begin() + i + 1, Ops.begin() + i + 2);
--i; --e;
} else if (isKnownPredicate(ICmpInst::ICMP_ULE, Ops[i], Ops[i+1])) {
Ops.erase(Ops.begin()+i, Ops.begin()+i+1);
} else if (isKnownViaNonRecursiveReasoning(ICmpInst::ICMP_ULE, Ops[i],
Ops[i + 1])) {
Ops.erase(Ops.begin() + i, Ops.begin() + i + 1);
--i; --e;
}