// RUN: mlir-opt %s --transform-interpreter --split-input-file --verify-diagnostics // Silenceable diagnostics suppressed. module attributes { transform.with_named_sequence } { func.func @test_loop_peeling_not_beneficial() { %lb = arith.constant 0 : index %ub = arith.constant 40 : index %step = arith.constant 5 : index scf.for %i = %lb to %ub step %step { arith.addi %i, %i : index } return } transform.named_sequence @peel(%arg0: !transform.op<"scf.for"> {transform.consumed}) { transform.loop.peel %arg0 : (!transform.op<"scf.for">) -> (!transform.any_op, !transform.any_op) transform.yield } transform.named_sequence @match_for(%arg0: !transform.any_op {transform.readonly}) -> !transform.any_op { transform.match.operation_name %arg0 ["scf.for"] : !transform.any_op transform.yield %arg0 : !transform.any_op } transform.named_sequence @__transform_main(%root: !transform.any_op) { transform.sequence %root : !transform.any_op failures(suppress) { ^bb0(%arg0: !transform.any_op): transform.foreach_match in %arg0 @match_for -> @peel : (!transform.any_op) -> !transform.any_op transform.yield } transform.yield } } // ----- // Silenceable diagnostics propagated. module attributes { transform.with_named_sequence } { func.func @test_loop_peeling_not_beneficial() { %lb = arith.constant 0 : index %ub = arith.constant 40 : index %step = arith.constant 5 : index // expected-note @below {{when applied to this matching payload}} scf.for %i = %lb to %ub step %step { arith.addi %i, %i : index } return } // expected-note @below {{failed to peel the last iteration}} transform.named_sequence @peel(%arg0: !transform.op<"scf.for"> {transform.consumed}) { transform.loop.peel %arg0 : (!transform.op<"scf.for">) -> (!transform.any_op, !transform.any_op) transform.yield } transform.named_sequence @match_for(%arg0: !transform.any_op {transform.readonly}) -> !transform.any_op { transform.match.operation_name %arg0 ["scf.for"] : !transform.any_op transform.yield %arg0 : !transform.any_op } transform.named_sequence @main_suppress(%root: !transform.any_op) { transform.sequence %root : !transform.any_op failures(suppress) { ^bb0(%arg0: !transform.any_op): transform.foreach_match in %arg0 @match_for -> @peel : (!transform.any_op) -> !transform.any_op transform.yield } transform.yield } transform.named_sequence @__transform_main(%root: !transform.any_op) { transform.sequence %root : !transform.any_op failures(propagate) { ^bb0(%arg0: !transform.any_op): // expected-error @below {{actions failed}} transform.foreach_match in %arg0 @match_for -> @peel : (!transform.any_op) -> !transform.any_op transform.yield } transform.yield } } // ----- // expected-remark @below {{op from within the matcher}} module attributes { transform.with_named_sequence } { // expected-remark @below {{returned root}} func.func @foo() { return } transform.named_sequence @match_fail( %op: !transform.any_op {transform.readonly}, %root: !transform.any_op {transform.readonly}, %param: !transform.param {transform.readonly}) -> (!transform.any_op, !transform.param) { transform.test_succeed_if_operand_of_op_kind %op, "test.impossible_to_match" : !transform.any_op transform.yield %root, %param : !transform.any_op, !transform.param } transform.named_sequence @match_succeed( %op: !transform.any_op {transform.readonly}, %root: !transform.any_op {transform.readonly}, %param: !transform.param {transform.readonly}) -> (!transform.any_op, !transform.param) { transform.debug.emit_remark_at %root, "op from within the matcher" : !transform.any_op // expected-remark @below {{param from within the matcher 42}} transform.debug.emit_param_as_remark %param, "param from within the matcher" : !transform.param transform.yield %root, %param : !transform.any_op, !transform.param } transform.named_sequence @return( %root: !transform.any_op {transform.readonly}, %param: !transform.param {transform.readonly}) -> (!transform.param, !transform.param, !transform.any_op) { %func = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.any_op transform.yield %param, %param, %func : !transform.param, !transform.param, !transform.any_op } transform.named_sequence @__transform_main(%root: !transform.any_op) { %param = transform.param.constant 42 : i64 -> !transform.param %func = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.any_op %func2, %yielded:3 = transform.foreach_match restrict_root in %func, %root, %param @match_fail -> @return, @match_succeed -> @return : (!transform.any_op, !transform.any_op, !transform.param) -> (!transform.any_op, !transform.param, !transform.param, !transform.any_op) transform.debug.emit_remark_at %yielded#2, "returned root" : !transform.any_op // expected-remark @below {{42 : i64, 42 : i64}} transform.debug.emit_param_as_remark %yielded#0: !transform.param %num_roots = transform.num_associations %yielded#2 : (!transform.any_op) -> !transform.param // expected-remark @below {{2 : i64}} transform.debug.emit_param_as_remark %num_roots : !transform.param transform.yield } } // ----- module attributes { transform.with_named_sequence } { func.func private @foo() func.func private @bar() transform.named_sequence @match( %op: !transform.any_op {transform.readonly}, %func: !transform.any_op {transform.readonly}) -> (!transform.any_op) { transform.yield %func : !transform.any_op } transform.named_sequence @return( %func: !transform.any_op {transform.readonly}) -> (!transform.any_op) { transform.yield %func : !transform.any_op } transform.named_sequence @__transform_main(%root: !transform.any_op) { %func = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.any_op %func2, %yielded = transform.foreach_match flatten_results restrict_root in %func, %func @match -> @return : (!transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op) %num = transform.num_associations %yielded : (!transform.any_op) -> !transform.param // 2 funcs are yielded for each of the 2 funcs = 4: // expected-remark @below {{4 : i64}} transform.debug.emit_param_as_remark %num : !transform.param transform.yield } } // ----- module attributes { transform.with_named_sequence } { func.func private @foo() func.func private @bar() transform.named_sequence @match( %op: !transform.any_op {transform.readonly}, %func: !transform.any_op {transform.readonly}) -> (!transform.any_op) { transform.yield %func : !transform.any_op } transform.named_sequence @return( %func: !transform.any_op {transform.readonly}) -> (!transform.any_op) { transform.yield %func : !transform.any_op } transform.named_sequence @__transform_main(%root: !transform.any_op) { %func = transform.structured.match ops{["func.func"]} in %root : (!transform.any_op) -> !transform.any_op // expected-error @below {{action @return has results associated with multiple payload entities, but flattening was not requested}} %func2, %yielded = transform.foreach_match restrict_root in %func, %func @match -> @return : (!transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op) %num = transform.num_associations %yielded : (!transform.any_op) -> !transform.param transform.yield } }