191 lines · plain
1// RUN: mlir-opt %s --transform-interpreter --split-input-file --verify-diagnostics2 3// Silenceable diagnostics suppressed.4module attributes { transform.with_named_sequence } {5 func.func @test_loop_peeling_not_beneficial() {6 %lb = arith.constant 0 : index7 %ub = arith.constant 40 : index8 %step = arith.constant 5 : index9 scf.for %i = %lb to %ub step %step {10 arith.addi %i, %i : index11 }12 return13 }14 15 transform.named_sequence @peel(%arg0: !transform.op<"scf.for"> {transform.consumed}) {16 transform.loop.peel %arg0 : (!transform.op<"scf.for">) -> (!transform.any_op, !transform.any_op)17 transform.yield18 }19 transform.named_sequence @match_for(%arg0: !transform.any_op {transform.readonly}) -> !transform.any_op {20 transform.match.operation_name %arg0 ["scf.for"] : !transform.any_op21 transform.yield %arg0 : !transform.any_op22 }23 transform.named_sequence @__transform_main(%root: !transform.any_op) {24 transform.sequence %root : !transform.any_op failures(suppress) {25 ^bb0(%arg0: !transform.any_op):26 transform.foreach_match in %arg027 @match_for -> @peel28 : (!transform.any_op) -> !transform.any_op29 transform.yield30 }31 transform.yield32 }33}34 35// -----36 37// Silenceable diagnostics propagated.38module attributes { transform.with_named_sequence } {39 func.func @test_loop_peeling_not_beneficial() {40 %lb = arith.constant 0 : index41 %ub = arith.constant 40 : index42 %step = arith.constant 5 : index43 // expected-note @below {{when applied to this matching payload}}44 scf.for %i = %lb to %ub step %step {45 arith.addi %i, %i : index46 }47 return48 }49 50 // expected-note @below {{failed to peel the last iteration}}51 transform.named_sequence @peel(%arg0: !transform.op<"scf.for"> {transform.consumed}) {52 transform.loop.peel %arg0 : (!transform.op<"scf.for">) -> (!transform.any_op, !transform.any_op)53 transform.yield54 }55 transform.named_sequence @match_for(%arg0: !transform.any_op {transform.readonly}) -> !transform.any_op {56 transform.match.operation_name %arg0 ["scf.for"] : !transform.any_op57 transform.yield %arg0 : !transform.any_op58 }59 transform.named_sequence @main_suppress(%root: !transform.any_op) {60 transform.sequence %root : !transform.any_op failures(suppress) {61 ^bb0(%arg0: !transform.any_op):62 transform.foreach_match in %arg063 @match_for -> @peel64 : (!transform.any_op) -> !transform.any_op65 transform.yield66 }67 transform.yield68 }69 transform.named_sequence @__transform_main(%root: !transform.any_op) {70 transform.sequence %root : !transform.any_op failures(propagate) {71 ^bb0(%arg0: !transform.any_op):72 // expected-error @below {{actions failed}}73 transform.foreach_match in %arg074 @match_for -> @peel75 : (!transform.any_op) -> !transform.any_op76 transform.yield77 }78 transform.yield79 }80}81 82// -----83 84// expected-remark @below {{op from within the matcher}}85module attributes { transform.with_named_sequence } {86 // expected-remark @below {{returned root}}87 func.func @foo() {88 return89 }90 91 transform.named_sequence @match_fail(92 %op: !transform.any_op {transform.readonly},93 %root: !transform.any_op {transform.readonly},94 %param: !transform.param<i64> {transform.readonly}) -> (!transform.any_op, !transform.param<i64>) {95 transform.test_succeed_if_operand_of_op_kind %op, "test.impossible_to_match" : !transform.any_op96 transform.yield %root, %param : !transform.any_op, !transform.param<i64>97 }98 99 transform.named_sequence @match_succeed(100 %op: !transform.any_op {transform.readonly},101 %root: !transform.any_op {transform.readonly},102 %param: !transform.param<i64> {transform.readonly}) -> (!transform.any_op, !transform.param<i64>) {103 transform.debug.emit_remark_at %root, "op from within the matcher" : !transform.any_op104 // expected-remark @below {{param from within the matcher 42}}105 transform.debug.emit_param_as_remark %param, "param from within the matcher" : !transform.param<i64>106 transform.yield %root, %param : !transform.any_op, !transform.param<i64>107 }108 109 transform.named_sequence @return(110 %root: !transform.any_op {transform.readonly},111 %param: !transform.param<i64> {transform.readonly}) -> (!transform.param<i64>, !transform.param<i64>, !transform.any_op) {112 %func = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.any_op113 transform.yield %param, %param, %func : !transform.param<i64>, !transform.param<i64>, !transform.any_op114 }115 116 transform.named_sequence @__transform_main(%root: !transform.any_op) {117 %param = transform.param.constant 42 : i64 -> !transform.param<i64>118 %func = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.any_op119 %func2, %yielded:3 = transform.foreach_match restrict_root in %func, %root, %param120 @match_fail -> @return,121 @match_succeed -> @return122 : (!transform.any_op, !transform.any_op, !transform.param<i64>) -> (!transform.any_op, !transform.param<i64>, !transform.param<i64>, !transform.any_op)123 transform.debug.emit_remark_at %yielded#2, "returned root" : !transform.any_op124 // expected-remark @below {{42 : i64, 42 : i64}}125 transform.debug.emit_param_as_remark %yielded#0: !transform.param<i64>126 %num_roots = transform.num_associations %yielded#2 : (!transform.any_op) -> !transform.param<i64>127 // expected-remark @below {{2 : i64}}128 transform.debug.emit_param_as_remark %num_roots : !transform.param<i64>129 transform.yield130 }131}132 133// -----134 135module attributes { transform.with_named_sequence } {136 func.func private @foo()137 func.func private @bar()138 139 transform.named_sequence @match(140 %op: !transform.any_op {transform.readonly},141 %func: !transform.any_op {transform.readonly}) -> (!transform.any_op) {142 transform.yield %func : !transform.any_op143 }144 145 transform.named_sequence @return(146 %func: !transform.any_op {transform.readonly}) -> (!transform.any_op) {147 transform.yield %func : !transform.any_op148 }149 150 transform.named_sequence @__transform_main(%root: !transform.any_op) {151 %func = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.any_op152 %func2, %yielded = transform.foreach_match flatten_results restrict_root in %func, %func153 @match -> @return154 : (!transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op)155 %num = transform.num_associations %yielded : (!transform.any_op) -> !transform.param<i64>156 // 2 funcs are yielded for each of the 2 funcs = 4:157 // expected-remark @below {{4 : i64}}158 transform.debug.emit_param_as_remark %num : !transform.param<i64>159 transform.yield160 }161}162 163// -----164 165 166module attributes { transform.with_named_sequence } {167 func.func private @foo()168 func.func private @bar()169 170 transform.named_sequence @match(171 %op: !transform.any_op {transform.readonly},172 %func: !transform.any_op {transform.readonly}) -> (!transform.any_op) {173 transform.yield %func : !transform.any_op174 }175 176 transform.named_sequence @return(177 %func: !transform.any_op {transform.readonly}) -> (!transform.any_op) {178 transform.yield %func : !transform.any_op179 }180 181 transform.named_sequence @__transform_main(%root: !transform.any_op) {182 %func = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.any_op183 // expected-error @below {{action @return has results associated with multiple payload entities, but flattening was not requested}}184 %func2, %yielded = transform.foreach_match restrict_root in %func, %func185 @match -> @return186 : (!transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op)187 %num = transform.num_associations %yielded : (!transform.any_op) -> !transform.param<i64>188 transform.yield189 }190}191