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