This change lifts the limitation that only the trailing dimensions/sizes
in dynamic index lists can be scalable. It allows us to extend
`MaskedVectorizeOp` and `TileOp` from the Transform dialect so that the
following is allowed:
%1, %loops:3 = transform.structured.tile %0 [4, [4], [4]]
This is also a follow up for https://reviews.llvm.org/D153372
that will enable the following (middle vector dimension is scalable):
transform.structured.masked_vectorize %0 vector_sizes [2, [4], 8]
To facilate this change, the hooks for parsing and printing dynamic
index lists are updated accordingly (`printDynamicIndexList` and
`parseDynamicIndexList`, respectively). `MaskedVectorizeOp` and `TileOp`
are updated to include an array of attribute of bools that captures
whether the corresponding vector dimension/tile size, respectively, are
scalable or not.
NOTE 1: I am re-landing this after the initial version was reverted. To
fix the regression and in addition to the original patch, this revision
updates the Python bindings for the transform dialect
NOTE 2: This change is a part of a larger effort to enable scalable
vectorisation in Linalg. See this RFC for more context:
* https://discourse.llvm.org/t/rfc-scalable-vectorisation-in-linalg/
This relands 048764f23a with fixes.
Differential Revision: https://reviews.llvm.org/D154336
116 lines
4.6 KiB
MLIR
116 lines
4.6 KiB
MLIR
// RUN: mlir-opt %s | mlir-opt | FileCheck %s
|
|
|
|
// CHECK: transform.sequence
|
|
// CHECK: ^{{.+}}(%{{.+}}: !transform.any_op):
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg0: !transform.any_op):
|
|
// CHECK: sequence %{{.+}} : !transform.any_op
|
|
// CHECK: ^{{.+}}(%{{.+}}: !transform.any_op):
|
|
sequence %arg0 : !transform.any_op failures(propagate) {
|
|
^bb1(%arg1: !transform.any_op):
|
|
}
|
|
}
|
|
|
|
// CHECK: transform.with_pdl_patterns
|
|
// CHECK: ^{{.+}}(%[[ARG:.+]]: !transform.any_op):
|
|
transform.with_pdl_patterns {
|
|
^bb0(%arg0: !transform.any_op):
|
|
// CHECK: sequence %[[ARG]] : !transform.any_op
|
|
sequence %arg0 : !transform.any_op failures(propagate) {
|
|
^bb1(%arg1: !transform.any_op):
|
|
}
|
|
}
|
|
|
|
// Using the same value multiple times without consuming it is fine.
|
|
// CHECK: transform.sequence
|
|
// CHECK: %[[V:.+]] = sequence %{{.*}} : !transform.any_op -> !transform.any_op
|
|
// CHECK: sequence %[[V]]
|
|
// CHECK: sequence %[[V]]
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg0: !transform.any_op):
|
|
%0 = transform.sequence %arg0 : !transform.any_op -> !transform.any_op failures(propagate) {
|
|
^bb1(%arg1: !transform.any_op):
|
|
yield %arg1 : !transform.any_op
|
|
}
|
|
transform.sequence %0 : !transform.any_op failures(propagate) {
|
|
^bb2(%arg2: !transform.any_op):
|
|
}
|
|
transform.sequence %0 : !transform.any_op failures(propagate) {
|
|
^bb3(%arg3: !transform.any_op):
|
|
}
|
|
}
|
|
|
|
// CHECK: transform.sequence failures(propagate)
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg0: !transform.any_op, %arg1: !transform.any_op, %arg2: !transform.any_op):
|
|
// CHECK: sequence %{{.*}}, %{{.*}}, %{{.*}} : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate)
|
|
transform.sequence %arg0, %arg1, %arg2 : !transform.any_op, !transform.any_op, !transform.any_op failures(propagate) {
|
|
^bb0(%arg3: !transform.any_op, %arg4: !transform.any_op, %arg5: !transform.any_op):
|
|
}
|
|
}
|
|
|
|
// CHECK: transform.sequence failures(propagate)
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg0: !transform.any_op, %arg1: !transform.any_op, %arg2: !transform.any_op):
|
|
// CHECK: sequence %{{.*}}, %{{.*}}, %{{.*}} : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate)
|
|
transform.sequence %arg0, %arg1, %arg2 : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate) {
|
|
^bb0(%arg3: !transform.any_op, %arg4: !transform.any_op, %arg5: !transform.any_op):
|
|
}
|
|
}
|
|
|
|
// CHECK: transform.sequence failures(propagate)
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg0: !transform.any_op, %arg1: !transform.any_op, %arg2: !transform.any_op):
|
|
// CHECK: sequence %{{.*}}, %{{.*}}, %{{.*}} : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate)
|
|
transform.sequence %arg0, %arg1, %arg2 : (!transform.any_op, !transform.any_op, !transform.any_op) failures(propagate) {
|
|
^bb0(%arg3: !transform.any_op, %arg4: !transform.any_op, %arg5: !transform.any_op):
|
|
}
|
|
}
|
|
|
|
// CHECK: transform.sequence
|
|
// CHECK: foreach
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg0: !transform.any_op):
|
|
transform.foreach %arg0 : !transform.any_op {
|
|
^bb1(%arg1: !transform.any_op):
|
|
}
|
|
}
|
|
|
|
// CHECK: transform.sequence
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg0: !transform.any_op):
|
|
// CHECK: cast %{{.*}} : !transform.any_op to !transform.any_op
|
|
%0 = cast %arg0: !transform.any_op to !transform.any_op
|
|
// CHECK: cast %{{.*}} : !transform.any_op to !transform.op<"builtin.module">
|
|
%1 = cast %0: !transform.any_op to !transform.op<"builtin.module">
|
|
}
|
|
|
|
// CHECK: transform.sequence
|
|
// CHECK: print
|
|
// CHECK: print
|
|
// CHECK: print
|
|
// CHECK: print
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg0: !transform.any_op):
|
|
transform.print %arg0 : !transform.any_op
|
|
transform.print
|
|
transform.print %arg0 {name = "test"} : !transform.any_op
|
|
transform.print {name = "test"}
|
|
}
|
|
|
|
// CHECK: transform.sequence
|
|
// CHECK: transform.structured.tile %0[4, 4, [4]]
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg1: !transform.any_op):
|
|
%0 = transform.structured.match ops{["linalg.matmul"]} in %arg1 : (!transform.any_op) -> !transform.any_op
|
|
transform.structured.tile %0 [4, 4, [4]] : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op)
|
|
}
|
|
|
|
// CHECK: transform.sequence
|
|
// CHECK: transform.structured.tile %0{{\[}}[2], 4, 8]
|
|
transform.sequence failures(propagate) {
|
|
^bb0(%arg1: !transform.any_op):
|
|
%0 = transform.structured.match ops{["linalg.matmul"]} in %arg1 : (!transform.any_op) -> !transform.any_op
|
|
transform.structured.tile %0 [[2], 4, 8] : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op)
|
|
}
|