[llvm] [DA] Add initial support for monotonicity check (PR #162280)
Ryotaro Kasuga via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 9 04:10:23 PDT 2025
================
@@ -177,13 +189,189 @@ void DependenceAnalysisWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequiredTransitive<LoopInfoWrapperPass>();
}
+namespace {
+
+/// The type of monotonicity of a SCEV. This property is defined with respect to
+/// the outermost loop that DA is analyzing.
+///
+/// This is designed to classify the behavior of AddRec expressions, and does
+/// not care about other SCEVs. For example, given the two loop-invariant values
+/// `A` and `B`, `A + B` is treated as Invariant even if the addition wraps.
+enum class SCEVMonotonicityType {
+ /// The expression is neither loop-invariant nor monotonic (or we fail to
+ /// prove it).
+ Unknown,
+
+ /// The expression is loop-invariant with respect to the outermost loop.
+ Invariant,
+
+ /// The expression is a (nested) affine AddRec and is monotonically increasing
+ /// or decreasing in a signed sense with respect to each loop. Monotonicity is
+ /// checked independently for each loop, and the expression is classified as
+ /// MultiSignedMonotonic if all AddRecs are nsw. For example, in the following
+ /// loop:
+ ///
+ /// for (i = 0; i < 100; i++)
+ /// for (j = 0; j < 100; j++)
+ /// A[i + j] = ...;
+ ///
+ /// The SCEV for `i + j` is classified as MultiSignedMonotonic. On the other
+ /// hand, in the following loop:
+ ///
+ /// for (i = 0; i < 100; i++)
+ /// for (j = 0; j <= (1ULL << 63); j++)
+ /// A[i + j] = ...;
+ ///
+ /// The SCEV for `i + j` is NOT classified as MultiMonotonic, because the
+ /// AddRec for `j` wraps in a signed sense. We don't consider the "direction"
+ /// of each AddRec. For example, in the following loop:
+ ///
+ /// for (int i = 0; i < 100; i++)
+ /// for (int j = 0; j < 100; j++)
+ /// A[i - j] = ...;
+ ///
+ /// The SCEV for `i - j` is classified as MultiSignedMonotonic, even though it
+ /// contains both increasing and decreasing AddRecs.
+ ///
+ /// Note that we don't check if the step recurrence can be zero. For
+ /// example,an AddRec `{0,+,%a}<nsw> is classifed as Monotonic if `%a` can be
+ /// zero. That is, the expression can be Invariant.
+ MultiSignedMonotonic,
----------------
kasuga-fj wrote:
I think this name is not good. Please let me know if you have a better one. (it would be better if the name also imply that the step value is loop invariant.)
https://github.com/llvm/llvm-project/pull/162280
More information about the llvm-commits
mailing list