| // RUN: mlir-opt -split-input-file -convert-pdl-to-pdl-interp %s | FileCheck %s |
| |
| // ----- |
| |
| // CHECK-LABEL: module @external |
| module @external { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[ROOT:.*]]: !pdl.operation, %[[INPUT:.*]]: !pdl.value) |
| // CHECK: pdl_interp.apply_rewrite "rewriter" [true](%[[INPUT]] : !pdl.value) on %[[ROOT]] |
| pdl.pattern : benefit(1) { |
| %input = pdl.input |
| %root = pdl.operation "foo.op"(%input) |
| pdl.rewrite %root with "rewriter"[true](%input : !pdl.value) |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @erase |
| module @erase { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[ROOT:.*]]: !pdl.operation) |
| // CHECK: pdl_interp.erase %[[ROOT]] |
| // CHECK: pdl_interp.finalize |
| pdl.pattern : benefit(1) { |
| %root = pdl.operation "foo.op" |
| pdl.rewrite %root { |
| pdl.erase %root |
| } |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @operation_attributes |
| module @operation_attributes { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[ATTR:.*]]: !pdl.attribute, %[[ROOT:.*]]: !pdl.operation) |
| // CHECK: %[[ATTR1:.*]] = pdl_interp.create_attribute true |
| // CHECK: pdl_interp.create_operation "foo.op"() {"attr" = %[[ATTR]], "attr1" = %[[ATTR1]]} |
| pdl.pattern : benefit(1) { |
| %attr = pdl.attribute |
| %root = pdl.operation "foo.op" {"attr" = %attr} |
| pdl.rewrite %root { |
| %attr1 = pdl.attribute true |
| %newOp = pdl.operation "foo.op" {"attr" = %attr, "attr1" = %attr1} |
| pdl.erase %root |
| } |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @operation_operands |
| module @operation_operands { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[OPERAND:.*]]: !pdl.value, %[[ROOT:.*]]: !pdl.operation) |
| // CHECK: %[[NEWOP:.*]] = pdl_interp.create_operation "foo.op"(%[[OPERAND]]) |
| // CHECK: %[[OPERAND1:.*]] = pdl_interp.get_result 0 of %[[NEWOP]] |
| // CHECK: pdl_interp.create_operation "foo.op2"(%[[OPERAND1]]) |
| pdl.pattern : benefit(1) { |
| %operand = pdl.input |
| %root = pdl.operation "foo.op"(%operand) |
| pdl.rewrite %root { |
| %type = pdl.type : i32 |
| %newOp, %result = pdl.operation "foo.op"(%operand) -> %type |
| %newOp1 = pdl.operation "foo.op2"(%result) |
| pdl.erase %root |
| } |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @operation_operands |
| module @operation_operands { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[OPERAND:.*]]: !pdl.value, %[[ROOT:.*]]: !pdl.operation) |
| // CHECK: %[[NEWOP:.*]] = pdl_interp.create_operation "foo.op"(%[[OPERAND]]) |
| // CHECK: %[[OPERAND1:.*]] = pdl_interp.get_result 0 of %[[NEWOP]] |
| // CHECK: pdl_interp.create_operation "foo.op2"(%[[OPERAND1]]) |
| pdl.pattern : benefit(1) { |
| %operand = pdl.input |
| %root = pdl.operation "foo.op"(%operand) |
| pdl.rewrite %root { |
| %type = pdl.type : i32 |
| %newOp, %result = pdl.operation "foo.op"(%operand) -> %type |
| %newOp1 = pdl.operation "foo.op2"(%result) |
| pdl.erase %root |
| } |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @operation_result_types |
| module @operation_result_types { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[TYPE:.*]]: !pdl.type, %[[TYPE1:.*]]: !pdl.type |
| // CHECK: pdl_interp.create_operation "foo.op"() -> %[[TYPE]], %[[TYPE1]] |
| pdl.pattern : benefit(1) { |
| %rootType = pdl.type |
| %rootType1 = pdl.type |
| %root, %results:2 = pdl.operation "foo.op" -> %rootType, %rootType1 |
| pdl.rewrite %root { |
| %newType1 = pdl.type |
| %newOp, %newResults:2 = pdl.operation "foo.op" -> %rootType, %newType1 |
| pdl.replace %root with %newOp |
| } |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @operation_result_types_infer_from_value_replacement |
| module @operation_result_types_infer_from_value_replacement { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[TYPE:.*]]: !pdl.type |
| // CHECK: pdl_interp.create_operation "foo.op"() -> %[[TYPE]] |
| pdl.pattern : benefit(1) { |
| %rootType = pdl.type |
| %root, %result = pdl.operation "foo.op" -> %rootType |
| pdl.rewrite %root { |
| %newType = pdl.type |
| %newOp, %newResult = pdl.operation "foo.op" -> %newType |
| pdl.replace %root with (%newResult) |
| } |
| } |
| } |
| // ----- |
| |
| // CHECK-LABEL: module @replace_with_op |
| module @replace_with_op { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[ROOT:.*]]: !pdl.operation) |
| // CHECK: %[[NEWOP:.*]] = pdl_interp.create_operation |
| // CHECK: %[[OP_RESULT:.*]] = pdl_interp.get_result 0 of %[[NEWOP]] |
| // CHECK: pdl_interp.replace %[[ROOT]] with(%[[OP_RESULT]]) |
| pdl.pattern : benefit(1) { |
| %type = pdl.type : i32 |
| %root, %result = pdl.operation "foo.op" -> %type |
| pdl.rewrite %root { |
| %newOp, %newResult = pdl.operation "foo.op" -> %type |
| pdl.replace %root with %newOp |
| } |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @replace_with_values |
| module @replace_with_values { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[ROOT:.*]]: !pdl.operation) |
| // CHECK: %[[NEWOP:.*]] = pdl_interp.create_operation |
| // CHECK: %[[OP_RESULT:.*]] = pdl_interp.get_result 0 of %[[NEWOP]] |
| // CHECK: pdl_interp.replace %[[ROOT]] with(%[[OP_RESULT]]) |
| pdl.pattern : benefit(1) { |
| %type = pdl.type : i32 |
| %root, %result = pdl.operation "foo.op" -> %type |
| pdl.rewrite %root { |
| %newOp, %newResult = pdl.operation "foo.op" -> %type |
| pdl.replace %root with (%newResult) |
| } |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @replace_with_no_results |
| module @replace_with_no_results { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[ROOT:.*]]: !pdl.operation) |
| // CHECK: pdl_interp.create_operation "foo.op" |
| // CHECK: pdl_interp.erase %[[ROOT]] |
| pdl.pattern : benefit(1) { |
| %root = pdl.operation "foo.op" |
| pdl.rewrite %root { |
| %newOp = pdl.operation "foo.op" |
| pdl.replace %root with %newOp |
| } |
| } |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: module @create_native |
| module @create_native { |
| // CHECK: module @rewriters |
| // CHECK: func @pdl_generated_rewriter(%[[ROOT:.*]]: !pdl.operation) |
| // CHECK: %[[TYPE:.*]] = pdl_interp.create_native "functor" [true](%[[ROOT]] : !pdl.operation) : !pdl.type |
| // CHECK: pdl_interp.create_operation "foo.op"() -> %[[TYPE]] |
| pdl.pattern : benefit(1) { |
| %type = pdl.type |
| %root, %result = pdl.operation "foo.op" -> %type |
| pdl.rewrite %root { |
| %newType = pdl.create_native "functor"[true](%root : !pdl.operation) : !pdl.type |
| %newOp, %newResult = pdl.operation "foo.op" -> %newType |
| pdl.replace %root with %newOp |
| } |
| } |
| } |