[Mlir-commits] [mlir] [mlir][affine] Define `affine.linearize_index` (PR #114480)
Jakub Kuderski
llvmlistbot at llvm.org
Mon Nov 4 09:25:37 PST 2024
================
@@ -4664,6 +4664,112 @@ void affine::AffineDelinearizeIndexOp::getCanonicalizationPatterns(
patterns.insert<DropDelinearizeOfSingleLoop, DropUnitExtentBasis>(context);
}
+//===----------------------------------------------------------------------===//
+// LinearizeIndexOp
+//===----------------------------------------------------------------------===//
+
+void AffineLinearizeIndexOp::build(OpBuilder &odsBuilder,
+ OperationState &odsState,
+ ValueRange multiIndex, ValueRange basis,
+ bool disjoint) {
+ SmallVector<Value> dynamicBasis;
+ SmallVector<int64_t> staticBasis;
+ dispatchIndexOpFoldResults(getAsOpFoldResult(basis), dynamicBasis,
+ staticBasis);
+ build(odsBuilder, odsState, multiIndex, dynamicBasis, staticBasis, disjoint);
+}
+
+void AffineLinearizeIndexOp::build(OpBuilder &odsBuilder,
+ OperationState &odsState,
+ ValueRange multiIndex,
+ ArrayRef<OpFoldResult> basis,
+ bool disjoint) {
+ SmallVector<Value> dynamicBasis;
+ SmallVector<int64_t> staticBasis;
+ dispatchIndexOpFoldResults(basis, dynamicBasis, staticBasis);
+ build(odsBuilder, odsState, multiIndex, dynamicBasis, staticBasis, disjoint);
+}
+
+void AffineLinearizeIndexOp::build(OpBuilder &odsBuilder,
+ OperationState &odsState,
+ ValueRange multiIndex,
+ ArrayRef<int64_t> basis, bool disjoint) {
+ build(odsBuilder, odsState, multiIndex, ValueRange{}, basis, disjoint);
+}
+
+LogicalResult AffineLinearizeIndexOp::verify() {
+ if (getStaticBasis().empty())
+ return emitOpError("basis should not be empty");
+ if (getMultiIndex().size() != getStaticBasis().size())
+ return emitOpError("should be passed an index for each basis element");
+ auto dynamicMarkersCount =
+ llvm::count_if(getStaticBasis(), ShapedType::isDynamic);
+ if (static_cast<size_t>(dynamicMarkersCount) != getDynamicBasis().size())
+ return emitOpError(
+ "mismatch between dynamic and static basis (kDynamic marker but no "
+ "corresponding dynamic basis entry) -- this can only happen due to an "
+ "incorrect fold/rewrite");
+ return success();
+}
+
+namespace {
+/// Rewrite `affine.linearize_index disjoint [%...a, %x, %...b] by (%...c, 1,
+/// %...d)` to `affine.linearize_index disjoint [%...a, %...b] by (%...c,
+/// %...d)`.
+
+/// Note that `disjoint` is required here, because, without it, we could have
+/// `affine.linearize_index [%...a, %c64, %...b] by (%...c, 1, %...d)`
+/// is a valid operation where the `%c64` cannot be trivially dropped.
+///
+/// Alternatively, if `%x` in the above is a known constant 0, remove it even if
+/// the operation isn't asserted to be `disjoint`.
+struct DropLinearizeUnitComponentsIfDisjointOrZero
+ : public OpRewritePattern<affine::AffineLinearizeIndexOp> {
----------------
kuhar wrote:
```suggestion
struct DropLinearizeUnitComponentsIfDisjointOrZero final
: OpRewritePattern<affine::AffineLinearizeIndexOp> {
```
https://github.com/llvm/llvm-project/pull/114480
More information about the Mlir-commits
mailing list