[Mlir-commits] [mlir] [mlir][scf]: Avoid inserting affine.min when tiling dynamic operation sizes if possible (PR #113819)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Nov 6 09:40:57 PST 2024
================
@@ -186,18 +188,49 @@ static void checkSafeToTileToForall(TilingInterface op,
}
}
+/// Collect divider of the `ofr`.
+static void collectDividers(OpFoldResult ofr,
+ SmallVector<OpFoldResult> ÷rs) {
+ dividers.push_back(ofr);
+ if (ofr.is<Attribute>())
+ return;
+ auto mulOp = cast<Value>(ofr).getDefiningOp<arith::MulIOp>();
+ if (!mulOp)
+ return;
+
+ // Given `ofr` = `x` * `y`, all dividers of `x` and `y` are dividers of `ofr`.
+ collectDividers(mulOp.getLhs(), dividers);
+ collectDividers(mulOp.getRhs(), dividers);
+}
+
/// Check if `stride` evenly divides the trip count `size - offset`.
static bool tileDividesIterationDomain(Range loopRange) {
+ std::optional<int64_t> strideAsInt = getConstantIntValue(loopRange.stride);
std::optional<int64_t> offsetAsInt = getConstantIntValue(loopRange.offset);
- if (!offsetAsInt)
- return false;
std::optional<int64_t> sizeAsInt = getConstantIntValue(loopRange.size);
- if (!sizeAsInt)
- return false;
- std::optional<int64_t> strideAsInt = getConstantIntValue(loopRange.stride);
- if (!strideAsInt)
- return false;
- return ((sizeAsInt.value() - offsetAsInt.value()) % strideAsInt.value() == 0);
+ if (strideAsInt && offsetAsInt && sizeAsInt)
----------------
MaheshRavishankar wrote:
nit: Please add `{` `}` around multi-line statements.
https://github.com/llvm/llvm-project/pull/113819
More information about the Mlir-commits
mailing list