177 lines · plain
1// RUN: mlir-opt %s --transform-interpreter -allow-unregistered-dialect --split-input-file -verify-diagnostics2 3module {4 func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {5 %c0 = arith.constant 0 : index6 %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>7 %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>8 %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>9 return10 }11}12 13module attributes {transform.with_named_sequence} {14 transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {15 %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op16 %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op17 // expected-error @+1 {{function with name '@func_not_in_module' not found}}18 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)19 transform.yield20 }21}22 23// -----24 25module {26 func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {27 %c0 = arith.constant 0 : index28 %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>29 %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>30 %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>31 return32 }33}34 35module attributes {transform.with_named_sequence} {36 transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {37 %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op38 %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op39 // expected-error @+1 {{function with name '@func_with_reverse_order_no_result_no_calls' has 3 arguments, but 2 args interchange were given}}40 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)41 transform.yield42 }43}44 45// -----46 47module {48 func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {49 %c0 = arith.constant 0 : index50 %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>51 %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>52 %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>53 return54 }55}56 57module attributes {transform.with_named_sequence} {58 transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {59 %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op60 %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op61 // expected-error @+1 {{function with name '@func_with_reverse_order_no_result_no_calls' has 0 results, but 1 results interchange were given}}62 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)63 transform.yield64 }65}66 67// -----68 69module {70 func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {71 %c0 = arith.constant 0 : index72 %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>73 %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>74 %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>75 return76 }77}78 79module attributes {transform.with_named_sequence} {80 transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {81 %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op82 %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op83 // expected-error @+1 {{args interchange must be unique}}84 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)85 transform.yield86 }87}88 89// -----90 91func.func private @func_with_no_duplicate_args(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {92 %c0 = arith.constant 0 : index93 %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>94 %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>95 %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>96 return97}98 99func.func @func_with_no_duplicate_args_caller(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {100 call @func_with_no_duplicate_args(%arg0, %arg1, %arg2) : (memref<1xi8, 1>, memref<2xi8, 1>, memref<3xi8, 1>) -> ()101 return102}103 104module attributes {transform.with_named_sequence} {105 transform.named_sequence @__transform_main(%module: !transform.any_op) {106 // expected-error @+1 {{failed to deduplicate function arguments of function func_with_no_duplicate_args}}107 transform.func.deduplicate_func_args @func_with_no_duplicate_args at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op)108 transform.yield109 }110}111 112// -----113 114func.func private @func_not_found(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {115 %c0 = arith.constant 0 : index116 %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>117 %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>118 %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>119 return120}121 122module attributes {transform.with_named_sequence} {123 transform.named_sequence @__transform_main(%module: !transform.any_op) {124 // expected-error @+1 {{function with name '@non_existent_func' is not found}}125 transform.func.deduplicate_func_args @non_existent_func at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op)126 transform.yield127 }128}129 130// -----131 132func.func private @func_with_multiple_calls(%arg0: memref<1xi8, 1>, %arg1: memref<1xi8, 1>) {133 %c0 = arith.constant 0 : index134 %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>135 %view0 = memref.view %arg1[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>136 return137}138 139func.func @func_with_multiple_calls_caller1(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>) {140 call @func_with_multiple_calls(%arg0, %arg0) : (memref<1xi8, 1>, memref<1xi8, 1>) -> ()141 return142}143 144func.func @func_with_multiple_calls_caller2(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>) {145 call @func_with_multiple_calls(%arg0, %arg0) : (memref<1xi8, 1>, memref<1xi8, 1>) -> ()146 return147}148 149module attributes {transform.with_named_sequence} {150 transform.named_sequence @__transform_main(%module: !transform.any_op) {151 // expected-error @+1 {{failed to deduplicate function arguments of function func_with_multiple_calls}}152 transform.func.deduplicate_func_args @func_with_multiple_calls at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op)153 transform.yield154 }155}156 157// -----158 159func.func private @func_with_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<1xi8, 1>) {160 %c0 = arith.constant 0 : index161 %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>162 %view0 = memref.view %arg1[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>163 return164}165 166func.func @some_other_func() {167 return168}169 170module attributes {transform.with_named_sequence} {171 transform.named_sequence @__transform_main(%module: !transform.any_op) {172 // expected-error @+1 {{failed to deduplicate function arguments of function func_with_no_calls}}173 transform.func.deduplicate_func_args @func_with_no_calls at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op)174 transform.yield175 }176}177