]> granicus.if.org Git - llvm/commitdiff
[SCEV] Use isKnownViaNonRecursiveReasoning for smax simplification
authorKeno Fischer <keno@alumni.harvard.edu>
Wed, 1 May 2019 15:58:24 +0000 (15:58 +0000)
committerKeno Fischer <keno@alumni.harvard.edu>
Wed, 1 May 2019 15:58:24 +0000 (15:58 +0000)
Summary:
Commit
rL331949: SCEV] Do not use induction in isKnownPredicate for simplification umax

changed the codepath for umax from isKnownPredicate to
isKnownViaNonRecursiveReasoning to avoid compile time blow up (and as
I found out also stack overflows). However, there is an exact copy of
the code for umax that was lacking this change. In D50167 I want to unify
these codepaths, but to avoid that being a behavior change for the smax
case, pull this independent bit out of it.

Reviewed By: sanjoy
Differential Revision: https://reviews.llvm.org/D61166

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359693 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp

index d7635a82cf239ee8447e0245e5a5f0572166d441..6dccf338f7374da53aeaf561f5b5cee7b4485bfa 100644 (file)
@@ -3605,11 +3605,12 @@ ScalarEvolution::getSMaxExpr(SmallVectorImpl<const SCEV *> &Ops) {
   for (unsigned i = 0, e = Ops.size()-1; i != e; ++i)
     //  X smax Y smax Y  -->  X smax Y
     //  X smax Y         -->  X, if X is always greater than Y
-    if (Ops[i] == Ops[i+1] ||
-        isKnownPredicate(ICmpInst::ICMP_SGE, Ops[i], Ops[i+1])) {
+    if (Ops[i] == Ops[i + 1] || isKnownViaNonRecursiveReasoning(
+                                    ICmpInst::ICMP_SGE, Ops[i], Ops[i + 1])) {
       Ops.erase(Ops.begin()+i+1, Ops.begin()+i+2);
       --i; --e;
-    } else if (isKnownPredicate(ICmpInst::ICMP_SLE, Ops[i], Ops[i+1])) {
+    } else if (isKnownViaNonRecursiveReasoning(ICmpInst::ICMP_SLE, Ops[i],
+                                               Ops[i + 1])) {
       Ops.erase(Ops.begin()+i, Ops.begin()+i+1);
       --i; --e;
     }