| // RUN: mlir-opt %s --transform-interpreter -allow-unregistered-dialect --split-input-file -verify-diagnostics |
| |
| module { |
| func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) { |
| %c0 = arith.constant 0 : index |
| %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1> |
| %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1> |
| return |
| } |
| } |
| |
| module attributes {transform.with_named_sequence} { |
| transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { |
| %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op |
| %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op |
| // expected-error @+1 {{function with name '@func_not_in_module' not found}} |
| transform.func.replace_func_signature @func_not_in_module args_interchange = [0, 2, 1] results_interchange = [] at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op) |
| transform.yield |
| } |
| } |
| |
| // ----- |
| |
| module { |
| func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) { |
| %c0 = arith.constant 0 : index |
| %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1> |
| %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1> |
| return |
| } |
| } |
| |
| module attributes {transform.with_named_sequence} { |
| transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { |
| %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op |
| %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op |
| // expected-error @+1 {{function with name '@func_with_reverse_order_no_result_no_calls' has 3 arguments, but 2 args interchange were given}} |
| transform.func.replace_func_signature @func_with_reverse_order_no_result_no_calls args_interchange = [0, 2] results_interchange = [] at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op) |
| transform.yield |
| } |
| } |
| |
| // ----- |
| |
| module { |
| func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) { |
| %c0 = arith.constant 0 : index |
| %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1> |
| %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1> |
| return |
| } |
| } |
| |
| module attributes {transform.with_named_sequence} { |
| transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { |
| %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op |
| %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op |
| // expected-error @+1 {{function with name '@func_with_reverse_order_no_result_no_calls' has 0 results, but 1 results interchange were given}} |
| transform.func.replace_func_signature @func_with_reverse_order_no_result_no_calls args_interchange = [0, 2, 1] results_interchange = [0] at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op) |
| transform.yield |
| } |
| } |
| |
| // ----- |
| |
| module { |
| func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) { |
| %c0 = arith.constant 0 : index |
| %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1> |
| %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1> |
| return |
| } |
| } |
| |
| module attributes {transform.with_named_sequence} { |
| transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { |
| %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op |
| %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op |
| // expected-error @+1 {{args interchange must be unique}} |
| transform.func.replace_func_signature @func_with_reverse_order_no_result_no_calls args_interchange = [0, 2, 2] results_interchange = [] at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op) |
| transform.yield |
| } |
| } |
| |
| // ----- |
| |
| func.func private @func_with_no_duplicate_args(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) { |
| %c0 = arith.constant 0 : index |
| %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1> |
| %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1> |
| return |
| } |
| |
| func.func @func_with_no_duplicate_args_caller(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) { |
| call @func_with_no_duplicate_args(%arg0, %arg1, %arg2) : (memref<1xi8, 1>, memref<2xi8, 1>, memref<3xi8, 1>) -> () |
| return |
| } |
| |
| module attributes {transform.with_named_sequence} { |
| transform.named_sequence @__transform_main(%module: !transform.any_op) { |
| // expected-error @+1 {{failed to deduplicate function arguments of function func_with_no_duplicate_args}} |
| transform.func.deduplicate_func_args @func_with_no_duplicate_args at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op) |
| transform.yield |
| } |
| } |
| |
| // ----- |
| |
| func.func private @func_not_found(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) { |
| %c0 = arith.constant 0 : index |
| %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1> |
| %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1> |
| return |
| } |
| |
| module attributes {transform.with_named_sequence} { |
| transform.named_sequence @__transform_main(%module: !transform.any_op) { |
| // expected-error @+1 {{function with name '@non_existent_func' is not found}} |
| transform.func.deduplicate_func_args @non_existent_func at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op) |
| transform.yield |
| } |
| } |
| |
| // ----- |
| |
| func.func private @func_with_multiple_calls(%arg0: memref<1xi8, 1>, %arg1: memref<1xi8, 1>) { |
| %c0 = arith.constant 0 : index |
| %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| %view0 = memref.view %arg1[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| return |
| } |
| |
| func.func @func_with_multiple_calls_caller1(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>) { |
| call @func_with_multiple_calls(%arg0, %arg0) : (memref<1xi8, 1>, memref<1xi8, 1>) -> () |
| return |
| } |
| |
| func.func @func_with_multiple_calls_caller2(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>) { |
| call @func_with_multiple_calls(%arg0, %arg0) : (memref<1xi8, 1>, memref<1xi8, 1>) -> () |
| return |
| } |
| |
| module attributes {transform.with_named_sequence} { |
| transform.named_sequence @__transform_main(%module: !transform.any_op) { |
| // expected-error @+1 {{failed to deduplicate function arguments of function func_with_multiple_calls}} |
| transform.func.deduplicate_func_args @func_with_multiple_calls at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op) |
| transform.yield |
| } |
| } |
| |
| // ----- |
| |
| func.func private @func_with_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<1xi8, 1>) { |
| %c0 = arith.constant 0 : index |
| %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| %view0 = memref.view %arg1[%c0][] : memref<1xi8, 1> to memref<1xi8, 1> |
| return |
| } |
| |
| func.func @some_other_func() { |
| return |
| } |
| |
| module attributes {transform.with_named_sequence} { |
| transform.named_sequence @__transform_main(%module: !transform.any_op) { |
| // expected-error @+1 {{failed to deduplicate function arguments of function func_with_no_calls}} |
| transform.func.deduplicate_func_args @func_with_no_calls at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op) |
| transform.yield |
| } |
| } |