Skip to content

Commit 3338186

Browse files
authored
[mlir][affine] Remove one-element linearize_index as a canonicalization (llvm#115542)
By analogy to the canonicalization for affine.delinearize_index, remove affine.linearize_index ops that only have one multi-index input. Example: Canonicalize ```mlir %1 = affine.linearize_index [%0] by (64) ``` to ```mlir %1 = %0 ``` While I'm here, get rid of an extra space in the syntax.
1 parent 4981f8c commit 3338186

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

mlir/include/mlir/Dialect/Affine/IR/AffineOps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,7 @@ def AffineLinearizeIndexOp : Affine_Op<"linearize_index",
11581158

11591159
let assemblyFormat = [{
11601160
(`disjoint` $disjoint^)? ` `
1161-
`[` $multi_index `]` `by` ` `
1161+
`[` $multi_index `]` `by`
11621162
custom<DynamicIndexList>($dynamic_basis, $static_basis, "::mlir::AsmParser::Delimiter::Paren")
11631163
attr-dict `:` type($linear_index)
11641164
}];

mlir/lib/Dialect/Affine/IR/AffineOps.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4734,11 +4734,29 @@ struct DropLinearizeUnitComponentsIfDisjointOrZero final
47344734
return success();
47354735
}
47364736
};
4737+
4738+
/// Rewrite `affine.linearize_index [%%x] by (%b)`, into `%x`.
4739+
///
4740+
/// By definition, that operation is `affine.apply affine_map<()[s0] -> (s0)>,`
4741+
/// which is the identity.
4742+
struct DropLinearizeOneBasisElement final
4743+
: OpRewritePattern<affine::AffineLinearizeIndexOp> {
4744+
using OpRewritePattern::OpRewritePattern;
4745+
4746+
LogicalResult matchAndRewrite(affine::AffineLinearizeIndexOp op,
4747+
PatternRewriter &rewriter) const override {
4748+
if (op.getStaticBasis().size() != 1 || op.getMultiIndex().size() != 1)
4749+
return failure();
4750+
rewriter.replaceOp(op, op.getMultiIndex().front());
4751+
return success();
4752+
}
4753+
};
47374754
} // namespace
47384755

47394756
void affine::AffineLinearizeIndexOp::getCanonicalizationPatterns(
47404757
RewritePatternSet &patterns, MLIRContext *context) {
4741-
patterns.add<DropLinearizeUnitComponentsIfDisjointOrZero>(context);
4758+
patterns.add<DropLinearizeUnitComponentsIfDisjointOrZero,
4759+
DropLinearizeOneBasisElement>(context);
47424760
}
47434761

47444762
//===----------------------------------------------------------------------===//

mlir/test/Dialect/Affine/canonicalize.mlir

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1566,3 +1566,14 @@ func.func @linearize_all_zero_unit_basis() -> index {
15661566
%ret = affine.linearize_index [%c0, %c0] by (1, 1) : index
15671567
return %ret : index
15681568
}
1569+
1570+
// -----
1571+
1572+
// CHECK-LABEL: @linearize_one_element_basis
1573+
// CHECK-SAME: (%[[arg0:.+]]: index, %[[arg1:.+]]: index)
1574+
// CHECK-NOT: affine.linearize_index
1575+
// CHECK: return %[[arg0]]
1576+
func.func @linearize_one_element_basis(%arg0: index, %arg1: index) -> index {
1577+
%ret = affine.linearize_index [%arg0] by (%arg1) : index
1578+
return %ret : index
1579+
}

0 commit comments

Comments
 (0)