[Mlir-commits] [mlir] 1a4f0d6 - [mlir][doc] Fix transform dialect tutorial ch3 (#150456)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Jul 25 18:21:38 PDT 2025
Author: lonely eagle
Date: 2025-07-26T09:21:35+08:00
New Revision: 1a4f0d61152adb0ba1279e26d46dfb0ca061d9d7
URL: https://github.com/llvm/llvm-project/commit/1a4f0d61152adb0ba1279e26d46dfb0ca061d9d7
DIFF: https://github.com/llvm/llvm-project/commit/1a4f0d61152adb0ba1279e26d46dfb0ca061d9d7.diff
LOG: [mlir][doc] Fix transform dialect tutorial ch3 (#150456)
Fixed some bugs in documentation. Add CallOpInterfaceHandle to the
arguments of ChangeCallTargetOp, after doing so the section described in
the documentation works correctly, Otherwise the following code reports
an error.
```
// Cast to our new type.
%casted = transform.cast %call : !transform.any_op to !transform.my.call_op_interface
// Using our new operation.
transform.my.change_call_target %casted, "microkernel" : !transform.my.call_op_interface
```
Added:
Modified:
mlir/docs/Tutorials/transform/Ch3.md
mlir/examples/transform/Ch3/include/MyExtension.td
mlir/test/Examples/transform/Ch3/ops.mlir
mlir/test/Examples/transform/Ch3/sequence.mlir
Removed:
################################################################################
diff --git a/mlir/docs/Tutorials/transform/Ch3.md b/mlir/docs/Tutorials/transform/Ch3.md
index fa788d13e2055..eeab77043a4ee 100644
--- a/mlir/docs/Tutorials/transform/Ch3.md
+++ b/mlir/docs/Tutorials/transform/Ch3.md
@@ -139,7 +139,21 @@ void MyExtension::init() {
```
This type is now directly available in the Transform dialect and can be used in operations.
+In the previous tablegen definition, the type of `$call` must be `Transform_ConcreteOp<“func.call”>`,
+By adding `CallOpInterfaceHandle` as an allowed type for `$call`, the corresponding handle
+is allowed to be to any op implementing the interface.
+```tablegen
+def ChangeCallTargetOp : ... {
+ let arguments = (ins
+ // Allow the handle to be to concrete `func.call` ops as well as any op implementing
+ // the `CallOpInterface`.
+ AnyTypeOf<[Transform_ConcreteOpType<"func.call">, CallOpInterfaceHandle]>:$call,
+ StrAttr:$new_target);
+}
+```
+
+We can then add the following code to `sequence.mlir` and run it with the interpreter.
```mlir
// Cast to our new type.
@@ -172,7 +186,7 @@ def CallToOp : Op<Transform_Dialect, "my.call_to_op",
let results = (outs TransformHandleTypeInterface:$transformed);
// Provide nice syntax.
- let assemblyFormat = "$call attr-dict `:` functional-type(inputs, outputs)";
+ let assemblyFormat = "$call attr-dict `:` functional-type(operands, results)";
// Declare the function implementing the interface for a single payload operation.
let extraClassDeclaration = [{
diff --git a/mlir/examples/transform/Ch3/include/MyExtension.td b/mlir/examples/transform/Ch3/include/MyExtension.td
index 5a78186d75c7b..49874a70c8178 100644
--- a/mlir/examples/transform/Ch3/include/MyExtension.td
+++ b/mlir/examples/transform/Ch3/include/MyExtension.td
@@ -46,9 +46,9 @@ def ChangeCallTargetOp : Op<Transform_Dialect, "my.change_call_target",
// We use a string attribute as the symbol may not exist in the transform IR so the
// verification may fail.
let arguments = (ins
- // Specify the type constraint on the input accepting only `func.call` payload
- // operations.
- Transform_ConcreteOpType<"func.call">:$call,
+ // Allow the handle to be to concrete func.call ops as well as any op implementing
+ // the CallOpInterface.
+ AnyTypeOf<[Transform_ConcreteOpType<"func.call">, CallOpInterfaceHandle]>:$call,
StrAttr:$new_target);
// The results are empty as the transformation does not produce any new payload.
diff --git a/mlir/test/Examples/transform/Ch3/ops.mlir b/mlir/test/Examples/transform/Ch3/ops.mlir
index b2d47cc369a58..707a09fe251ef 100644
--- a/mlir/test/Examples/transform/Ch3/ops.mlir
+++ b/mlir/test/Examples/transform/Ch3/ops.mlir
@@ -30,9 +30,30 @@ module attributes {transform.with_named_sequence} {
// -----
func.func private @orig()
+func.func private @updated()
// CHECK-LABEL: func @test2
func.func @test2() {
+ // CHECK: call @updated
+ call @orig() : () -> ()
+ return
+}
+
+module attributes {transform.with_named_sequence} {
+ transform.named_sequence @__transform_main(%arg0: !transform.any_op) {
+ %call = transform.structured.match ops{["func.call"]} in %arg0 : (!transform.any_op) -> !transform.my.call_op_interface
+ // CHECK: transform.my.change_call_target %{{.*}}, "updated" : !transform.my.call_op_interface
+ transform.my.change_call_target %call, "updated" : !transform.my.call_op_interface
+ transform.yield
+ }
+}
+
+// -----
+
+func.func private @orig()
+
+// CHECK-LABEL: func @test3
+func.func @test3() {
// CHECK: "my.mm4"
call @orig() : () -> ()
return
diff --git a/mlir/test/Examples/transform/Ch3/sequence.mlir b/mlir/test/Examples/transform/Ch3/sequence.mlir
index 4d28518ca3d9e..877b0064647d3 100644
--- a/mlir/test/Examples/transform/Ch3/sequence.mlir
+++ b/mlir/test/Examples/transform/Ch3/sequence.mlir
@@ -101,11 +101,12 @@ module attributes {transform.with_named_sequence} {
%_1, %outline_target = transform.structured.fuse_into_containing_op %matmul_fused_2 into %loop_third
: (!transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op)
%func, %call = transform.loop.outline %outline_target {func_name = "outlined"}
- : (!transform.any_op) -> (!transform.any_op, !transform.op<"func.call">)
-
- // Rewrite the call target.
- transform.my.change_call_target %call, "microkernel" : !transform.op<"func.call">
-
+ : (!transform.any_op) -> (!transform.any_op, !transform.any_op)
+ // Cast to our new type.
+ %casted = transform.cast %call : !transform.any_op to !transform.my.call_op_interface
+ // Using our new operation.
+ transform.my.change_call_target %casted, "microkernel" : !transform.my.call_op_interface
+
transform.yield
}
}
More information about the Mlir-commits
mailing list