Skip to content

Commit 60d1e17

Browse files
committed
[mlir][tensor][linalg] Move Pack/Unpack Ops to Linalg (3/4)
This is merely moving code around, no new functionality is added. PATCH 3: Update/move/replace all tests for `tensor.{pack|unpack}` with identical tests for `linalg.{pack|unpack}`. Updates the testing infrastructure accordingly and copy all the required transformations. To help reviewing, below is an overview of non-obvious code moves: 1. Tests from: * "mlir/test/Dialect/Tensor/tiling.mlir" are moved to to: * "mlir/test/Dialect/Linalg/transform-op-tile-pack-unpack.mlir" 2. Tests from: * "mlir/test/Dialect/Tensor/fold-empty-op.mlir" are moved to: * "mlir/test/Dialect/Linalg/fold-empty-op.mlir" CONTEXT: This change was discussed in the following RFC: * https://discourse.llvm.org/t/rfc-move-tensor-pack-and-tensor-unpack-into-linalg
1 parent ee159c2 commit 60d1e17

File tree

56 files changed

+2939
-1966
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+2939
-1966
lines changed

mlir/include/mlir/Dialect/Linalg/TransformOps/LinalgTransformOps.td

Lines changed: 53 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def ApplyDecomposeTensorPackUnpackPatternsOp
4545
: Op<Transform_Dialect, "apply_patterns.linalg.decompose_pack_unpack",
4646
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
4747
let description = [{
48-
Collect patterns to decompose tensor.pack and tensor.unpack into e.g.
48+
Collect patterns to decompose linalg.pack and linalg.unpack into e.g.
4949
tensor::PadOp, linalg::transposeOp Ops. Requires all outer dims to be unit.
5050
}];
5151

@@ -126,6 +126,28 @@ def ApplyPadVectorizationPatternsOp : Op<Transform_Dialect,
126126
let assemblyFormat = "attr-dict";
127127
}
128128

129+
def ApplyFoldIntoPackAndUnpackPatternsOp : Op<Transform_Dialect,
130+
"apply_patterns.tensor.fold_into_pack_and_unpack",
131+
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
132+
let description = [{
133+
Indicates that operations like tensor.pad and tensor.extract_slice should
134+
be folded into tensor.pack and tensor.unpack operations, respectively.
135+
}];
136+
137+
let assemblyFormat = "attr-dict";
138+
}
139+
140+
def ApplyFoldPackUnpackIntoEmptyPatternsOp : Op<Transform_Dialect,
141+
"apply_patterns.linalg.fold_pack_unpack_into_empty",
142+
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
143+
let description = [{
144+
// TODO:
145+
}];
146+
147+
let arguments = (ins DefaultValuedAttr<BoolAttr, "false">:$fold_single_use_only);
148+
let assemblyFormat = "attr-dict";
149+
}
150+
129151
//===----------------------------------------------------------------------===//
130152
// BufferizeToAllocationOp
131153
//===----------------------------------------------------------------------===//
@@ -547,19 +569,18 @@ def LowerPackOp : Op<Transform_Dialect, "structured.lower_pack", [
547569
TransformOpInterface,
548570
ReportTrackingListenerFailuresOpTrait]> {
549571
let description = [{
550-
Rewrite a tensor.pack into tensor.pad + tensor.expand_shape + linalg.transpose.
572+
Rewrite a linalg.pack into tensor.pad + tensor.expand_shape + linalg.transpose.
551573

552574
#### Return modes
553575

554-
This operation ignores non-pack ops and drops them in the return.
555-
This operation produces a silenceable failure if the rewrite fails for any
556-
reason.
557-
If all the operations referred to by the `target` are rewritten, the
558-
transform succeeds.
559-
Return handles to the newly produced pad, expand_shape and transpose ops.
576+
This operation ignores non-pack ops and drops them in the return. This
577+
operation produces a silenceable failure if the rewrite fails for any
578+
reason. If all the operations referred to by the `target` are rewritten,
579+
the transform succeeds. Return handles to the newly produced pad,
580+
expand_shape and transpose ops.
560581
}];
561582

562-
let arguments = (ins Transform_ConcreteOpType<"tensor.pack">:$target,
583+
let arguments = (ins Transform_ConcreteOpType<"linalg.pack">:$target,
563584
DefaultValuedAttr<BoolAttr, "true">:$lowerPadLikeWithInsertSlice);
564585
let results = (outs Transform_ConcreteOpType<"tensor.pad">:$pad_op,
565586
Transform_ConcreteOpType<"tensor.expand_shape">:$expand_shape_op,
@@ -571,7 +592,7 @@ def LowerPackOp : Op<Transform_Dialect, "structured.lower_pack", [
571592
let extraClassDeclaration = [{
572593
::mlir::DiagnosedSilenceableFailure applyToOne(
573594
::mlir::transform::TransformRewriter &rewriter,
574-
::mlir::tensor::PackOp target,
595+
::mlir::linalg::PackOp target,
575596
::mlir::transform::ApplyToEachResultList &transformResults,
576597
::mlir::transform::TransformState &state);
577598
}];
@@ -587,20 +608,19 @@ def LowerUnPackOp : Op<Transform_Dialect, "structured.lower_unpack", [
587608
TransformOpInterface,
588609
ReportTrackingListenerFailuresOpTrait]> {
589610
let description = [{
590-
Lower a tensor.unpack into empty + linalg.transpose + tensor.collapse_shape +
611+
Lower a linalg.unpack into empty + linalg.transpose + tensor.collapse_shape +
591612
tensor.extract_slice.
592613

593614
#### Return modes
594615

595-
This operation ignores non-unpack ops and drops them in the return.
596-
This operation produces a silenceable failure if the rewrite fails for any
597-
reason.
598-
If all the operations referred to by the `target` are rewritten, the
599-
transform succeeds.
600-
Return handles to the newly produced empty, transpose, collapse_shape and extract_slice ops.
616+
This operation ignores non-unpack ops and drops them in the return. This
617+
operation produces a silenceable failure if the rewrite fails for any
618+
reason. If all the operations referred to by the `target` are rewritten,
619+
the transform succeeds. Return handles to the newly produced empty,
620+
transpose, collapse_shape and extract_slice ops.
601621
}];
602622

603-
let arguments = (ins Transform_ConcreteOpType<"tensor.unpack">:$target,
623+
let arguments = (ins Transform_ConcreteOpType<"linalg.unpack">:$target,
604624
DefaultValuedAttr<BoolAttr, "true">:$lowerUnpadLikeWithExtractSlice);
605625
let results = (outs Transform_ConcreteOpType<"tensor.empty">:$empty_op,
606626
Transform_ConcreteOpType<"linalg.transpose">:$transpose_op,
@@ -613,7 +633,7 @@ def LowerUnPackOp : Op<Transform_Dialect, "structured.lower_unpack", [
613633
let extraClassDeclaration = [{
614634
::mlir::DiagnosedSilenceableFailure applyToOne(
615635
::mlir::transform::TransformRewriter &rewriter,
616-
::mlir::tensor::UnPackOp target,
636+
::mlir::linalg::UnPackOp target,
617637
::mlir::transform::ApplyToEachResultList &transformResults,
618638
::mlir::transform::TransformState &state);
619639
}];
@@ -791,7 +811,7 @@ def PackOp : Op<Transform_Dialect, "structured.pack", [
791811
Specifying a packed size of 0 for an iterator removes it from consideration
792812
for packing.
793813

794-
`tensor.pack` (resp. `tensor.unpack`) operations are inserted for the operands
814+
`linalg.pack` (resp. `linalg.unpack`) operations are inserted for the operands
795815
(resp. results) that need to be packed (resp. unpacked) according to the
796816
`packed_sizes` specification.
797817

@@ -980,7 +1000,7 @@ def PackTransposeOp : Op<Transform_Dialect, "structured.pack_transpose", [
9801000
DeclareOpInterfaceMethods<TransformOpInterface>,
9811001
ReportTrackingListenerFailuresOpTrait]> {
9821002
let description = [{
983-
Apply a transposition to a single `tensor.pack` (resp. `tensor.unpack`) and
1003+
Apply a transposition to a single `linalg.pack` (resp. `linalg.unpack`) and
9841004
update the `linalg.generic` op that consumes (resp. produces) the operation.
9851005

9861006
This transform allows composing a simple `structured.pack` with additional
@@ -989,19 +1009,19 @@ def PackTransposeOp : Op<Transform_Dialect, "structured.pack_transpose", [
9891009

9901010
The transpose spec must specify at least one of `outer_perm` or `inner_perm`
9911011
attributes, which will act upon the `outer_dims_perm` or `inner_dims_pos` of
992-
the specified `tensor.pack` or `tensor.unpack` op.
1012+
the specified `linalg.pack` or `linalg.unpack` op.
9931013

994-
If the `target` of this op is a `tensor.pack` then a new `tensor.empty` will
995-
be created along with transposed versions of the `tensor.pack` and the
1014+
If the `target` of this op is a `linalg.pack` then a new `tensor.empty` will
1015+
be created along with transposed versions of the `linalg.pack` and the
9961016
consuming `linalg.generic`, which is expected to be the sole consumer.
9971017

998-
If the `target` of this op is a `tensor.unpack` then the whole pack / compute
999-
/ unpack chain will be transposed and transposed clones of `tensor.pack`,
1000-
the consuming `linalg.generic` and the tail `tensor.pack` will be created.
1018+
If the `target` of this op is a `linalg.unpack` then the whole pack / compute
1019+
/ unpack chain will be transposed and transposed clones of `linalg.pack`,
1020+
the consuming `linalg.generic` and the tail `linalg.pack` will be created.
10011021

10021022
#### Return modes
10031023

1004-
This operation targets a single `tensor.pack` / `tensor.unpack` op and a
1024+
This operation targets a single `linalg.pack` / `linalg.unpack` op and a
10051025
single matching `linalg.generic` that consumes / produces the op. Otherwise,
10061026
it produces a silenceableFailure.
10071027

@@ -1011,9 +1031,9 @@ def PackTransposeOp : Op<Transform_Dialect, "structured.pack_transpose", [
10111031
reason.
10121032

10131033
This operation returns 3 handles, one to the transformed LinalgOp, one to
1014-
the transformed `tensor.pack` and one to the transformed `tensor.unpack`.
1015-
The last handle for `tensor.unpack` is empty if `target_pack_or_unpack_op`
1016-
was not itself a `tensor.unpack`.
1034+
the transformed `linalg.pack` and one to the transformed `linalg.unpack`.
1035+
The last handle for `linalg.unpack` is empty if `target_pack_or_unpack_op`
1036+
was not itself a `linalg.unpack`.
10171037
}];
10181038

10191039
let arguments = (ins TransformHandleTypeInterface:$target_pack_or_un_pack_op,
@@ -1143,7 +1163,7 @@ def HoistPadBuildPackingLoopNestOp :
11431163
creates the packing loop nest required by the hoist_pad operation and makes
11441164
that functionality available independently.
11451165

1146-
TODO: In the future, we should consider rewriting as a tensor.pack after
1166+
TODO: In the future, we should consider rewriting as a linalg.pack after
11471167
hoisting since this abstraction is now available.
11481168

11491169
#### Return modes
@@ -1182,7 +1202,7 @@ def HoistPadOp : Op<Transform_Dialect, "structured.hoist_pad",
11821202
Hoist the tensor.pad target operation by at most the given number of loops.
11831203
Optionally apply the transpose attribute to the inner dimensions.
11841204

1185-
TODO: In the future, we should consider rewriting as a tensor.pack after
1205+
TODO: In the future, we should consider rewriting as a linalg.pack after
11861206
hoisting since this abstraction is now available.
11871207
TODO: Maybe also return the linalg.generic transpose created at some point.
11881208

mlir/include/mlir/Dialect/Linalg/Transforms/TilingInterfaceImpl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ class DialectRegistry;
1414

1515
namespace linalg {
1616
void registerTilingInterfaceExternalModels(DialectRegistry &registry);
17+
18+
/// Similar to the above registeration, but it is only for `tensor.pack` and
19+
/// `tensor.unpack` ops.
20+
void registerTilingInterfaceExternalModelsForPackUnPackOps(
21+
DialectRegistry &registry);
1722
} // namespace linalg
1823
} // namespace mlir
1924

mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ buildPackingLoopNest(RewriterBase &rewriter, tensor::PadOp opToHoist,
572572
/// packed tensor. A `transposeVector` can change the storage order of the
573573
/// padded tensor but does not change the order of the pack or compute loops.
574574
///
575-
/// TODO: In the future, we should consider rewriting as a tensor.pack after
575+
/// TODO: In the future, we should consider rewriting as a linalg.pack after
576576
/// hoisting since this abstraction is now available.
577577
///
578578
/// Example in pseudo-mlir:
@@ -1121,7 +1121,7 @@ struct LowerPackResult {
11211121

11221122
/// Rewrite pack as pad + reshape + transpose.
11231123
FailureOr<LowerPackResult> lowerPack(RewriterBase &rewriter,
1124-
tensor::PackOp packOp,
1124+
linalg::PackOp packOp,
11251125
bool lowerPadLikeWithInsertSlice = true);
11261126

11271127
struct LowerUnPackOpResult {
@@ -1133,14 +1133,14 @@ struct LowerUnPackOpResult {
11331133

11341134
/// Rewrite pack as empty + transpose + reshape + extract_slice.
11351135
FailureOr<LowerUnPackOpResult>
1136-
lowerUnPack(RewriterBase &rewriter, tensor::UnPackOp unPackOp,
1136+
lowerUnPack(RewriterBase &rewriter, linalg::UnPackOp unPackOp,
11371137
bool lowerUnpadLikeWithExtractSlice = true);
11381138

11391139
/// Struct to hold the result of a `pack` call.
11401140
struct PackResult {
1141-
SmallVector<tensor::PackOp> packOps;
1141+
SmallVector<linalg::PackOp> packOps;
11421142
linalg::LinalgOp packedLinalgOp;
1143-
SmallVector<tensor::UnPackOp> unPackOps;
1143+
SmallVector<linalg::UnPackOp> unPackOps;
11441144
};
11451145
/// Implement packing of a single LinalgOp by `packedSizes`.
11461146
/// There must be one packedSizes entry per `linalgOp` iterator.
@@ -1150,9 +1150,9 @@ FailureOr<PackResult> pack(RewriterBase &rewriter, linalg::LinalgOp linalgOp,
11501150

11511151
/// Struct to hold the result of a `packTranspose` call.
11521152
struct PackTransposeResult {
1153-
tensor::PackOp transposedPackOp;
1153+
linalg::PackOp transposedPackOp;
11541154
linalg::LinalgOp transposedLinalgOp;
1155-
tensor::UnPackOp transposedUnPackOp;
1155+
linalg::UnPackOp transposedUnPackOp;
11561156
};
11571157
/// Transpose a single PackOp -> LinalgOp -> UnPackOp chain and return the
11581158
/// transposed PackOp -> LinalgOp -> UnPackOp chain after replacements.
@@ -1163,8 +1163,8 @@ struct PackTransposeResult {
11631163
/// 3. `outerPerm` (resp. `innerPerm`) must be valid permutations of
11641164
/// `packOp.getOuterDimsPerm` (resp. `packOp.getInnerDimsPerm`) or empty.
11651165
FailureOr<PackTransposeResult>
1166-
packTranspose(RewriterBase &rewriter, tensor::PackOp packOp,
1167-
linalg::LinalgOp linalgOp, tensor::UnPackOp maybeUnPackOp,
1166+
packTranspose(RewriterBase &rewriter, linalg::PackOp packOp,
1167+
linalg::LinalgOp linalgOp, linalg::UnPackOp maybeUnPackOp,
11681168
ArrayRef<int64_t> outerPerm, ArrayRef<int64_t> innerPerm);
11691169

11701170
/// Pack a LinalgOp by greedily inferring matmul dimensions (m, n, k) where m
@@ -1517,15 +1517,15 @@ struct DecomposePadOpPattern : public OpRewritePattern<tensor::PadOp> {
15171517
const SmallVector<Value> &dynSizes) const;
15181518
};
15191519

1520-
/// Rewrites a tensor::PackOp into a sequence of:
1520+
/// Rewrites a linalg::PackOp into a sequence of:
15211521
/// * tensor::PadOp + linalg::TransposeOp + tensor::EmptyOp +
15221522
/// tensor::InsertSliceOp ops.
15231523
///
1524-
/// Requires that all the outer dims of the input tensor::PackOp are 1.
1524+
/// Requires that all the outer dims of the input linalg::PackOp are 1.
15251525
///
15261526
/// Before:
15271527
/// ```
1528-
/// %packed = tensor.pack %input
1528+
/// %packed = linalg.pack %input
15291529
/// padding_value(%pad : f32)
15301530
/// inner_dims_pos = [1, 0]
15311531
/// inner_tiles = [2, %high]
@@ -1551,20 +1551,20 @@ struct DecomposePadOpPattern : public OpRewritePattern<tensor::PadOp> {
15511551
/// : tensor<2x?xf32> into tensor<1x1x2x?xf32>
15521552
/// ```
15531553
struct DecomposeOuterUnitDimsPackOpPattern
1554-
: public OpRewritePattern<tensor::PackOp> {
1555-
using OpRewritePattern<tensor::PackOp>::OpRewritePattern;
1556-
LogicalResult matchAndRewrite(tensor::PackOp packOp,
1554+
: public OpRewritePattern<linalg::PackOp> {
1555+
using OpRewritePattern<linalg::PackOp>::OpRewritePattern;
1556+
LogicalResult matchAndRewrite(linalg::PackOp packOp,
15571557
PatternRewriter &rewriter) const override;
15581558
};
15591559

1560-
/// Rewrites a tensor::UnPackOp into a sequence of rank-reduced
1560+
/// Rewrites a linalg::UnPackOp into a sequence of rank-reduced
15611561
/// * tensor::ExtractSliceOp + linalg::TransposeOp + tensor::InsertSliceOp
15621562
///
1563-
/// Requires that all the outer dims of the input tensor::PackOp are 1.
1563+
/// Requires that all the outer dims of the input linalg::PackOp are 1.
15641564
///
15651565
/// Before:
15661566
/// ```
1567-
/// %packed = tensor.unpack %input
1567+
/// %packed = linalg.unpack %input
15681568
/// inner_dims_pos = [1, 0]
15691569
/// inner_tiles = [2, 8]
15701570
/// into %output : tensor<1x1x2x8xf32> -> tensor<5x1xf32>
@@ -1585,9 +1585,9 @@ struct DecomposeOuterUnitDimsPackOpPattern
15851585
/// : tensor<8x2xf32> to tensor<5x1xf32>
15861586
/// ```
15871587
struct DecomposeOuterUnitDimsUnPackOpPattern
1588-
: public OpRewritePattern<tensor::UnPackOp> {
1589-
using OpRewritePattern<tensor::UnPackOp>::OpRewritePattern;
1590-
LogicalResult matchAndRewrite(tensor::UnPackOp unpackOp,
1588+
: public OpRewritePattern<linalg::UnPackOp> {
1589+
using OpRewritePattern<linalg::UnPackOp>::OpRewritePattern;
1590+
LogicalResult matchAndRewrite(linalg::UnPackOp unpackOp,
15911591
PatternRewriter &rewriter) const override;
15921592
};
15931593

@@ -1709,7 +1709,7 @@ void populateLinalgGenericOpsSpecializationPatterns(
17091709
void populateDecomposeConvolutionPatterns(RewritePatternSet &patterns,
17101710
PatternBenefit benefit = 1);
17111711

1712-
/// Populates patterns to decompose tensor.pack and tensor.unpack Ops into e.g.
1712+
/// Populates patterns to decompose linalg.pack and linalg.unpack Ops into e.g.
17131713
/// tensor.pad, linalg.transpose, tensor.{insert|extract}_slice. Require all
17141714
/// outer dims to be unit.
17151715
void populateDecomposePackUnpackPatterns(RewritePatternSet &patterns);
@@ -1776,7 +1776,7 @@ void populateElementwiseOpsFusionPatterns(
17761776
RewritePatternSet &patterns,
17771777
const ControlFusionFn &controlElementwiseOpFusion);
17781778

1779-
/// Function type which is used to control propagation of tensor.pack/unpack
1779+
/// Function type which is used to control propagation of linalg.pack/unpack
17801780
/// ops.
17811781
using ControlPropagationFn = std::function<bool(OpOperand *opOperand)>;
17821782

@@ -1885,6 +1885,19 @@ void populateDecomposeWinogradOpsPatterns(RewritePatternSet &patterns);
18851885
/// convert to a `linalg.dot`.
18861886
void populateContractionOpRankReducingPatterns(RewritePatternSet &patterns);
18871887

1888+
/// Populates `patterns` with patterns that fold operations like `tensor.pad`
1889+
/// and `tensor.extract_slice` into `tensor.pack` and `tensor.unpack` operations
1890+
/// respectively.
1891+
void populateFoldIntoPackAndUnpackPatterns(RewritePatternSet &patterns);
1892+
1893+
/// Populates `patterns` with patterns that fold operations like `linalg.pack`
1894+
/// and `linalg.unpack` into `tensor.empty`.
1895+
void populateFoldPackUnpackIntoTensorEmptyPatterns(RewritePatternSet &patterns);
1896+
1897+
/// Populates `patterns` with patterns that simplify `tensor.pack` and
1898+
/// `tensor.unpack` operations.
1899+
void populateSimplifyPackAndUnpackPatterns(RewritePatternSet &patterns);
1900+
18881901
} // namespace linalg
18891902
} // namespace mlir
18901903

mlir/include/mlir/Dialect/Linalg/Utils/Utils.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,24 @@ namespace linalg {
3333
//===----------------------------------------------------------------------===//
3434
// Utilities for inferring various semantics properties of Linalg ops.
3535
//===----------------------------------------------------------------------===//
36+
/// Shell function to compute the Destination Permutation of PackOp
37+
/// This function uses the helper function `computePackUnPackPerm` to get
38+
/// the permutation vector. Only major difference between UnPack and Pack is
39+
/// that packOp uses destination rank whereas unpack Uses source rank.
40+
SmallVector<int64_t> getPackInverseDestPerm(linalg::PackOp packOp);
41+
42+
/// Shell function to compute the Source Permutation of unPackOp.
43+
/// This function, like the getPackInverseDestPerm uses the helper function
44+
/// computePackUnPackPerm` to get the permutation vector.
45+
/// Only major difference between UnPack and Pack is that packOp uses
46+
/// destination rank whereas unpack Uses source rank.
47+
SmallVector<int64_t> getUnPackInverseSrcPerm(linalg::UnPackOp unpackOp);
48+
49+
/// Shell function to compute the Source rank permutation for unpackOp
50+
/// Unpack requires some packing metadata data information, so created
51+
/// another function where this value is passed by reference.
52+
SmallVector<int64_t> getUnPackInverseSrcPerm(linalg::UnPackOp,
53+
PackingMetadata &metadata);
3654

3755
//===----------------------------------------------------------------------===//
3856
// General utilities

mlir/include/mlir/Dialect/Tensor/TransformOps/TensorTransformOps.td

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,6 @@ def ApplyFoldTensorEmptyPatternsOp : Op<Transform_Dialect,
5353
let arguments = (ins DefaultValuedAttr<BoolAttr, "false">:$fold_single_use_only);
5454
let assemblyFormat = "attr-dict";
5555
}
56-
def ApplyFoldIntoPackAndUnpackPatternsOp : Op<Transform_Dialect,
57-
"apply_patterns.tensor.fold_into_pack_and_unpack",
58-
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
59-
let description = [{
60-
Indicates that operations like tensor.pad and tensor.extract_slice should
61-
be folded into tensor.pack and tensor.unpack operations, respectively.
62-
}];
63-
64-
let assemblyFormat = "attr-dict";
65-
}
6656

6757
def ApplyFoldTensorSubsetOpsPatternsOp : Op<Transform_Dialect,
6858
"apply_patterns.tensor.fold_tensor_subset_ops",

0 commit comments

Comments
 (0)