[llvm] [SCEV] Add predicate in SolveLinEq to ensure B is a multiple of A. (PR #108777)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 16 02:21:22 PDT 2024
================
@@ -10137,8 +10140,17 @@ static const SCEV *SolveLinEquationWithOverflow(const APInt &A, const SCEV *B,
//
// B is divisible by D if and only if the multiplicity of prime factor 2 for B
// is not less than multiplicity of this prime factor for D.
- if (SE.getMinTrailingZeros(B) < Mult2)
- return SE.getCouldNotCompute();
+ if (SE.getMinTrailingZeros(B) < Mult2) {
+ if (!Predicates)
+ return SE.getCouldNotCompute();
+ // Try to add a predicate ensuring B is a multiple of A.
+ const SCEV *URem = SE.getURemExpr(B, SE.getConstant(A));
+ const SCEV *Zero = SE.getZero(B->getType());
+ // Avoid adding a predicate that is known to be false.
+ if (SE.isKnownPredicate(CmpInst::ICMP_NE, URem, Zero))
+ return SE.getCouldNotCompute();
+ Predicates->insert(SE.getEqualPredicate(URem, Zero));
----------------
david-arm wrote:
Just thinking in terms of compile-time here - can you get the equivalent result if you first compute `SE.getEqualPredicate(URem, Zero)` and then test if the answer is constant-false? I don't know if `isKnownPredicate` is expensive or not and whether or not we care.
https://github.com/llvm/llvm-project/pull/108777
More information about the llvm-commits
mailing list