brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.4 KiB · 8a71511 Raw
315 lines · plain
1// RUN: mlir-opt %s --transform-interpreter -allow-unregistered-dialect --split-input-file | FileCheck %s2 3// CHECK-LABEL: func.func @basic_cast_and_call4func.func @basic_cast_and_call() {5  // CHECK-NEXT: call @second()6  "test.foo"() : () -> ()7  // CHECK-NEXT: test.foo8  // CHECK-NEXT: call @third()9  func.return10}11 12func.func @second() {13  "test.bar"() : () -> ()14  func.return15}16 17func.func private @third()18 19module attributes {transform.with_named_sequence} {20  transform.named_sequence @__transform_main(%arg0: !transform.any_op) {21    %funcs = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op22    %f:3 = transform.split_handle %funcs : (!transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op)23    %foo = transform.structured.match ops{["test.foo"]} in %f#0 : (!transform.any_op) -> !transform.any_op24    transform.func.cast_and_call @second before %foo : (!transform.any_op) -> !transform.any_op25    transform.func.cast_and_call %f#2 after %foo : (!transform.any_op, !transform.any_op) -> !transform.any_op26    transform.yield27  }28}29 30// -----31 32// CHECK-LABEL: func.func @non_empty_arg_and_out33func.func @non_empty_arg_and_out(%arg0 : index) -> i32 {34  // CHECK-NEXT: %[[FOO:.+]] = "test.foo"35  %0 = "test.foo"(%arg0) : (index) -> (index)36  // CHECK-NEXT: %[[CALL:.+]] = call @second(%[[FOO]]) : (index) -> i3237  %1 = "test.bar"(%0) : (index) -> (i32)38  // CHECK: return %[[CALL]] : i3239  func.return %1 : i3240}41 42func.func private @second(%arg1 : index) -> i3243 44module attributes {transform.with_named_sequence} {45  transform.named_sequence @__transform_main(%arg0: !transform.any_op) {46    %funcs = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op47    %f:2 = transform.split_handle %funcs : (!transform.any_op) -> (!transform.any_op, !transform.any_op)48    %foo = transform.structured.match ops{["test.foo"]} in %f#0 : (!transform.any_op) -> !transform.any_op49    %bar = transform.structured.match ops{["test.bar"]} in %f#0 : (!transform.any_op) -> !transform.any_op50    %in = transform.get_result %foo[0] : (!transform.any_op) -> !transform.any_value51    %out = transform.get_result %bar[0] : (!transform.any_op) -> !transform.any_value52    transform.func.cast_and_call %f#1(%in) -> %out before %bar53        : (!transform.any_op, !transform.any_value,54           !transform.any_value, !transform.any_op) -> !transform.any_op55    transform.yield56  }57}58 59// -----60 61// CHECK-LABEL: func.func @multi_arg_and_result62func.func @multi_arg_and_result(%arg0 : index) -> (index, index) {63  // CHECK-NEXT: %[[FOO:.+]] = "test.foo"64  %0 = "test.foo"(%arg0) : (index) -> (index)65  %1 = "test.bar"(%0) : (index) -> (index)66  %2 = "test.bar"(%0) : (index) -> (index)67  // CHECK: %[[CALL:.+]]:2 = call @second(%[[FOO]], %[[FOO]]) : (index, index) -> (index, index)68  // CHECK: return %[[CALL]]#0, %[[CALL]]#1 : index, index69  func.return %1, %2 : index, index70}71 72func.func private @second(%arg1: index, %arg2: index) -> (index, index)73 74module attributes {transform.with_named_sequence} {75  transform.named_sequence @__transform_main(%arg0: !transform.any_op) {76    %funcs = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op77    %f:2 = transform.split_handle %funcs : (!transform.any_op) -> (!transform.any_op, !transform.any_op)78    %foo = transform.structured.match ops{["test.foo"]} in %f#0 : (!transform.any_op) -> !transform.any_op79    %bars = transform.structured.match ops{["test.bar"]} in %f#0 : (!transform.any_op) -> !transform.any_op80    %in0 = transform.get_result %foo[0] : (!transform.any_op) -> !transform.any_value81    %in1 = transform.get_result %foo[0] : (!transform.any_op) -> !transform.any_value82    %ins = transform.merge_handles %in0, %in1 : !transform.any_value83 84    %outs = transform.get_result %bars[0] : (!transform.any_op) -> !transform.any_value85 86    transform.func.cast_and_call %f#1(%ins) -> %outs after %foo87        : (!transform.any_op, !transform.any_value,88           !transform.any_value, !transform.any_op) -> !transform.any_op89    transform.yield90  }91}92 93// -----94 95// CHECK-LABEL: func.func @nested_call96func.func @nested_call() {97  // CHECK-NEXT: %[[ARG:.+]] = "test.arg"98  // CHECK-NEXT: test.foo99  %0 = "test.arg"() : () -> (index)100  "test.foo"() ({101    // CHECK-NEXT: call @second(%[[ARG]]) : (index) -> ()102    "test.bar"(%0) : (index) -> ()103  }) : () -> ()104}105 106func.func private @second(%arg1: index) -> ()107 108module attributes {transform.with_named_sequence} {109  transform.named_sequence @__transform_main(%arg0: !transform.any_op) {110    %funcs = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op111    %f:2 = transform.split_handle %funcs : (!transform.any_op) -> (!transform.any_op, !transform.any_op)112    %arg = transform.structured.match ops{["test.arg"]} in %f#0 : (!transform.any_op) -> !transform.any_op113    %bar = transform.structured.match ops{["test.bar"]} in %f#0 : (!transform.any_op) -> !transform.any_op114    %in = transform.get_result %arg[0] : (!transform.any_op) -> !transform.any_value115 116    transform.func.cast_and_call %f#1(%in) before %bar117        : (!transform.any_op, !transform.any_value, !transform.any_op) -> !transform.any_op118    transform.yield119  }120}121 122// -----123 124module {125  // CHECK:           func.func private @func_with_reverse_order_no_result_no_calls(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<3xi8, 1>, %[[ARG2:.*]]: memref<2xi8, 1>) {126  func.func private @func_with_reverse_order_no_result_no_calls(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {127    // CHECK:             %[[C0:.*]] = arith.constant 0 : index128    %c0 = arith.constant 0 : index129    // CHECK:             %[[VAL_4:.*]] = memref.view %[[ARG0]]{{\[}}%[[C0]]][] : memref<1xi8, 1> to memref<1xi8, 1>130    %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>131    // CHECK:             %[[VAL_5:.*]] = memref.view %[[ARG2]]{{\[}}%[[C0]]][] : memref<2xi8, 1> to memref<2xi8, 1>132    %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>133    // CHECK:             %[[VAL_6:.*]] = memref.view %[[ARG1]]{{\[}}%[[C0]]][] : memref<3xi8, 1> to memref<3xi8, 1>134    %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>135    return136  }137}138 139module attributes {transform.with_named_sequence} {140  transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {141    %func = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op142    %module = transform.get_parent_op %func : (!transform.any_op) -> !transform.any_op143    transform.func.replace_func_signature @func_with_reverse_order_no_result_no_calls args_interchange = [0, 2, 1] results_interchange = [] at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op)144    transform.yield145  }146}147 148// -----149 150module {151  // CHECK:           func.func private @func_with_reverse_order_no_result(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<3xi8, 1>, %[[ARG2:.*]]: memref<2xi8, 1>) {152  func.func private @func_with_reverse_order_no_result(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {153    // CHECK:             %[[C0:.*]] = arith.constant 0 : index154    %c0 = arith.constant 0 : index155    // CHECK:             %[[VAL_4:.*]] = memref.view %[[ARG0]]{{\[}}%[[C0]]][] : memref<1xi8, 1> to memref<1xi8, 1>156    %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>157    // CHECK:             %[[VAL_5:.*]] = memref.view %[[ARG2]]{{\[}}%[[C0]]][] : memref<2xi8, 1> to memref<2xi8, 1>158    %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>159    // CHECK:             %[[VAL_6:.*]] = memref.view %[[ARG1]]{{\[}}%[[C0]]][] : memref<3xi8, 1> to memref<3xi8, 1>160    %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>161    return162  }163 164  // CHECK:           func.func @func_with_reverse_order_no_result_caller(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<2xi8, 1>, %[[ARG2:.*]]: memref<3xi8, 1>) {165  func.func @func_with_reverse_order_no_result_caller(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) {166    // CHECK:             call @func_with_reverse_order_no_result(%[[ARG0]], %[[ARG2]], %[[ARG1]]) : (memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>) -> ()167    call @func_with_reverse_order_no_result(%arg0, %arg1, %arg2) : (memref<1xi8, 1>, memref<2xi8, 1>, memref<3xi8, 1>) -> ()168    return169  }170}171 172module attributes {transform.with_named_sequence} {173  transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {174    %funcs = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op175    %f:2 = transform.split_handle %funcs : (!transform.any_op) -> (!transform.any_op, !transform.any_op)176    %module = transform.get_parent_op %f#0 : (!transform.any_op) -> !transform.any_op177    transform.func.replace_func_signature @func_with_reverse_order_no_result args_interchange = [0, 2, 1] results_interchange = [] at %module {adjust_func_calls} : (!transform.any_op) -> (!transform.any_op, !transform.any_op)178    transform.yield179  }180}181 182// -----183 184module {185  // CHECK:           func.func private @func_with_reverse_order(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<3xi8, 1>, %[[ARG2:.*]]: memref<2xi8, 1>) -> (memref<2xi8, 1>, memref<1xi8, 1>) {186  func.func private @func_with_reverse_order(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>) {187    // CHECK:             %[[C0:.*]] = arith.constant 0 : index188    %c0 = arith.constant 0 : index189    // CHECK:             %[[RET_0:.*]] = memref.view %[[ARG0]]{{\[}}%[[C0]]][] : memref<1xi8, 1> to memref<1xi8, 1>190    %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>191    // CHECK:             %[[RET_1:.*]] = memref.view %[[ARG2]]{{\[}}%[[C0]]][] : memref<2xi8, 1> to memref<2xi8, 1>192    %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>193    // CHECK:             %[[VAL_6:.*]] = memref.view %[[ARG1]]{{\[}}%[[C0]]][] : memref<3xi8, 1> to memref<3xi8, 1>194    %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>195    // CHECK:             return %[[RET_1]], %[[RET_0]] : memref<2xi8, 1>, memref<1xi8, 1>196    return %view, %view0 : memref<1xi8, 1>, memref<2xi8, 1>197  }198 199  // CHECK:           func.func @func_with_reverse_order_caller(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<2xi8, 1>, %[[ARG2:.*]]: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>) {200  func.func @func_with_reverse_order_caller(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>) {201    // CHECK:             %[[RET:.*]]:2 = call @func_with_reverse_order(%[[ARG0]], %[[ARG2]], %[[ARG1]]) : (memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>) -> (memref<2xi8, 1>, memref<1xi8, 1>)202    %0, %1 = call @func_with_reverse_order(%arg0, %arg1, %arg2) : (memref<1xi8, 1>, memref<2xi8, 1>, memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>)203    // CHECK:             return %[[RET]]#1, %[[RET]]#0 : memref<1xi8, 1>, memref<2xi8, 1>204    return %0, %1 : memref<1xi8, 1>, memref<2xi8, 1>205  }206}207 208module attributes {transform.with_named_sequence} {209  transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {210    %funcs = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op211    %f:2 = transform.split_handle %funcs : (!transform.any_op) -> (!transform.any_op, !transform.any_op)212    %module = transform.get_parent_op %f#0 : (!transform.any_op) -> !transform.any_op213    transform.func.replace_func_signature @func_with_reverse_order args_interchange = [0, 2, 1] results_interchange = [1, 0] at %module {adjust_func_calls} : (!transform.any_op) -> (!transform.any_op, !transform.any_op)214    transform.yield215  }216}217 218// -----219 220module {221  // CHECK:           func.func private @func_with_reverse_order_with_attr(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<3xi8, 1>, %[[ARG2:.*]]: memref<2xi8, 1> {transform.readonly}) -> (memref<2xi8, 1>, memref<1xi8, 1>) {222  func.func private @func_with_reverse_order_with_attr(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>{transform.readonly}, %arg2: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>) {223    // CHECK:             %[[C0:.*]] = arith.constant 0 : index224    %c0 = arith.constant 0 : index225    // CHECK:             %[[RET_0:.*]] = memref.view %[[ARG0]]{{\[}}%[[C0]]][] : memref<1xi8, 1> to memref<1xi8, 1>226    %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>227    // CHECK:             %[[RET_1:.*]] = memref.view %[[ARG2]]{{\[}}%[[C0]]][] : memref<2xi8, 1> to memref<2xi8, 1>228    %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>229    // CHECK:             %[[VAL_6:.*]] = memref.view %[[ARG1]]{{\[}}%[[C0]]][] : memref<3xi8, 1> to memref<3xi8, 1>230    %view1 = memref.view %arg2[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>231    // CHECK:             return %[[RET_1]], %[[RET_0]] : memref<2xi8, 1>, memref<1xi8, 1>232    return %view, %view0 : memref<1xi8, 1>, memref<2xi8, 1>233  }234 235  // CHECK:           func.func @func_with_reverse_order_with_attr_caller(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<2xi8, 1>, %[[ARG2:.*]]: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>) {236  func.func @func_with_reverse_order_with_attr_caller(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>) {237    // CHECK:             %[[RET:.*]]:2 = call @func_with_reverse_order_with_attr(%[[ARG0]], %[[ARG2]], %[[ARG1]]) : (memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>) -> (memref<2xi8, 1>, memref<1xi8, 1>)238    %0, %1 = call @func_with_reverse_order_with_attr(%arg0, %arg1, %arg2) : (memref<1xi8, 1>, memref<2xi8, 1>, memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>)239    // CHECK:             return %[[RET]]#1, %[[RET]]#0 : memref<1xi8, 1>, memref<2xi8, 1>240    return %0, %1 : memref<1xi8, 1>, memref<2xi8, 1>241  }242}243 244module attributes {transform.with_named_sequence} {245  transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) {246    %funcs = transform.structured.match ops{["func.func"]} in %arg0 : (!transform.any_op) -> !transform.any_op247    %f:2 = transform.split_handle %funcs : (!transform.any_op) -> (!transform.any_op, !transform.any_op)248    %module = transform.get_parent_op %f#0 : (!transform.any_op) -> !transform.any_op249    transform.func.replace_func_signature @func_with_reverse_order_with_attr args_interchange = [0, 2, 1] results_interchange = [1, 0] at %module {adjust_func_calls} : (!transform.any_op) -> (!transform.any_op, !transform.any_op)250    transform.yield251  }252}253 254// -----255 256// CHECK:           func.func private @func_with_duplicate_args(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<2xi8, 1>) {257func.func private @func_with_duplicate_args(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<1xi8, 1>) {258  %c0 = arith.constant 0 : index259  // CHECK:             %[[VAL_3:.*]] = memref.view %[[ARG0]]{{\[}}%[[C0:.*]]][] : memref<1xi8, 1> to memref<1xi8, 1>260  %view = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>261  // CHECK:             %[[VAL_4:.*]] = memref.view %[[ARG1]]{{\[}}%[[C0]]][] : memref<2xi8, 1> to memref<2xi8, 1>262  %view0 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>263  // CHECK:             %[[VAL_5:.*]] = memref.view %[[ARG0]]{{\[}}%[[C0]]][] : memref<1xi8, 1> to memref<1xi8, 1>264  %view1 = memref.view %arg2[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>265  return266}267 268// CHECK:           func.func @func_with_duplicate_args_caller(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<2xi8, 1>) {269func.func @func_with_duplicate_args_caller(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>) {270  // CHECK:             call @func_with_duplicate_args(%[[ARG0]], %[[ARG1]]) : (memref<1xi8, 1>, memref<2xi8, 1>) -> ()271  call @func_with_duplicate_args(%arg0, %arg1, %arg0) : (memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>) -> ()272  return273}274 275module attributes {transform.with_named_sequence} {276  transform.named_sequence @__transform_main(%module: !transform.any_op) {277    transform.func.deduplicate_func_args @func_with_duplicate_args at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op)278    transform.yield279  }280}281 282// -----283 284// CHECK:           func.func private @func_with_complex_duplicate_args(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<2xi8, 1>, %[[ARG2:.*]]: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>) {285func.func private @func_with_complex_duplicate_args(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<1xi8, 1>, %arg3: memref<3xi8, 1>, %arg4: memref<2xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>) {286  %c0 = arith.constant 0 : index287  // CHECK:             %[[RET_0:.*]] = memref.view %[[ARG0]]{{\[}}%[[C0:.*]]][] : memref<1xi8, 1> to memref<1xi8, 1>288  %view0 = memref.view %arg0[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>289  // CHECK:             %[[RET_1:.*]] = memref.view %[[ARG1]]{{\[}}%[[C0]]][] : memref<2xi8, 1> to memref<2xi8, 1>290  %view1 = memref.view %arg1[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>291  // CHECK:             %[[RET_2:.*]] = memref.view %[[ARG0]]{{\[}}%[[C0]]][] : memref<1xi8, 1> to memref<1xi8, 1>292  %view2 = memref.view %arg2[%c0][] : memref<1xi8, 1> to memref<1xi8, 1>293  // CHECK:             %[[RET_3:.*]] = memref.view %[[ARG2]]{{\[}}%[[C0]]][] : memref<3xi8, 1> to memref<3xi8, 1>294  %view3 = memref.view %arg3[%c0][] : memref<3xi8, 1> to memref<3xi8, 1>295  // CHECK:             %[[RET_4:.*]] = memref.view %[[ARG1]]{{\[}}%[[C0]]][] : memref<2xi8, 1> to memref<2xi8, 1>296  %view4 = memref.view %arg4[%c0][] : memref<2xi8, 1> to memref<2xi8, 1>297  // CHECK:             return %[[RET_0]], %[[RET_1]], %[[RET_2]], %[[RET_3]], %[[RET_4]] : memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>298  return %view0, %view1, %view2, %view3, %view4 : memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>299}300 301// CHECK:           func.func @func_with_complex_duplicate_args_caller(%[[ARG0:.*]]: memref<1xi8, 1>, %[[ARG1:.*]]: memref<2xi8, 1>, %[[ARG2:.*]]: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>) {302func.func @func_with_complex_duplicate_args_caller(%arg0: memref<1xi8, 1>, %arg1: memref<2xi8, 1>, %arg2: memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>) {303  // CHECK:             %[[RET:.*]]:5 = call @func_with_complex_duplicate_args(%[[ARG0]], %[[ARG1]], %[[ARG2]]) : (memref<1xi8, 1>, memref<2xi8, 1>, memref<3xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>)304  %0:5 = call @func_with_complex_duplicate_args(%arg0, %arg1, %arg0, %arg2, %arg1) : (memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>) -> (memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>)305  // CHECK:             return %[[RET]]#0, %[[RET]]#1, %[[RET]]#2, %[[RET]]#3, %[[RET]]#4 : memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>306  return %0#0, %0#1, %0#2, %0#3, %0#4 : memref<1xi8, 1>, memref<2xi8, 1>, memref<1xi8, 1>, memref<3xi8, 1>, memref<2xi8, 1>307}308 309module attributes {transform.with_named_sequence} {310  transform.named_sequence @__transform_main(%module: !transform.any_op) {311    transform.func.deduplicate_func_args @func_with_complex_duplicate_args at %module : (!transform.any_op) -> (!transform.any_op, !transform.any_op)312    transform.yield313  }314}315