xref: /llvm-project/mlir/test/Dialect/Transform/test-pass-application.mlir (revision e394fecd5b351e9108d0600c872759d8dea88a42)
1// RUN: mlir-opt %s --transform-interpreter -allow-unregistered-dialect --split-input-file --verify-diagnostics | FileCheck %s
2
3// CHECK-LABEL: func @successful_pass_application(
4//       CHECK:   %[[c5:.*]] = arith.constant 5 : index
5//       CHECK:   return %[[c5]]
6func.func @successful_pass_application(%t: tensor<5xf32>) -> index {
7  %c0 = arith.constant 0 : index
8  %dim = tensor.dim %t, %c0 : tensor<5xf32>
9  return %dim : index
10}
11
12module attributes {transform.with_named_sequence} {
13  transform.named_sequence @__transform_main(%arg1: !transform.any_op) {
14    %1 = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.any_op
15    transform.apply_registered_pass "canonicalize" to %1 : (!transform.any_op) -> !transform.any_op
16    transform.yield
17  }
18}
19
20// -----
21
22// CHECK-LABEL: func @pass_pipeline(
23func.func @pass_pipeline() {
24  return
25}
26
27module attributes {transform.with_named_sequence} {
28  transform.named_sequence @__transform_main(%arg1: !transform.any_op) {
29    %1 = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.any_op
30    // This pipeline does not do anything. Just make sure that the pipeline is
31    // found and no error is produced.
32    transform.apply_registered_pass "test-options-pass-pipeline" to %1 : (!transform.any_op) -> !transform.any_op
33    transform.yield
34  }
35}
36
37// -----
38
39func.func @invalid_pass_name() {
40  return
41}
42
43module attributes {transform.with_named_sequence} {
44  transform.named_sequence @__transform_main(%arg1: !transform.any_op) {
45    %1 = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.any_op
46    // expected-error @below {{unknown pass or pass pipeline: non-existing-pass}}
47    transform.apply_registered_pass "non-existing-pass" to %1 : (!transform.any_op) -> !transform.any_op
48    transform.yield
49  }
50}
51
52// -----
53
54func.func @not_isolated_from_above(%t: tensor<5xf32>) -> index {
55  %c0 = arith.constant 0 : index
56  // expected-note @below {{target op}}
57  // expected-error @below {{trying to schedule a pass on an operation not marked as 'IsolatedFromAbove'}}
58  %dim = tensor.dim %t, %c0 : tensor<5xf32>
59  return %dim : index
60}
61
62module attributes {transform.with_named_sequence} {
63  transform.named_sequence @__transform_main(%arg1: !transform.any_op) {
64    %1 = transform.structured.match ops{["tensor.dim"]} in %arg1 : (!transform.any_op) -> !transform.any_op
65    // expected-error @below {{pass pipeline failed}}
66    transform.apply_registered_pass "canonicalize" to %1 : (!transform.any_op) -> !transform.any_op
67    transform.yield
68  }
69}
70
71// -----
72
73func.func @invalid_pass_option() {
74  return
75}
76
77module attributes {transform.with_named_sequence} {
78  transform.named_sequence @__transform_main(%arg1: !transform.any_op) {
79    %1 = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.any_op
80    // expected-error @below {{failed to add pass or pass pipeline to pipeline: canonicalize}}
81    // expected-error @below {{<Pass-Options-Parser>: no such option invalid-option}}
82    transform.apply_registered_pass "canonicalize" to %1 {options = "invalid-option=1"} : (!transform.any_op) -> !transform.any_op
83    transform.yield
84  }
85}
86
87// -----
88
89// CHECK-LABEL: func @valid_pass_option()
90func.func @valid_pass_option() {
91  return
92}
93
94module attributes {transform.with_named_sequence} {
95  transform.named_sequence @__transform_main(%arg1: !transform.any_op) {
96    %1 = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.any_op
97    transform.apply_registered_pass "canonicalize" to %1 {options = "top-down=false"} : (!transform.any_op) -> !transform.any_op
98    transform.yield
99  }
100}
101
102// -----
103
104module attributes {transform.with_named_sequence} {
105  // expected-error @below {{trying to schedule a pass on an unsupported operation}}
106  // expected-note @below {{target op}}
107  func.func @invalid_target_op_type() {
108    return
109  }
110
111  transform.named_sequence @__transform_main(%arg1: !transform.any_op) {
112    %1 = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.any_op
113
114    // duplicate-function-elimination can be applied only to ModuleOps.
115    // expected-error @below {{pass pipeline failed}}
116    transform.apply_registered_pass "duplicate-function-elimination" to %1 : (!transform.any_op) -> !transform.any_op
117    transform.yield
118  }
119}
120