1abfd1a8bSRiver Riddle// RUN: mlir-opt %s -test-pdl-bytecode-pass -split-input-file | FileCheck %s 2abfd1a8bSRiver Riddle 3abfd1a8bSRiver Riddle// Note: Tests here are written using the PDL Interpreter dialect to avoid 4abfd1a8bSRiver Riddle// unnecessarily testing unnecessary aspects of the pattern compilation 5abfd1a8bSRiver Riddle// pipeline. These tests are written such that we can focus solely on the 6abfd1a8bSRiver Riddle// lowering/execution of the bytecode itself. 7abfd1a8bSRiver Riddle 8abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 9abfd1a8bSRiver Riddle// pdl_interp::ApplyConstraintOp 10abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 11abfd1a8bSRiver Riddle 12abfd1a8bSRiver Riddlemodule @patterns { 13f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 14abfd1a8bSRiver Riddle pdl_interp.apply_constraint "multi_entity_constraint"(%root, %root : !pdl.operation, !pdl.operation) -> ^pat, ^end 15abfd1a8bSRiver Riddle 16abfd1a8bSRiver Riddle ^pat: 17abfd1a8bSRiver Riddle pdl_interp.apply_constraint "single_entity_constraint"(%root : !pdl.operation) -> ^pat2, ^end 18abfd1a8bSRiver Riddle 19abfd1a8bSRiver Riddle ^pat2: 20abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 21abfd1a8bSRiver Riddle 22abfd1a8bSRiver Riddle ^end: 23abfd1a8bSRiver Riddle pdl_interp.finalize 24abfd1a8bSRiver Riddle } 25abfd1a8bSRiver Riddle 26abfd1a8bSRiver Riddle module @rewriters { 27f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 283a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.replaced_by_pattern" 29abfd1a8bSRiver Riddle pdl_interp.erase %root 30abfd1a8bSRiver Riddle pdl_interp.finalize 31abfd1a8bSRiver Riddle } 32abfd1a8bSRiver Riddle } 33abfd1a8bSRiver Riddle} 34abfd1a8bSRiver Riddle 35abfd1a8bSRiver Riddle// CHECK-LABEL: test.apply_constraint_1 36abfd1a8bSRiver Riddle// CHECK: "test.replaced_by_pattern" 37abfd1a8bSRiver Riddlemodule @ir attributes { test.apply_constraint_1 } { 38abfd1a8bSRiver Riddle "test.op"() { test_attr } : () -> () 39abfd1a8bSRiver Riddle} 40abfd1a8bSRiver Riddle 41abfd1a8bSRiver Riddle// ----- 42abfd1a8bSRiver Riddle 4385ab413bSRiver Riddlemodule @patterns { 44f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 4585ab413bSRiver Riddle %results = pdl_interp.get_results of %root : !pdl.range<value> 4685ab413bSRiver Riddle %types = pdl_interp.get_value_type of %results : !pdl.range<type> 4785ab413bSRiver Riddle pdl_interp.apply_constraint "multi_entity_var_constraint"(%results, %types : !pdl.range<value>, !pdl.range<type>) -> ^pat, ^end 4885ab413bSRiver Riddle 4985ab413bSRiver Riddle ^pat: 5085ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 5185ab413bSRiver Riddle 5285ab413bSRiver Riddle ^end: 5385ab413bSRiver Riddle pdl_interp.finalize 5485ab413bSRiver Riddle } 5585ab413bSRiver Riddle 5685ab413bSRiver Riddle module @rewriters { 57f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 5885ab413bSRiver Riddle %op = pdl_interp.create_operation "test.replaced_by_pattern" 5985ab413bSRiver Riddle pdl_interp.erase %root 6085ab413bSRiver Riddle pdl_interp.finalize 6185ab413bSRiver Riddle } 6285ab413bSRiver Riddle } 6385ab413bSRiver Riddle} 6485ab413bSRiver Riddle 6585ab413bSRiver Riddle// CHECK-LABEL: test.apply_constraint_2 6685ab413bSRiver Riddle// CHECK-NOT: "test.replaced_by_pattern" 6785ab413bSRiver Riddle// CHECK: "test.replaced_by_pattern" 6885ab413bSRiver Riddlemodule @ir attributes { test.apply_constraint_2 } { 6985ab413bSRiver Riddle "test.failure_op"() { test_attr } : () -> () 7085ab413bSRiver Riddle "test.success_op"() : () -> (i32, i64) 7185ab413bSRiver Riddle} 7285ab413bSRiver Riddle 7385ab413bSRiver Riddle// ----- 7485ab413bSRiver Riddle 756d2b2b8eSMartin Lücke// Test support for negated constraints. 766d2b2b8eSMartin Lückemodule @patterns { 776d2b2b8eSMartin Lücke pdl_interp.func @matcher(%root : !pdl.operation) { 786d2b2b8eSMartin Lücke %test_attr = pdl_interp.create_attribute unit 796d2b2b8eSMartin Lücke %attr = pdl_interp.get_attribute "test_attr" of %root 806d2b2b8eSMartin Lücke pdl_interp.are_equal %test_attr, %attr : !pdl.attribute -> ^pat, ^end 816d2b2b8eSMartin Lücke 826d2b2b8eSMartin Lücke ^pat: 836d2b2b8eSMartin Lücke pdl_interp.apply_constraint "single_entity_constraint"(%root : !pdl.operation) {isNegated = true} -> ^pat1, ^end 846d2b2b8eSMartin Lücke 856d2b2b8eSMartin Lücke ^pat1: 866d2b2b8eSMartin Lücke pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 876d2b2b8eSMartin Lücke 886d2b2b8eSMartin Lücke ^end: 896d2b2b8eSMartin Lücke pdl_interp.finalize 906d2b2b8eSMartin Lücke } 916d2b2b8eSMartin Lücke 926d2b2b8eSMartin Lücke module @rewriters { 936d2b2b8eSMartin Lücke pdl_interp.func @success(%root : !pdl.operation) { 946d2b2b8eSMartin Lücke %op = pdl_interp.create_operation "test.replaced_by_pattern" 956d2b2b8eSMartin Lücke pdl_interp.erase %root 966d2b2b8eSMartin Lücke pdl_interp.finalize 976d2b2b8eSMartin Lücke } 986d2b2b8eSMartin Lücke } 996d2b2b8eSMartin Lücke} 1006d2b2b8eSMartin Lücke 1016d2b2b8eSMartin Lücke// CHECK-LABEL: test.apply_constraint_3 1026d2b2b8eSMartin Lücke// CHECK-NEXT: "test.replaced_by_pattern" 1036d2b2b8eSMartin Lücke// CHECK-NOT: "test.replaced_by_pattern" 1046d2b2b8eSMartin Lücke 1056d2b2b8eSMartin Lückemodule @ir attributes { test.apply_constraint_3 } { 1066d2b2b8eSMartin Lücke "test.foo"() { test_attr } : () -> () 1076d2b2b8eSMartin Lücke "test.op"() { test_attr } : () -> () 1086d2b2b8eSMartin Lücke} 1096d2b2b8eSMartin Lücke 1106d2b2b8eSMartin Lücke// ----- 1116d2b2b8eSMartin Lücke 112*8ec28af8SMatthias Gehre// Test returning a type from a native constraint. 113*8ec28af8SMatthias Gehremodule @patterns { 114*8ec28af8SMatthias Gehre pdl_interp.func @matcher(%root : !pdl.operation) { 115*8ec28af8SMatthias Gehre pdl_interp.check_operation_name of %root is "test.success_op" -> ^pat, ^end 116*8ec28af8SMatthias Gehre 117*8ec28af8SMatthias Gehre ^pat: 118*8ec28af8SMatthias Gehre %new_type = pdl_interp.apply_constraint "op_constr_return_type"(%root : !pdl.operation) : !pdl.type -> ^pat2, ^end 119*8ec28af8SMatthias Gehre 120*8ec28af8SMatthias Gehre ^pat2: 121*8ec28af8SMatthias Gehre pdl_interp.record_match @rewriters::@success(%root, %new_type : !pdl.operation, !pdl.type) : benefit(1), loc([%root]) -> ^end 122*8ec28af8SMatthias Gehre 123*8ec28af8SMatthias Gehre ^end: 124*8ec28af8SMatthias Gehre pdl_interp.finalize 125*8ec28af8SMatthias Gehre } 126*8ec28af8SMatthias Gehre 127*8ec28af8SMatthias Gehre module @rewriters { 128*8ec28af8SMatthias Gehre pdl_interp.func @success(%root : !pdl.operation, %new_type : !pdl.type) { 129*8ec28af8SMatthias Gehre %op = pdl_interp.create_operation "test.replaced_by_pattern" -> (%new_type : !pdl.type) 130*8ec28af8SMatthias Gehre pdl_interp.erase %root 131*8ec28af8SMatthias Gehre pdl_interp.finalize 132*8ec28af8SMatthias Gehre } 133*8ec28af8SMatthias Gehre } 134*8ec28af8SMatthias Gehre} 135*8ec28af8SMatthias Gehre 136*8ec28af8SMatthias Gehre// CHECK-LABEL: test.apply_constraint_4 137*8ec28af8SMatthias Gehre// CHECK-NOT: "test.replaced_by_pattern" 138*8ec28af8SMatthias Gehre// CHECK: "test.replaced_by_pattern"() : () -> f32 139*8ec28af8SMatthias Gehremodule @ir attributes { test.apply_constraint_4 } { 140*8ec28af8SMatthias Gehre "test.failure_op"() : () -> () 141*8ec28af8SMatthias Gehre "test.success_op"() : () -> () 142*8ec28af8SMatthias Gehre} 143*8ec28af8SMatthias Gehre 144*8ec28af8SMatthias Gehre// ----- 145*8ec28af8SMatthias Gehre 146*8ec28af8SMatthias Gehre// Test success and failure cases of native constraints with pdl.range results. 147*8ec28af8SMatthias Gehremodule @patterns { 148*8ec28af8SMatthias Gehre pdl_interp.func @matcher(%root : !pdl.operation) { 149*8ec28af8SMatthias Gehre pdl_interp.check_operation_name of %root is "test.success_op" -> ^pat, ^end 150*8ec28af8SMatthias Gehre 151*8ec28af8SMatthias Gehre ^pat: 152*8ec28af8SMatthias Gehre %num_results = pdl_interp.create_attribute 2 : i32 153*8ec28af8SMatthias Gehre %types = pdl_interp.apply_constraint "op_constr_return_type_range"(%root, %num_results : !pdl.operation, !pdl.attribute) : !pdl.range<type> -> ^pat1, ^end 154*8ec28af8SMatthias Gehre 155*8ec28af8SMatthias Gehre ^pat1: 156*8ec28af8SMatthias Gehre pdl_interp.record_match @rewriters::@success(%root, %types : !pdl.operation, !pdl.range<type>) : benefit(1), loc([%root]) -> ^end 157*8ec28af8SMatthias Gehre 158*8ec28af8SMatthias Gehre ^end: 159*8ec28af8SMatthias Gehre pdl_interp.finalize 160*8ec28af8SMatthias Gehre } 161*8ec28af8SMatthias Gehre 162*8ec28af8SMatthias Gehre module @rewriters { 163*8ec28af8SMatthias Gehre pdl_interp.func @success(%root : !pdl.operation, %types : !pdl.range<type>) { 164*8ec28af8SMatthias Gehre %op = pdl_interp.create_operation "test.replaced_by_pattern" -> (%types : !pdl.range<type>) 165*8ec28af8SMatthias Gehre pdl_interp.erase %root 166*8ec28af8SMatthias Gehre pdl_interp.finalize 167*8ec28af8SMatthias Gehre } 168*8ec28af8SMatthias Gehre } 169*8ec28af8SMatthias Gehre} 170*8ec28af8SMatthias Gehre 171*8ec28af8SMatthias Gehre// CHECK-LABEL: test.apply_constraint_5 172*8ec28af8SMatthias Gehre// CHECK-NOT: "test.replaced_by_pattern" 173*8ec28af8SMatthias Gehre// CHECK: "test.replaced_by_pattern"() : () -> (f32, f32) 174*8ec28af8SMatthias Gehremodule @ir attributes { test.apply_constraint_5 } { 175*8ec28af8SMatthias Gehre "test.failure_op"() : () -> () 176*8ec28af8SMatthias Gehre "test.success_op"() : () -> () 177*8ec28af8SMatthias Gehre} 178*8ec28af8SMatthias Gehre 179*8ec28af8SMatthias Gehre// ----- 1806d2b2b8eSMartin Lücke 181abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 182abfd1a8bSRiver Riddle// pdl_interp::ApplyRewriteOp 183abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 184abfd1a8bSRiver Riddle 185abfd1a8bSRiver Riddlemodule @patterns { 186f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 187abfd1a8bSRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat, ^end 188abfd1a8bSRiver Riddle 189abfd1a8bSRiver Riddle ^pat: 190abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 191abfd1a8bSRiver Riddle 192abfd1a8bSRiver Riddle ^end: 193abfd1a8bSRiver Riddle pdl_interp.finalize 194abfd1a8bSRiver Riddle } 195abfd1a8bSRiver Riddle 196abfd1a8bSRiver Riddle module @rewriters { 197f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 198abfd1a8bSRiver Riddle %operand = pdl_interp.get_operand 0 of %root 1999595f356SRiver Riddle pdl_interp.apply_rewrite "rewriter"(%root, %operand : !pdl.operation, !pdl.value) 200abfd1a8bSRiver Riddle pdl_interp.finalize 201abfd1a8bSRiver Riddle } 202abfd1a8bSRiver Riddle } 203abfd1a8bSRiver Riddle} 204abfd1a8bSRiver Riddle 205abfd1a8bSRiver Riddle// CHECK-LABEL: test.apply_rewrite_1 206abfd1a8bSRiver Riddle// CHECK: %[[INPUT:.*]] = "test.op_input" 207abfd1a8bSRiver Riddle// CHECK-NOT: "test.op" 2089595f356SRiver Riddle// CHECK: "test.success"(%[[INPUT]]) 209abfd1a8bSRiver Riddlemodule @ir attributes { test.apply_rewrite_1 } { 210abfd1a8bSRiver Riddle %input = "test.op_input"() : () -> i32 211abfd1a8bSRiver Riddle "test.op"(%input) : (i32) -> () 212abfd1a8bSRiver Riddle} 21302c4c0d5SRiver Riddle 21402c4c0d5SRiver Riddle// ----- 21502c4c0d5SRiver Riddle 21602c4c0d5SRiver Riddlemodule @patterns { 217f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 21802c4c0d5SRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat, ^end 21902c4c0d5SRiver Riddle 22002c4c0d5SRiver Riddle ^pat: 22102c4c0d5SRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 22202c4c0d5SRiver Riddle 22302c4c0d5SRiver Riddle ^end: 22402c4c0d5SRiver Riddle pdl_interp.finalize 22502c4c0d5SRiver Riddle } 22602c4c0d5SRiver Riddle 22702c4c0d5SRiver Riddle module @rewriters { 228f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 22902c4c0d5SRiver Riddle %op = pdl_interp.apply_rewrite "creator"(%root : !pdl.operation) : !pdl.operation 23002c4c0d5SRiver Riddle pdl_interp.erase %root 23102c4c0d5SRiver Riddle pdl_interp.finalize 23202c4c0d5SRiver Riddle } 23302c4c0d5SRiver Riddle } 23402c4c0d5SRiver Riddle} 23502c4c0d5SRiver Riddle 23602c4c0d5SRiver Riddle// CHECK-LABEL: test.apply_rewrite_2 23702c4c0d5SRiver Riddle// CHECK: "test.success" 23802c4c0d5SRiver Riddlemodule @ir attributes { test.apply_rewrite_2 } { 23902c4c0d5SRiver Riddle "test.op"() : () -> () 24002c4c0d5SRiver Riddle} 24102c4c0d5SRiver Riddle 242abfd1a8bSRiver Riddle// ----- 243abfd1a8bSRiver Riddle 24485ab413bSRiver Riddlemodule @patterns { 245f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 24685ab413bSRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat, ^end 24785ab413bSRiver Riddle 24885ab413bSRiver Riddle ^pat: 24985ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 25085ab413bSRiver Riddle 25185ab413bSRiver Riddle ^end: 25285ab413bSRiver Riddle pdl_interp.finalize 25385ab413bSRiver Riddle } 25485ab413bSRiver Riddle 25585ab413bSRiver Riddle module @rewriters { 256f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 25785ab413bSRiver Riddle %operands, %types = pdl_interp.apply_rewrite "var_creator"(%root : !pdl.operation) : !pdl.range<value>, !pdl.range<type> 25885ab413bSRiver Riddle %op = pdl_interp.create_operation "test.success"(%operands : !pdl.range<value>) -> (%types : !pdl.range<type>) 25985ab413bSRiver Riddle pdl_interp.replace %root with (%operands : !pdl.range<value>) 26085ab413bSRiver Riddle pdl_interp.finalize 26185ab413bSRiver Riddle } 26285ab413bSRiver Riddle } 26385ab413bSRiver Riddle} 26485ab413bSRiver Riddle 26585ab413bSRiver Riddle// CHECK-LABEL: test.apply_rewrite_3 26685ab413bSRiver Riddle// CHECK: %[[OPERAND:.*]] = "test.producer" 26785ab413bSRiver Riddle// CHECK: "test.success"(%[[OPERAND]]) : (i32) -> i32 26885ab413bSRiver Riddle// CHECK: "test.consumer"(%[[OPERAND]]) 26985ab413bSRiver Riddlemodule @ir attributes { test.apply_rewrite_3 } { 27085ab413bSRiver Riddle %first_operand = "test.producer"() : () -> (i32) 27185ab413bSRiver Riddle %operand = "test.op"(%first_operand) : (i32) -> (i32) 27285ab413bSRiver Riddle "test.consumer"(%operand) : (i32) -> () 27385ab413bSRiver Riddle} 27485ab413bSRiver Riddle 27585ab413bSRiver Riddle// ----- 27685ab413bSRiver Riddle 27785ab413bSRiver Riddlemodule @patterns { 278f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 27985ab413bSRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat, ^end 28085ab413bSRiver Riddle 28185ab413bSRiver Riddle ^pat: 28285ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 28385ab413bSRiver Riddle 28485ab413bSRiver Riddle ^end: 28585ab413bSRiver Riddle pdl_interp.finalize 28685ab413bSRiver Riddle } 28785ab413bSRiver Riddle 28885ab413bSRiver Riddle module @rewriters { 289f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 290ea64828aSRiver Riddle %attr = pdl_interp.apply_rewrite "str_creator" : !pdl.attribute 29185ab413bSRiver Riddle %type = pdl_interp.apply_rewrite "type_creator" : !pdl.type 292ea64828aSRiver Riddle %newOp = pdl_interp.create_operation "test.success" {"attr" = %attr} -> (%type : !pdl.type) 29385ab413bSRiver Riddle pdl_interp.erase %root 29485ab413bSRiver Riddle pdl_interp.finalize 29585ab413bSRiver Riddle } 29685ab413bSRiver Riddle } 29785ab413bSRiver Riddle} 29885ab413bSRiver Riddle 29985ab413bSRiver Riddle// CHECK-LABEL: test.apply_rewrite_4 300ea64828aSRiver Riddle// CHECK: "test.success"() {attr = "test.str"} : () -> f32 30185ab413bSRiver Riddlemodule @ir attributes { test.apply_rewrite_4 } { 30285ab413bSRiver Riddle "test.op"() : () -> () 30385ab413bSRiver Riddle} 30485ab413bSRiver Riddle 30585ab413bSRiver Riddle// ----- 30685ab413bSRiver Riddle 307abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 308abfd1a8bSRiver Riddle// pdl_interp::AreEqualOp 309abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 310abfd1a8bSRiver Riddle 311abfd1a8bSRiver Riddlemodule @patterns { 312f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 313abfd1a8bSRiver Riddle %test_attr = pdl_interp.create_attribute unit 314abfd1a8bSRiver Riddle %attr = pdl_interp.get_attribute "test_attr" of %root 315abfd1a8bSRiver Riddle pdl_interp.are_equal %test_attr, %attr : !pdl.attribute -> ^pat, ^end 316abfd1a8bSRiver Riddle 317abfd1a8bSRiver Riddle ^pat: 318abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 319abfd1a8bSRiver Riddle 320abfd1a8bSRiver Riddle ^end: 321abfd1a8bSRiver Riddle pdl_interp.finalize 322abfd1a8bSRiver Riddle } 323abfd1a8bSRiver Riddle 324abfd1a8bSRiver Riddle module @rewriters { 325f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 3263a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 327abfd1a8bSRiver Riddle pdl_interp.erase %root 328abfd1a8bSRiver Riddle pdl_interp.finalize 329abfd1a8bSRiver Riddle } 330abfd1a8bSRiver Riddle } 331abfd1a8bSRiver Riddle} 332abfd1a8bSRiver Riddle 333abfd1a8bSRiver Riddle// CHECK-LABEL: test.are_equal_1 334abfd1a8bSRiver Riddle// CHECK: "test.success" 335abfd1a8bSRiver Riddlemodule @ir attributes { test.are_equal_1 } { 336abfd1a8bSRiver Riddle "test.op"() { test_attr } : () -> () 337abfd1a8bSRiver Riddle} 338abfd1a8bSRiver Riddle 339abfd1a8bSRiver Riddle// ----- 340abfd1a8bSRiver Riddle 34185ab413bSRiver Riddlemodule @patterns { 342f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 34385ab413bSRiver Riddle %const_types = pdl_interp.create_types [i32, i64] 34485ab413bSRiver Riddle %results = pdl_interp.get_results of %root : !pdl.range<value> 34585ab413bSRiver Riddle %result_types = pdl_interp.get_value_type of %results : !pdl.range<type> 34685ab413bSRiver Riddle pdl_interp.are_equal %result_types, %const_types : !pdl.range<type> -> ^pat, ^end 34785ab413bSRiver Riddle 34885ab413bSRiver Riddle ^pat: 34985ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 35085ab413bSRiver Riddle 35185ab413bSRiver Riddle ^end: 35285ab413bSRiver Riddle pdl_interp.finalize 35385ab413bSRiver Riddle } 35485ab413bSRiver Riddle 35585ab413bSRiver Riddle module @rewriters { 356f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 35785ab413bSRiver Riddle %op = pdl_interp.create_operation "test.success" 35885ab413bSRiver Riddle pdl_interp.erase %root 35985ab413bSRiver Riddle pdl_interp.finalize 36085ab413bSRiver Riddle } 36185ab413bSRiver Riddle } 36285ab413bSRiver Riddle} 36385ab413bSRiver Riddle 36485ab413bSRiver Riddle// CHECK-LABEL: test.are_equal_2 36585ab413bSRiver Riddle// CHECK: "test.not_equal" 36685ab413bSRiver Riddle// CHECK: "test.success" 36785ab413bSRiver Riddle// CHECK-NOT: "test.op" 36885ab413bSRiver Riddlemodule @ir attributes { test.are_equal_2 } { 36985ab413bSRiver Riddle "test.not_equal"() : () -> (i32) 37085ab413bSRiver Riddle "test.op"() : () -> (i32, i64) 37185ab413bSRiver Riddle} 37285ab413bSRiver Riddle 37385ab413bSRiver Riddle// ----- 37485ab413bSRiver Riddle 375abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 376abfd1a8bSRiver Riddle// pdl_interp::BranchOp 377abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 378abfd1a8bSRiver Riddle 379abfd1a8bSRiver Riddlemodule @patterns { 380f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 381abfd1a8bSRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat1, ^end 382abfd1a8bSRiver Riddle 383abfd1a8bSRiver Riddle ^pat1: 384abfd1a8bSRiver Riddle pdl_interp.branch ^pat2 385abfd1a8bSRiver Riddle 386abfd1a8bSRiver Riddle ^pat2: 387abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(2), loc([%root]) -> ^end 388abfd1a8bSRiver Riddle 389abfd1a8bSRiver Riddle ^end: 390abfd1a8bSRiver Riddle pdl_interp.finalize 391abfd1a8bSRiver Riddle } 392abfd1a8bSRiver Riddle 393abfd1a8bSRiver Riddle module @rewriters { 394f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 3953a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 396abfd1a8bSRiver Riddle pdl_interp.erase %root 397abfd1a8bSRiver Riddle pdl_interp.finalize 398abfd1a8bSRiver Riddle } 399abfd1a8bSRiver Riddle } 400abfd1a8bSRiver Riddle} 401abfd1a8bSRiver Riddle 402abfd1a8bSRiver Riddle// CHECK-LABEL: test.branch_1 403abfd1a8bSRiver Riddle// CHECK: "test.success" 404abfd1a8bSRiver Riddlemodule @ir attributes { test.branch_1 } { 405abfd1a8bSRiver Riddle "test.op"() : () -> () 406abfd1a8bSRiver Riddle} 407abfd1a8bSRiver Riddle 408abfd1a8bSRiver Riddle// ----- 409abfd1a8bSRiver Riddle 410abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 411abfd1a8bSRiver Riddle// pdl_interp::CheckAttributeOp 412abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 413abfd1a8bSRiver Riddle 414abfd1a8bSRiver Riddlemodule @patterns { 415f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 416abfd1a8bSRiver Riddle %attr = pdl_interp.get_attribute "test_attr" of %root 417abfd1a8bSRiver Riddle pdl_interp.check_attribute %attr is unit -> ^pat, ^end 418abfd1a8bSRiver Riddle 419abfd1a8bSRiver Riddle ^pat: 420abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 421abfd1a8bSRiver Riddle 422abfd1a8bSRiver Riddle ^end: 423abfd1a8bSRiver Riddle pdl_interp.finalize 424abfd1a8bSRiver Riddle } 425abfd1a8bSRiver Riddle 426abfd1a8bSRiver Riddle module @rewriters { 427f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 4283a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 429abfd1a8bSRiver Riddle pdl_interp.erase %root 430abfd1a8bSRiver Riddle pdl_interp.finalize 431abfd1a8bSRiver Riddle } 432abfd1a8bSRiver Riddle } 433abfd1a8bSRiver Riddle} 434abfd1a8bSRiver Riddle 435abfd1a8bSRiver Riddle// CHECK-LABEL: test.check_attribute_1 436abfd1a8bSRiver Riddle// CHECK: "test.success" 437abfd1a8bSRiver Riddlemodule @ir attributes { test.check_attribute_1 } { 438abfd1a8bSRiver Riddle "test.op"() { test_attr } : () -> () 439abfd1a8bSRiver Riddle} 440abfd1a8bSRiver Riddle 441abfd1a8bSRiver Riddle// ----- 442abfd1a8bSRiver Riddle 443abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 444abfd1a8bSRiver Riddle// pdl_interp::CheckOperandCountOp 445abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 446abfd1a8bSRiver Riddle 447abfd1a8bSRiver Riddlemodule @patterns { 448f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 44985ab413bSRiver Riddle pdl_interp.check_operand_count of %root is at_least 1 -> ^exact_check, ^end 45085ab413bSRiver Riddle 45185ab413bSRiver Riddle ^exact_check: 45285ab413bSRiver Riddle pdl_interp.check_operand_count of %root is 2 -> ^pat, ^end 453abfd1a8bSRiver Riddle 454abfd1a8bSRiver Riddle ^pat: 455abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 456abfd1a8bSRiver Riddle 457abfd1a8bSRiver Riddle ^end: 458abfd1a8bSRiver Riddle pdl_interp.finalize 459abfd1a8bSRiver Riddle } 460abfd1a8bSRiver Riddle 461abfd1a8bSRiver Riddle module @rewriters { 462f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 4633a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 464abfd1a8bSRiver Riddle pdl_interp.erase %root 465abfd1a8bSRiver Riddle pdl_interp.finalize 466abfd1a8bSRiver Riddle } 467abfd1a8bSRiver Riddle } 468abfd1a8bSRiver Riddle} 469abfd1a8bSRiver Riddle 470abfd1a8bSRiver Riddle// CHECK-LABEL: test.check_operand_count_1 471abfd1a8bSRiver Riddle// CHECK: "test.op"() : () -> i32 472abfd1a8bSRiver Riddle// CHECK: "test.success" 473abfd1a8bSRiver Riddlemodule @ir attributes { test.check_operand_count_1 } { 474abfd1a8bSRiver Riddle %operand = "test.op"() : () -> i32 47585ab413bSRiver Riddle "test.op"(%operand, %operand) : (i32, i32) -> () 476abfd1a8bSRiver Riddle} 477abfd1a8bSRiver Riddle 478abfd1a8bSRiver Riddle// ----- 479abfd1a8bSRiver Riddle 480abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 481abfd1a8bSRiver Riddle// pdl_interp::CheckOperationNameOp 482abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 483abfd1a8bSRiver Riddle 484abfd1a8bSRiver Riddlemodule @patterns { 485f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 486abfd1a8bSRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat, ^end 487abfd1a8bSRiver Riddle 488abfd1a8bSRiver Riddle ^pat: 489abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 490abfd1a8bSRiver Riddle 491abfd1a8bSRiver Riddle ^end: 492abfd1a8bSRiver Riddle pdl_interp.finalize 493abfd1a8bSRiver Riddle } 494abfd1a8bSRiver Riddle 495abfd1a8bSRiver Riddle module @rewriters { 496f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 4973a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 498abfd1a8bSRiver Riddle pdl_interp.erase %root 499abfd1a8bSRiver Riddle pdl_interp.finalize 500abfd1a8bSRiver Riddle } 501abfd1a8bSRiver Riddle } 502abfd1a8bSRiver Riddle} 503abfd1a8bSRiver Riddle 504abfd1a8bSRiver Riddle// CHECK-LABEL: test.check_operation_name_1 505abfd1a8bSRiver Riddle// CHECK: "test.success" 506abfd1a8bSRiver Riddlemodule @ir attributes { test.check_operation_name_1 } { 507abfd1a8bSRiver Riddle "test.op"() : () -> () 508abfd1a8bSRiver Riddle} 509abfd1a8bSRiver Riddle 510abfd1a8bSRiver Riddle// ----- 511abfd1a8bSRiver Riddle 512abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 513abfd1a8bSRiver Riddle// pdl_interp::CheckResultCountOp 514abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 515abfd1a8bSRiver Riddle 516abfd1a8bSRiver Riddlemodule @patterns { 517f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 51885ab413bSRiver Riddle pdl_interp.check_result_count of %root is at_least 1 -> ^exact_check, ^end 51985ab413bSRiver Riddle 52085ab413bSRiver Riddle ^exact_check: 52185ab413bSRiver Riddle pdl_interp.check_result_count of %root is 2 -> ^pat, ^end 522abfd1a8bSRiver Riddle 523abfd1a8bSRiver Riddle ^pat: 524abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 525abfd1a8bSRiver Riddle 526abfd1a8bSRiver Riddle ^end: 527abfd1a8bSRiver Riddle pdl_interp.finalize 528abfd1a8bSRiver Riddle } 529abfd1a8bSRiver Riddle 530abfd1a8bSRiver Riddle module @rewriters { 531f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 5323a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 533abfd1a8bSRiver Riddle pdl_interp.erase %root 534abfd1a8bSRiver Riddle pdl_interp.finalize 535abfd1a8bSRiver Riddle } 536abfd1a8bSRiver Riddle } 537abfd1a8bSRiver Riddle} 538abfd1a8bSRiver Riddle 539abfd1a8bSRiver Riddle// CHECK-LABEL: test.check_result_count_1 54085ab413bSRiver Riddle// CHECK: "test.op"() : () -> i32 541abfd1a8bSRiver Riddle// CHECK: "test.success"() : () -> () 54285ab413bSRiver Riddle// CHECK-NOT: "test.op"() : () -> (i32, i32) 543abfd1a8bSRiver Riddlemodule @ir attributes { test.check_result_count_1 } { 544abfd1a8bSRiver Riddle "test.op"() : () -> i32 54585ab413bSRiver Riddle "test.op"() : () -> (i32, i32) 546abfd1a8bSRiver Riddle} 547abfd1a8bSRiver Riddle 548abfd1a8bSRiver Riddle// ----- 549abfd1a8bSRiver Riddle 550abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 551abfd1a8bSRiver Riddle// pdl_interp::CheckTypeOp 552abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 553abfd1a8bSRiver Riddle 554abfd1a8bSRiver Riddlemodule @patterns { 555f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 556abfd1a8bSRiver Riddle %attr = pdl_interp.get_attribute "test_attr" of %root 557abfd1a8bSRiver Riddle pdl_interp.is_not_null %attr : !pdl.attribute -> ^pat1, ^end 558abfd1a8bSRiver Riddle 559abfd1a8bSRiver Riddle ^pat1: 560abfd1a8bSRiver Riddle %type = pdl_interp.get_attribute_type of %attr 561abfd1a8bSRiver Riddle pdl_interp.check_type %type is i32 -> ^pat2, ^end 562abfd1a8bSRiver Riddle 563abfd1a8bSRiver Riddle ^pat2: 564abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 565abfd1a8bSRiver Riddle 566abfd1a8bSRiver Riddle ^end: 567abfd1a8bSRiver Riddle pdl_interp.finalize 568abfd1a8bSRiver Riddle } 569abfd1a8bSRiver Riddle 570abfd1a8bSRiver Riddle module @rewriters { 571f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 5723a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 573abfd1a8bSRiver Riddle pdl_interp.erase %root 574abfd1a8bSRiver Riddle pdl_interp.finalize 575abfd1a8bSRiver Riddle } 576abfd1a8bSRiver Riddle } 577abfd1a8bSRiver Riddle} 578abfd1a8bSRiver Riddle 579abfd1a8bSRiver Riddle// CHECK-LABEL: test.check_type_1 580abfd1a8bSRiver Riddle// CHECK: "test.success" 581abfd1a8bSRiver Riddlemodule @ir attributes { test.check_type_1 } { 582abfd1a8bSRiver Riddle "test.op"() { test_attr = 10 : i32 } : () -> () 583abfd1a8bSRiver Riddle} 584abfd1a8bSRiver Riddle 585abfd1a8bSRiver Riddle// ----- 586abfd1a8bSRiver Riddle 587abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 58885ab413bSRiver Riddle// pdl_interp::CheckTypesOp 58985ab413bSRiver Riddle//===----------------------------------------------------------------------===// 59085ab413bSRiver Riddle 59185ab413bSRiver Riddlemodule @patterns { 592f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 59385ab413bSRiver Riddle %results = pdl_interp.get_results of %root : !pdl.range<value> 59485ab413bSRiver Riddle %result_types = pdl_interp.get_value_type of %results : !pdl.range<type> 59585ab413bSRiver Riddle pdl_interp.check_types %result_types are [i32] -> ^pat2, ^end 59685ab413bSRiver Riddle 59785ab413bSRiver Riddle ^pat2: 59885ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 59985ab413bSRiver Riddle 60085ab413bSRiver Riddle ^end: 60185ab413bSRiver Riddle pdl_interp.finalize 60285ab413bSRiver Riddle } 60385ab413bSRiver Riddle 60485ab413bSRiver Riddle module @rewriters { 605f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 60685ab413bSRiver Riddle %op = pdl_interp.create_operation "test.success" 60785ab413bSRiver Riddle pdl_interp.erase %root 60885ab413bSRiver Riddle pdl_interp.finalize 60985ab413bSRiver Riddle } 61085ab413bSRiver Riddle } 61185ab413bSRiver Riddle} 61285ab413bSRiver Riddle 61385ab413bSRiver Riddle// CHECK-LABEL: test.check_types_1 61485ab413bSRiver Riddle// CHECK: "test.op"() : () -> (i32, i64) 61585ab413bSRiver Riddle// CHECK: "test.success" 61685ab413bSRiver Riddle// CHECK-NOT: "test.op"() : () -> i32 61785ab413bSRiver Riddlemodule @ir attributes { test.check_types_1 } { 61885ab413bSRiver Riddle "test.op"() : () -> (i32, i64) 61985ab413bSRiver Riddle "test.op"() : () -> i32 62085ab413bSRiver Riddle} 62185ab413bSRiver Riddle 62285ab413bSRiver Riddle// ----- 62385ab413bSRiver Riddle 62485ab413bSRiver Riddle//===----------------------------------------------------------------------===// 6253eb1647aSStanislav Funiak// pdl_interp::ContinueOp 6263eb1647aSStanislav Funiak//===----------------------------------------------------------------------===// 6273eb1647aSStanislav Funiak 6283eb1647aSStanislav Funiak// Fully tested within the tests for other operations. 6293eb1647aSStanislav Funiak 6303eb1647aSStanislav Funiak//===----------------------------------------------------------------------===// 631abfd1a8bSRiver Riddle// pdl_interp::CreateAttributeOp 632abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 633abfd1a8bSRiver Riddle 634abfd1a8bSRiver Riddle// Fully tested within the tests for other operations. 635abfd1a8bSRiver Riddle 636abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 637abfd1a8bSRiver Riddle// pdl_interp::CreateOperationOp 638abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 639abfd1a8bSRiver Riddle 6403c752289SRiver Riddle// Unused operation to force loading the `arithmetic` dialect for the 6413c752289SRiver Riddle// test of type inferrence. 6423c752289SRiver Riddlearith.constant 10 6433c752289SRiver Riddle 6443c752289SRiver Riddle// Test support for inferring the types of an operation. 6453c752289SRiver Riddlemodule @patterns { 6463c752289SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 6473c752289SRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat, ^end 6483c752289SRiver Riddle 6493c752289SRiver Riddle ^pat: 6503c752289SRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 6513c752289SRiver Riddle 6523c752289SRiver Riddle ^end: 6533c752289SRiver Riddle pdl_interp.finalize 6543c752289SRiver Riddle } 6553c752289SRiver Riddle 6563c752289SRiver Riddle module @rewriters { 6573c752289SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 6583c752289SRiver Riddle %attr = pdl_interp.create_attribute true 6593c752289SRiver Riddle %cst = pdl_interp.create_operation "arith.constant" {"value" = %attr} -> <inferred> 6603c752289SRiver Riddle %cstResults = pdl_interp.get_results of %cst : !pdl.range<value> 6613c752289SRiver Riddle %op = pdl_interp.create_operation "test.success"(%cstResults : !pdl.range<value>) 6623c752289SRiver Riddle pdl_interp.erase %root 6633c752289SRiver Riddle pdl_interp.finalize 6643c752289SRiver Riddle } 6653c752289SRiver Riddle } 6663c752289SRiver Riddle} 6673c752289SRiver Riddle 6683c752289SRiver Riddle// CHECK-LABEL: test.create_op_infer_results 6693c752289SRiver Riddle// CHECK: %[[CST:.*]] = arith.constant true 6703c752289SRiver Riddle// CHECK: "test.success"(%[[CST]]) 6713c752289SRiver Riddlemodule @ir attributes { test.create_op_infer_results } { 6723c752289SRiver Riddle %results:2 = "test.op"() : () -> (i64, i64) 6733c752289SRiver Riddle} 6743c752289SRiver Riddle 675abfd1a8bSRiver Riddle// ----- 676abfd1a8bSRiver Riddle 677abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 678ce57789dSRiver Riddle// pdl_interp::CreateRangeOp 679ce57789dSRiver Riddle//===----------------------------------------------------------------------===// 680ce57789dSRiver Riddle 681ce57789dSRiver Riddlemodule @patterns { 682ce57789dSRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 683ce57789dSRiver Riddle pdl_interp.check_operand_count of %root is 2 -> ^pat1, ^end 684ce57789dSRiver Riddle 685ce57789dSRiver Riddle ^pat1: 686ce57789dSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 687ce57789dSRiver Riddle 688ce57789dSRiver Riddle ^end: 689ce57789dSRiver Riddle pdl_interp.finalize 690ce57789dSRiver Riddle } 691ce57789dSRiver Riddle 692ce57789dSRiver Riddle module @rewriters { 693ce57789dSRiver Riddle pdl_interp.func @success(%root: !pdl.operation) { 694ce57789dSRiver Riddle %rootOperand = pdl_interp.get_operand 0 of %root 695ce57789dSRiver Riddle %rootOperands = pdl_interp.get_operands of %root : !pdl.range<value> 696ce57789dSRiver Riddle %operandRange = pdl_interp.create_range %rootOperand, %rootOperands : !pdl.value, !pdl.range<value> 697ce57789dSRiver Riddle 698ce57789dSRiver Riddle %operandType = pdl_interp.get_value_type of %rootOperand : !pdl.type 699ce57789dSRiver Riddle %operandTypes = pdl_interp.get_value_type of %rootOperands : !pdl.range<type> 700ce57789dSRiver Riddle %typeRange = pdl_interp.create_range %operandType, %operandTypes : !pdl.type, !pdl.range<type> 701ce57789dSRiver Riddle 702ce57789dSRiver Riddle %op = pdl_interp.create_operation "test.success"(%operandRange : !pdl.range<value>) -> (%typeRange : !pdl.range<type>) 703ce57789dSRiver Riddle pdl_interp.erase %root 704ce57789dSRiver Riddle pdl_interp.finalize 705ce57789dSRiver Riddle } 706ce57789dSRiver Riddle } 707ce57789dSRiver Riddle} 708ce57789dSRiver Riddle 709ce57789dSRiver Riddle// CHECK-LABEL: test.create_range_1 710ce57789dSRiver Riddle// CHECK: %[[INPUTS:.*]]:2 = "test.input"() 711ce57789dSRiver Riddle// CHECK: "test.success"(%[[INPUTS]]#0, %[[INPUTS]]#0, %[[INPUTS]]#1) : (i32, i32, i32) -> (i32, i32, i32) 712ce57789dSRiver Riddlemodule @ir attributes { test.create_range_1 } { 713ce57789dSRiver Riddle %values:2 = "test.input"() : () -> (i32, i32) 714ce57789dSRiver Riddle "test.op"(%values#0, %values#1) : (i32, i32) -> () 715ce57789dSRiver Riddle} 716ce57789dSRiver Riddle 717ce57789dSRiver Riddle// ----- 718ce57789dSRiver Riddle 719ce57789dSRiver Riddle//===----------------------------------------------------------------------===// 720abfd1a8bSRiver Riddle// pdl_interp::CreateTypeOp 721abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 722abfd1a8bSRiver Riddle 723abfd1a8bSRiver Riddlemodule @patterns { 724f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 725abfd1a8bSRiver Riddle %attr = pdl_interp.get_attribute "test_attr" of %root 726abfd1a8bSRiver Riddle pdl_interp.is_not_null %attr : !pdl.attribute -> ^pat1, ^end 727abfd1a8bSRiver Riddle 728abfd1a8bSRiver Riddle ^pat1: 729abfd1a8bSRiver Riddle %test_type = pdl_interp.create_type i32 730abfd1a8bSRiver Riddle %type = pdl_interp.get_attribute_type of %attr 731abfd1a8bSRiver Riddle pdl_interp.are_equal %type, %test_type : !pdl.type -> ^pat2, ^end 732abfd1a8bSRiver Riddle 733abfd1a8bSRiver Riddle ^pat2: 734abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 735abfd1a8bSRiver Riddle 736abfd1a8bSRiver Riddle ^end: 737abfd1a8bSRiver Riddle pdl_interp.finalize 738abfd1a8bSRiver Riddle } 739abfd1a8bSRiver Riddle 740abfd1a8bSRiver Riddle module @rewriters { 741f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 7423a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 743abfd1a8bSRiver Riddle pdl_interp.erase %root 744abfd1a8bSRiver Riddle pdl_interp.finalize 745abfd1a8bSRiver Riddle } 746abfd1a8bSRiver Riddle } 747abfd1a8bSRiver Riddle} 748abfd1a8bSRiver Riddle 749abfd1a8bSRiver Riddle// CHECK-LABEL: test.create_type_1 750abfd1a8bSRiver Riddle// CHECK: "test.success" 751abfd1a8bSRiver Riddlemodule @ir attributes { test.create_type_1 } { 752abfd1a8bSRiver Riddle "test.op"() { test_attr = 0 : i32 } : () -> () 753abfd1a8bSRiver Riddle} 754abfd1a8bSRiver Riddle 755abfd1a8bSRiver Riddle// ----- 756abfd1a8bSRiver Riddle 757abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 75885ab413bSRiver Riddle// pdl_interp::CreateTypesOp 75985ab413bSRiver Riddle//===----------------------------------------------------------------------===// 76085ab413bSRiver Riddle 76185ab413bSRiver Riddle// Fully tested within the tests for other operations. 76285ab413bSRiver Riddle 76385ab413bSRiver Riddle//===----------------------------------------------------------------------===// 764abfd1a8bSRiver Riddle// pdl_interp::EraseOp 765abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 766abfd1a8bSRiver Riddle 767abfd1a8bSRiver Riddle// Fully tested within the tests for other operations. 768abfd1a8bSRiver Riddle 769abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 7703eb1647aSStanislav Funiak// pdl_interp::ExtractOp 7713eb1647aSStanislav Funiak//===----------------------------------------------------------------------===// 7723eb1647aSStanislav Funiak 7733eb1647aSStanislav Funiakmodule @patterns { 774f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 7753eb1647aSStanislav Funiak %val = pdl_interp.get_result 0 of %root 7763eb1647aSStanislav Funiak %ops = pdl_interp.get_users of %val : !pdl.value 7773eb1647aSStanislav Funiak %op1 = pdl_interp.extract 1 of %ops : !pdl.operation 7783eb1647aSStanislav Funiak pdl_interp.is_not_null %op1 : !pdl.operation -> ^success, ^end 7793eb1647aSStanislav Funiak ^success: 7803eb1647aSStanislav Funiak pdl_interp.record_match @rewriters::@success(%op1 : !pdl.operation) : benefit(1), loc([%root]) -> ^end 7813eb1647aSStanislav Funiak ^end: 7823eb1647aSStanislav Funiak pdl_interp.finalize 7833eb1647aSStanislav Funiak } 7843eb1647aSStanislav Funiak 7853eb1647aSStanislav Funiak module @rewriters { 786f96a8675SRiver Riddle pdl_interp.func @success(%matched : !pdl.operation) { 7873eb1647aSStanislav Funiak %op = pdl_interp.create_operation "test.success" 7883eb1647aSStanislav Funiak pdl_interp.erase %matched 7893eb1647aSStanislav Funiak pdl_interp.finalize 7903eb1647aSStanislav Funiak } 7913eb1647aSStanislav Funiak } 7923eb1647aSStanislav Funiak} 7933eb1647aSStanislav Funiak 7943eb1647aSStanislav Funiak// CHECK-LABEL: test.extract_op 7953eb1647aSStanislav Funiak// CHECK: "test.success" 7963eb1647aSStanislav Funiak// CHECK: %[[OPERAND:.*]] = "test.op" 7973eb1647aSStanislav Funiak// CHECK: "test.op"(%[[OPERAND]]) 7983eb1647aSStanislav Funiakmodule @ir attributes { test.extract_op } { 7993eb1647aSStanislav Funiak %operand = "test.op"() : () -> i32 8003eb1647aSStanislav Funiak "test.op"(%operand) : (i32) -> (i32) 8013eb1647aSStanislav Funiak "test.op"(%operand, %operand) : (i32, i32) -> (i32) 8023eb1647aSStanislav Funiak} 8033eb1647aSStanislav Funiak 8043eb1647aSStanislav Funiak// ----- 8053eb1647aSStanislav Funiak 8063eb1647aSStanislav Funiakmodule @patterns { 807f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 8083eb1647aSStanislav Funiak %vals = pdl_interp.get_results of %root : !pdl.range<value> 8093eb1647aSStanislav Funiak %types = pdl_interp.get_value_type of %vals : !pdl.range<type> 8103eb1647aSStanislav Funiak %type1 = pdl_interp.extract 1 of %types : !pdl.type 8113eb1647aSStanislav Funiak pdl_interp.is_not_null %type1 : !pdl.type -> ^success, ^end 8123eb1647aSStanislav Funiak ^success: 8133eb1647aSStanislav Funiak pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 8143eb1647aSStanislav Funiak ^end: 8153eb1647aSStanislav Funiak pdl_interp.finalize 8163eb1647aSStanislav Funiak } 8173eb1647aSStanislav Funiak 8183eb1647aSStanislav Funiak module @rewriters { 819f96a8675SRiver Riddle pdl_interp.func @success(%matched : !pdl.operation) { 8203eb1647aSStanislav Funiak %op = pdl_interp.create_operation "test.success" 8213eb1647aSStanislav Funiak pdl_interp.erase %matched 8223eb1647aSStanislav Funiak pdl_interp.finalize 8233eb1647aSStanislav Funiak } 8243eb1647aSStanislav Funiak } 8253eb1647aSStanislav Funiak} 8263eb1647aSStanislav Funiak 8273eb1647aSStanislav Funiak// CHECK-LABEL: test.extract_type 8283eb1647aSStanislav Funiak// CHECK: %[[OPERAND:.*]] = "test.op" 8293eb1647aSStanislav Funiak// CHECK: "test.success" 8303eb1647aSStanislav Funiak// CHECK: "test.op"(%[[OPERAND]]) 8313eb1647aSStanislav Funiakmodule @ir attributes { test.extract_type } { 8323eb1647aSStanislav Funiak %operand = "test.op"() : () -> i32 8333eb1647aSStanislav Funiak "test.op"(%operand) : (i32) -> (i32, i32) 8343eb1647aSStanislav Funiak "test.op"(%operand) : (i32) -> (i32) 8353eb1647aSStanislav Funiak} 8363eb1647aSStanislav Funiak 8373eb1647aSStanislav Funiak// ----- 8383eb1647aSStanislav Funiak 8393eb1647aSStanislav Funiakmodule @patterns { 840f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 8413eb1647aSStanislav Funiak %vals = pdl_interp.get_results of %root : !pdl.range<value> 8423eb1647aSStanislav Funiak %val1 = pdl_interp.extract 1 of %vals : !pdl.value 8433eb1647aSStanislav Funiak pdl_interp.is_not_null %val1 : !pdl.value -> ^success, ^end 8443eb1647aSStanislav Funiak ^success: 8453eb1647aSStanislav Funiak pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 8463eb1647aSStanislav Funiak ^end: 8473eb1647aSStanislav Funiak pdl_interp.finalize 8483eb1647aSStanislav Funiak } 8493eb1647aSStanislav Funiak 8503eb1647aSStanislav Funiak module @rewriters { 851f96a8675SRiver Riddle pdl_interp.func @success(%matched : !pdl.operation) { 8523eb1647aSStanislav Funiak %op = pdl_interp.create_operation "test.success" 8533eb1647aSStanislav Funiak pdl_interp.erase %matched 8543eb1647aSStanislav Funiak pdl_interp.finalize 8553eb1647aSStanislav Funiak } 8563eb1647aSStanislav Funiak } 8573eb1647aSStanislav Funiak} 8583eb1647aSStanislav Funiak 8593eb1647aSStanislav Funiak// CHECK-LABEL: test.extract_value 8603eb1647aSStanislav Funiak// CHECK: %[[OPERAND:.*]] = "test.op" 8613eb1647aSStanislav Funiak// CHECK: "test.success" 8623eb1647aSStanislav Funiak// CHECK: "test.op"(%[[OPERAND]]) 8633eb1647aSStanislav Funiakmodule @ir attributes { test.extract_value } { 8643eb1647aSStanislav Funiak %operand = "test.op"() : () -> i32 8653eb1647aSStanislav Funiak "test.op"(%operand) : (i32) -> (i32, i32) 8663eb1647aSStanislav Funiak "test.op"(%operand) : (i32) -> (i32) 8673eb1647aSStanislav Funiak} 8683eb1647aSStanislav Funiak 8693eb1647aSStanislav Funiak// ----- 8703eb1647aSStanislav Funiak 8713eb1647aSStanislav Funiak//===----------------------------------------------------------------------===// 872abfd1a8bSRiver Riddle// pdl_interp::FinalizeOp 873abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 874abfd1a8bSRiver Riddle 875abfd1a8bSRiver Riddle// Fully tested within the tests for other operations. 876abfd1a8bSRiver Riddle 877abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 8783eb1647aSStanislav Funiak// pdl_interp::ForEachOp 8793eb1647aSStanislav Funiak//===----------------------------------------------------------------------===// 8803eb1647aSStanislav Funiak 8813eb1647aSStanislav Funiakmodule @patterns { 882f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 8833eb1647aSStanislav Funiak %val1 = pdl_interp.get_result 0 of %root 8843eb1647aSStanislav Funiak %ops1 = pdl_interp.get_users of %val1 : !pdl.value 8853eb1647aSStanislav Funiak pdl_interp.foreach %op1 : !pdl.operation in %ops1 { 8863eb1647aSStanislav Funiak %val2 = pdl_interp.get_result 0 of %op1 8873eb1647aSStanislav Funiak %ops2 = pdl_interp.get_users of %val2 : !pdl.value 8883eb1647aSStanislav Funiak pdl_interp.foreach %op2 : !pdl.operation in %ops2 { 8893eb1647aSStanislav Funiak pdl_interp.record_match @rewriters::@success(%op2 : !pdl.operation) : benefit(1), loc([%root]) -> ^cont 8903eb1647aSStanislav Funiak ^cont: 8913eb1647aSStanislav Funiak pdl_interp.continue 8923eb1647aSStanislav Funiak } -> ^cont 8933eb1647aSStanislav Funiak ^cont: 8943eb1647aSStanislav Funiak pdl_interp.continue 8953eb1647aSStanislav Funiak } -> ^end 8963eb1647aSStanislav Funiak ^end: 8973eb1647aSStanislav Funiak pdl_interp.finalize 8983eb1647aSStanislav Funiak } 8993eb1647aSStanislav Funiak 9003eb1647aSStanislav Funiak module @rewriters { 901f96a8675SRiver Riddle pdl_interp.func @success(%matched : !pdl.operation) { 9023eb1647aSStanislav Funiak %op = pdl_interp.create_operation "test.success" 9033eb1647aSStanislav Funiak pdl_interp.erase %matched 9043eb1647aSStanislav Funiak pdl_interp.finalize 9053eb1647aSStanislav Funiak } 9063eb1647aSStanislav Funiak } 9073eb1647aSStanislav Funiak} 9083eb1647aSStanislav Funiak 9093eb1647aSStanislav Funiak// CHECK-LABEL: test.foreach 9103eb1647aSStanislav Funiak// CHECK: "test.success" 9113eb1647aSStanislav Funiak// CHECK: "test.success" 9123eb1647aSStanislav Funiak// CHECK: "test.success" 9133eb1647aSStanislav Funiak// CHECK: "test.success" 9143eb1647aSStanislav Funiak// CHECK: %[[ROOT:.*]] = "test.op" 9153eb1647aSStanislav Funiak// CHECK: %[[VALA:.*]] = "test.op"(%[[ROOT]]) 9163eb1647aSStanislav Funiak// CHECK: %[[VALB:.*]] = "test.op"(%[[ROOT]]) 9173eb1647aSStanislav Funiakmodule @ir attributes { test.foreach } { 9183eb1647aSStanislav Funiak %root = "test.op"() : () -> i32 9193eb1647aSStanislav Funiak %valA = "test.op"(%root) : (i32) -> (i32) 9203eb1647aSStanislav Funiak "test.op"(%valA) : (i32) -> (i32) 9213eb1647aSStanislav Funiak "test.op"(%valA) : (i32) -> (i32) 9223eb1647aSStanislav Funiak %valB = "test.op"(%root) : (i32) -> (i32) 9233eb1647aSStanislav Funiak "test.op"(%valB) : (i32) -> (i32) 9243eb1647aSStanislav Funiak "test.op"(%valB) : (i32) -> (i32) 9253eb1647aSStanislav Funiak} 9263eb1647aSStanislav Funiak 9273eb1647aSStanislav Funiak// ----- 9283eb1647aSStanislav Funiak 9293eb1647aSStanislav Funiak//===----------------------------------------------------------------------===// 9303eb1647aSStanislav Funiak// pdl_interp::GetUsersOp 9313eb1647aSStanislav Funiak//===----------------------------------------------------------------------===// 9323eb1647aSStanislav Funiak 9333eb1647aSStanislav Funiakmodule @patterns { 934f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 9353eb1647aSStanislav Funiak %val = pdl_interp.get_result 0 of %root 9363eb1647aSStanislav Funiak %ops = pdl_interp.get_users of %val : !pdl.value 9373eb1647aSStanislav Funiak pdl_interp.foreach %op : !pdl.operation in %ops { 9383eb1647aSStanislav Funiak pdl_interp.record_match @rewriters::@success(%op : !pdl.operation) : benefit(1), loc([%root]) -> ^cont 9393eb1647aSStanislav Funiak ^cont: 9403eb1647aSStanislav Funiak pdl_interp.continue 9413eb1647aSStanislav Funiak } -> ^end 9423eb1647aSStanislav Funiak ^end: 9433eb1647aSStanislav Funiak pdl_interp.finalize 9443eb1647aSStanislav Funiak } 9453eb1647aSStanislav Funiak 9463eb1647aSStanislav Funiak module @rewriters { 947f96a8675SRiver Riddle pdl_interp.func @success(%matched : !pdl.operation) { 9483eb1647aSStanislav Funiak %op = pdl_interp.create_operation "test.success" 9493eb1647aSStanislav Funiak pdl_interp.erase %matched 9503eb1647aSStanislav Funiak pdl_interp.finalize 9513eb1647aSStanislav Funiak } 9523eb1647aSStanislav Funiak } 9533eb1647aSStanislav Funiak} 9543eb1647aSStanislav Funiak 9553eb1647aSStanislav Funiak// CHECK-LABEL: test.get_users_of_value 9563eb1647aSStanislav Funiak// CHECK: "test.success" 9573eb1647aSStanislav Funiak// CHECK: "test.success" 9583eb1647aSStanislav Funiak// CHECK: %[[OPERAND:.*]] = "test.op" 9593eb1647aSStanislav Funiakmodule @ir attributes { test.get_users_of_value } { 9603eb1647aSStanislav Funiak %operand = "test.op"() : () -> i32 9613eb1647aSStanislav Funiak "test.op"(%operand) : (i32) -> (i32) 9623eb1647aSStanislav Funiak "test.op"(%operand, %operand) : (i32, i32) -> (i32) 9633eb1647aSStanislav Funiak} 9643eb1647aSStanislav Funiak 9653eb1647aSStanislav Funiak// ----- 9663eb1647aSStanislav Funiak 9673eb1647aSStanislav Funiakmodule @patterns { 968f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 9693eb1647aSStanislav Funiak pdl_interp.check_result_count of %root is at_least 2 -> ^next, ^end 9703eb1647aSStanislav Funiak ^next: 9713eb1647aSStanislav Funiak %vals = pdl_interp.get_results of %root : !pdl.range<value> 9723eb1647aSStanislav Funiak %ops = pdl_interp.get_users of %vals : !pdl.range<value> 9733eb1647aSStanislav Funiak pdl_interp.foreach %op : !pdl.operation in %ops { 9743eb1647aSStanislav Funiak pdl_interp.record_match @rewriters::@success(%op : !pdl.operation) : benefit(1), loc([%root]) -> ^cont 9753eb1647aSStanislav Funiak ^cont: 9763eb1647aSStanislav Funiak pdl_interp.continue 9773eb1647aSStanislav Funiak } -> ^end 9783eb1647aSStanislav Funiak ^end: 9793eb1647aSStanislav Funiak pdl_interp.finalize 9803eb1647aSStanislav Funiak } 9813eb1647aSStanislav Funiak 9823eb1647aSStanislav Funiak module @rewriters { 983f96a8675SRiver Riddle pdl_interp.func @success(%matched : !pdl.operation) { 9843eb1647aSStanislav Funiak %op = pdl_interp.create_operation "test.success" 9853eb1647aSStanislav Funiak pdl_interp.erase %matched 9863eb1647aSStanislav Funiak pdl_interp.finalize 9873eb1647aSStanislav Funiak } 9883eb1647aSStanislav Funiak } 9893eb1647aSStanislav Funiak} 9903eb1647aSStanislav Funiak 9913eb1647aSStanislav Funiak// CHECK-LABEL: test.get_all_users_of_range 9923eb1647aSStanislav Funiak// CHECK: "test.success" 9933eb1647aSStanislav Funiak// CHECK: "test.success" 9943eb1647aSStanislav Funiak// CHECK: %[[OPERANDS:.*]]:2 = "test.op" 9953eb1647aSStanislav Funiakmodule @ir attributes { test.get_all_users_of_range } { 9963eb1647aSStanislav Funiak %operands:2 = "test.op"() : () -> (i32, i32) 9973eb1647aSStanislav Funiak "test.op"(%operands#0) : (i32) -> (i32) 9983eb1647aSStanislav Funiak "test.op"(%operands#1) : (i32) -> (i32) 9993eb1647aSStanislav Funiak} 10003eb1647aSStanislav Funiak 10013eb1647aSStanislav Funiak// ----- 10023eb1647aSStanislav Funiak 10033eb1647aSStanislav Funiakmodule @patterns { 1004f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 10053eb1647aSStanislav Funiak pdl_interp.check_result_count of %root is at_least 2 -> ^next, ^end 10063eb1647aSStanislav Funiak ^next: 10073eb1647aSStanislav Funiak %vals = pdl_interp.get_results of %root : !pdl.range<value> 10083eb1647aSStanislav Funiak %val = pdl_interp.extract 0 of %vals : !pdl.value 10093eb1647aSStanislav Funiak %ops = pdl_interp.get_users of %val : !pdl.value 10103eb1647aSStanislav Funiak pdl_interp.foreach %op : !pdl.operation in %ops { 10113eb1647aSStanislav Funiak pdl_interp.record_match @rewriters::@success(%op : !pdl.operation) : benefit(1), loc([%root]) -> ^cont 10123eb1647aSStanislav Funiak ^cont: 10133eb1647aSStanislav Funiak pdl_interp.continue 10143eb1647aSStanislav Funiak } -> ^end 10153eb1647aSStanislav Funiak ^end: 10163eb1647aSStanislav Funiak pdl_interp.finalize 10173eb1647aSStanislav Funiak } 10183eb1647aSStanislav Funiak 10193eb1647aSStanislav Funiak module @rewriters { 1020f96a8675SRiver Riddle pdl_interp.func @success(%matched : !pdl.operation) { 10213eb1647aSStanislav Funiak %op = pdl_interp.create_operation "test.success" 10223eb1647aSStanislav Funiak pdl_interp.erase %matched 10233eb1647aSStanislav Funiak pdl_interp.finalize 10243eb1647aSStanislav Funiak } 10253eb1647aSStanislav Funiak } 10263eb1647aSStanislav Funiak} 10273eb1647aSStanislav Funiak 10283eb1647aSStanislav Funiak// CHECK-LABEL: test.get_first_users_of_range 10293eb1647aSStanislav Funiak// CHECK: "test.success" 10303eb1647aSStanislav Funiak// CHECK: %[[OPERANDS:.*]]:2 = "test.op" 10313eb1647aSStanislav Funiak// CHECK: "test.op" 10323eb1647aSStanislav Funiakmodule @ir attributes { test.get_first_users_of_range } { 10333eb1647aSStanislav Funiak %operands:2 = "test.op"() : () -> (i32, i32) 10343eb1647aSStanislav Funiak "test.op"(%operands#0) : (i32) -> (i32) 10353eb1647aSStanislav Funiak "test.op"(%operands#1) : (i32) -> (i32) 10363eb1647aSStanislav Funiak} 10373eb1647aSStanislav Funiak 10383eb1647aSStanislav Funiak// ----- 10393eb1647aSStanislav Funiak 10403eb1647aSStanislav Funiak//===----------------------------------------------------------------------===// 1041abfd1a8bSRiver Riddle// pdl_interp::GetAttributeOp 1042abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1043abfd1a8bSRiver Riddle 1044abfd1a8bSRiver Riddle// Fully tested within the tests for other operations. 1045abfd1a8bSRiver Riddle 1046abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1047abfd1a8bSRiver Riddle// pdl_interp::GetAttributeTypeOp 1048abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1049abfd1a8bSRiver Riddle 1050abfd1a8bSRiver Riddle// Fully tested within the tests for other operations. 1051abfd1a8bSRiver Riddle 1052abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1053abfd1a8bSRiver Riddle// pdl_interp::GetDefiningOpOp 1054abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1055abfd1a8bSRiver Riddle 1056abfd1a8bSRiver Riddlemodule @patterns { 1057f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1058abfd1a8bSRiver Riddle pdl_interp.check_operand_count of %root is 5 -> ^pat1, ^end 1059abfd1a8bSRiver Riddle 1060abfd1a8bSRiver Riddle ^pat1: 1061abfd1a8bSRiver Riddle %operand0 = pdl_interp.get_operand 0 of %root 1062abfd1a8bSRiver Riddle %operand4 = pdl_interp.get_operand 4 of %root 10633a833a0eSRiver Riddle %defOp0 = pdl_interp.get_defining_op of %operand0 : !pdl.value 10643a833a0eSRiver Riddle %defOp4 = pdl_interp.get_defining_op of %operand4 : !pdl.value 1065abfd1a8bSRiver Riddle pdl_interp.are_equal %defOp0, %defOp4 : !pdl.operation -> ^pat2, ^end 1066abfd1a8bSRiver Riddle 1067abfd1a8bSRiver Riddle ^pat2: 1068abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 1069abfd1a8bSRiver Riddle 1070abfd1a8bSRiver Riddle ^end: 1071abfd1a8bSRiver Riddle pdl_interp.finalize 1072abfd1a8bSRiver Riddle } 1073abfd1a8bSRiver Riddle 1074abfd1a8bSRiver Riddle module @rewriters { 1075f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 10763a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 1077abfd1a8bSRiver Riddle pdl_interp.erase %root 1078abfd1a8bSRiver Riddle pdl_interp.finalize 1079abfd1a8bSRiver Riddle } 1080abfd1a8bSRiver Riddle } 1081abfd1a8bSRiver Riddle} 1082abfd1a8bSRiver Riddle 1083abfd1a8bSRiver Riddle// CHECK-LABEL: test.get_defining_op_1 1084abfd1a8bSRiver Riddle// CHECK: %[[OPERAND0:.*]] = "test.op" 1085abfd1a8bSRiver Riddle// CHECK: %[[OPERAND1:.*]] = "test.op" 1086abfd1a8bSRiver Riddle// CHECK: "test.success" 1087abfd1a8bSRiver Riddle// CHECK: "test.op"(%[[OPERAND0]], %[[OPERAND0]], %[[OPERAND0]], %[[OPERAND0]], %[[OPERAND1]]) 1088abfd1a8bSRiver Riddlemodule @ir attributes { test.get_defining_op_1 } { 1089abfd1a8bSRiver Riddle %operand = "test.op"() : () -> i32 1090abfd1a8bSRiver Riddle %other_operand = "test.op"() : () -> i32 1091abfd1a8bSRiver Riddle "test.op"(%operand, %operand, %operand, %operand, %operand) : (i32, i32, i32, i32, i32) -> () 1092abfd1a8bSRiver Riddle "test.op"(%operand, %operand, %operand, %operand, %other_operand) : (i32, i32, i32, i32, i32) -> () 1093abfd1a8bSRiver Riddle} 1094abfd1a8bSRiver Riddle 1095abfd1a8bSRiver Riddle// ----- 1096abfd1a8bSRiver Riddle 1097abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1098abfd1a8bSRiver Riddle// pdl_interp::GetOperandOp 1099abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1100abfd1a8bSRiver Riddle 1101abfd1a8bSRiver Riddle// Fully tested within the tests for other operations. 1102abfd1a8bSRiver Riddle 1103abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 110485ab413bSRiver Riddle// pdl_interp::GetOperandsOp 110585ab413bSRiver Riddle//===----------------------------------------------------------------------===// 110685ab413bSRiver Riddle 110785ab413bSRiver Riddlemodule @patterns { 1108f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 110985ab413bSRiver Riddle pdl_interp.check_operand_count of %root is 2 -> ^pat1, ^end 111085ab413bSRiver Riddle 111185ab413bSRiver Riddle ^pat1: 111285ab413bSRiver Riddle %operands = pdl_interp.get_operands 0 of %root : !pdl.range<value> 111385ab413bSRiver Riddle %full_operands = pdl_interp.get_operands of %root : !pdl.range<value> 111485ab413bSRiver Riddle pdl_interp.are_equal %operands, %full_operands : !pdl.range<value> -> ^pat2, ^end 111585ab413bSRiver Riddle 111685ab413bSRiver Riddle ^pat2: 111785ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 111885ab413bSRiver Riddle 111985ab413bSRiver Riddle ^end: 112085ab413bSRiver Riddle pdl_interp.finalize 112185ab413bSRiver Riddle } 112285ab413bSRiver Riddle 112385ab413bSRiver Riddle module @rewriters { 1124f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 112585ab413bSRiver Riddle %op = pdl_interp.create_operation "test.success" 112685ab413bSRiver Riddle pdl_interp.erase %root 112785ab413bSRiver Riddle pdl_interp.finalize 112885ab413bSRiver Riddle } 112985ab413bSRiver Riddle } 113085ab413bSRiver Riddle} 113185ab413bSRiver Riddle 113285ab413bSRiver Riddle// CHECK-LABEL: test.get_operands_1 113385ab413bSRiver Riddle// CHECK: "test.success" 113485ab413bSRiver Riddlemodule @ir attributes { test.get_operands_1 } { 113585ab413bSRiver Riddle %inputs:2 = "test.producer"() : () -> (i32, i32) 113685ab413bSRiver Riddle "test.op"(%inputs#0, %inputs#1) : (i32, i32) -> () 113785ab413bSRiver Riddle} 113885ab413bSRiver Riddle 113985ab413bSRiver Riddle// ----- 114085ab413bSRiver Riddle 114185ab413bSRiver Riddle// Test all of the various combinations related to `AttrSizedOperandSegments`. 114285ab413bSRiver Riddlemodule @patterns { 1143f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 114485ab413bSRiver Riddle pdl_interp.check_operation_name of %root is "test.attr_sized_operands" -> ^pat1, ^end 114585ab413bSRiver Riddle 114685ab413bSRiver Riddle ^pat1: 114785ab413bSRiver Riddle %operands_0 = pdl_interp.get_operands 0 of %root : !pdl.range<value> 114885ab413bSRiver Riddle pdl_interp.is_not_null %operands_0 : !pdl.range<value> -> ^pat2, ^end 114985ab413bSRiver Riddle 115085ab413bSRiver Riddle ^pat2: 115185ab413bSRiver Riddle %operands_0_single = pdl_interp.get_operands 0 of %root : !pdl.value 115285ab413bSRiver Riddle pdl_interp.is_not_null %operands_0_single : !pdl.value -> ^end, ^pat3 115385ab413bSRiver Riddle 115485ab413bSRiver Riddle ^pat3: 115585ab413bSRiver Riddle %operands_1 = pdl_interp.get_operands 1 of %root : !pdl.range<value> 115685ab413bSRiver Riddle pdl_interp.is_not_null %operands_1 : !pdl.range<value> -> ^pat4, ^end 115785ab413bSRiver Riddle 115885ab413bSRiver Riddle ^pat4: 115985ab413bSRiver Riddle %operands_1_single = pdl_interp.get_operands 1 of %root : !pdl.value 116085ab413bSRiver Riddle pdl_interp.is_not_null %operands_1_single : !pdl.value -> ^end, ^pat5 116185ab413bSRiver Riddle 116285ab413bSRiver Riddle ^pat5: 116385ab413bSRiver Riddle %operands_2 = pdl_interp.get_operands 2 of %root : !pdl.range<value> 116485ab413bSRiver Riddle pdl_interp.is_not_null %operands_2 : !pdl.range<value> -> ^pat6, ^end 116585ab413bSRiver Riddle 116685ab413bSRiver Riddle ^pat6: 116785ab413bSRiver Riddle %operands_2_single = pdl_interp.get_operands 2 of %root : !pdl.value 116885ab413bSRiver Riddle pdl_interp.is_not_null %operands_2_single : !pdl.value -> ^pat7, ^end 116985ab413bSRiver Riddle 117085ab413bSRiver Riddle ^pat7: 117185ab413bSRiver Riddle %invalid_operands = pdl_interp.get_operands 50 of %root : !pdl.value 117285ab413bSRiver Riddle pdl_interp.is_not_null %invalid_operands : !pdl.value -> ^end, ^pat8 117385ab413bSRiver Riddle 117485ab413bSRiver Riddle ^pat8: 117585ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root, %operands_0, %operands_1, %operands_2, %operands_2_single : !pdl.operation, !pdl.range<value>, !pdl.range<value>, !pdl.range<value>, !pdl.value) : benefit(1), loc([%root]) -> ^end 117685ab413bSRiver Riddle 117785ab413bSRiver Riddle 117885ab413bSRiver Riddle ^end: 117985ab413bSRiver Riddle pdl_interp.finalize 118085ab413bSRiver Riddle } 118185ab413bSRiver Riddle 118285ab413bSRiver Riddle module @rewriters { 1183f96a8675SRiver Riddle pdl_interp.func @success(%root: !pdl.operation, %operands_0: !pdl.range<value>, %operands_1: !pdl.range<value>, %operands_2: !pdl.range<value>, %operands_2_single: !pdl.value) { 118485ab413bSRiver Riddle %op0 = pdl_interp.create_operation "test.success"(%operands_0 : !pdl.range<value>) 118585ab413bSRiver Riddle %op1 = pdl_interp.create_operation "test.success"(%operands_1 : !pdl.range<value>) 118685ab413bSRiver Riddle %op2 = pdl_interp.create_operation "test.success"(%operands_2 : !pdl.range<value>) 118785ab413bSRiver Riddle %op3 = pdl_interp.create_operation "test.success"(%operands_2_single : !pdl.value) 118885ab413bSRiver Riddle pdl_interp.erase %root 118985ab413bSRiver Riddle pdl_interp.finalize 119085ab413bSRiver Riddle } 119185ab413bSRiver Riddle } 119285ab413bSRiver Riddle} 119385ab413bSRiver Riddle 119485ab413bSRiver Riddle// CHECK-LABEL: test.get_operands_2 119585ab413bSRiver Riddle// CHECK-NEXT: %[[INPUTS:.*]]:5 = "test.producer"() : () -> (i32, i32, i32, i32, i32) 119685ab413bSRiver Riddle// CHECK-NEXT: "test.success"() : () -> () 119785ab413bSRiver Riddle// CHECK-NEXT: "test.success"(%[[INPUTS]]#0, %[[INPUTS]]#1, %[[INPUTS]]#2, %[[INPUTS]]#3) : (i32, i32, i32, i32) -> () 119885ab413bSRiver Riddle// CHECK-NEXT: "test.success"(%[[INPUTS]]#4) : (i32) -> () 119985ab413bSRiver Riddle// CHECK-NEXT: "test.success"(%[[INPUTS]]#4) : (i32) -> () 120085ab413bSRiver Riddlemodule @ir attributes { test.get_operands_2 } { 120185ab413bSRiver Riddle %inputs:5 = "test.producer"() : () -> (i32, i32, i32, i32, i32) 1202363b6559SMehdi Amini "test.attr_sized_operands"(%inputs#0, %inputs#1, %inputs#2, %inputs#3, %inputs#4) {operandSegmentSizes = array<i32: 0, 4, 1, 0>} : (i32, i32, i32, i32, i32) -> () 120385ab413bSRiver Riddle} 120485ab413bSRiver Riddle 120585ab413bSRiver Riddle// ----- 120685ab413bSRiver Riddle 120785ab413bSRiver Riddle//===----------------------------------------------------------------------===// 1208abfd1a8bSRiver Riddle// pdl_interp::GetResultOp 1209abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1210abfd1a8bSRiver Riddle 1211abfd1a8bSRiver Riddlemodule @patterns { 1212f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1213abfd1a8bSRiver Riddle pdl_interp.check_result_count of %root is 5 -> ^pat1, ^end 1214abfd1a8bSRiver Riddle 1215abfd1a8bSRiver Riddle ^pat1: 1216abfd1a8bSRiver Riddle %result0 = pdl_interp.get_result 0 of %root 1217abfd1a8bSRiver Riddle %result4 = pdl_interp.get_result 4 of %root 12183a833a0eSRiver Riddle %result0_type = pdl_interp.get_value_type of %result0 : !pdl.type 12193a833a0eSRiver Riddle %result4_type = pdl_interp.get_value_type of %result4 : !pdl.type 1220abfd1a8bSRiver Riddle pdl_interp.are_equal %result0_type, %result4_type : !pdl.type -> ^pat2, ^end 1221abfd1a8bSRiver Riddle 1222abfd1a8bSRiver Riddle ^pat2: 1223abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 1224abfd1a8bSRiver Riddle 1225abfd1a8bSRiver Riddle ^end: 1226abfd1a8bSRiver Riddle pdl_interp.finalize 1227abfd1a8bSRiver Riddle } 1228abfd1a8bSRiver Riddle 1229abfd1a8bSRiver Riddle module @rewriters { 1230f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 12313a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 1232abfd1a8bSRiver Riddle pdl_interp.erase %root 1233abfd1a8bSRiver Riddle pdl_interp.finalize 1234abfd1a8bSRiver Riddle } 1235abfd1a8bSRiver Riddle } 1236abfd1a8bSRiver Riddle} 1237abfd1a8bSRiver Riddle 1238abfd1a8bSRiver Riddle// CHECK-LABEL: test.get_result_1 1239abfd1a8bSRiver Riddle// CHECK: "test.success" 1240abfd1a8bSRiver Riddle// CHECK: "test.op"() : () -> (i32, i32, i32, i32, i64) 1241abfd1a8bSRiver Riddlemodule @ir attributes { test.get_result_1 } { 1242abfd1a8bSRiver Riddle %a:5 = "test.op"() : () -> (i32, i32, i32, i32, i32) 1243abfd1a8bSRiver Riddle %b:5 = "test.op"() : () -> (i32, i32, i32, i32, i64) 1244abfd1a8bSRiver Riddle} 1245abfd1a8bSRiver Riddle 1246abfd1a8bSRiver Riddle// ----- 1247abfd1a8bSRiver Riddle 1248abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 124985ab413bSRiver Riddle// pdl_interp::GetResultsOp 125085ab413bSRiver Riddle//===----------------------------------------------------------------------===// 125185ab413bSRiver Riddle 125285ab413bSRiver Riddlemodule @patterns { 1253f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 125485ab413bSRiver Riddle pdl_interp.check_result_count of %root is 5 -> ^pat1, ^end 125585ab413bSRiver Riddle 125685ab413bSRiver Riddle ^pat1: 125785ab413bSRiver Riddle %results = pdl_interp.get_results 0 of %root : !pdl.range<value> 125885ab413bSRiver Riddle %full_results = pdl_interp.get_results of %root : !pdl.range<value> 125985ab413bSRiver Riddle pdl_interp.are_equal %results, %full_results : !pdl.range<value> -> ^pat2, ^end 126085ab413bSRiver Riddle 126185ab413bSRiver Riddle ^pat2: 126285ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 126385ab413bSRiver Riddle 126485ab413bSRiver Riddle ^end: 126585ab413bSRiver Riddle pdl_interp.finalize 126685ab413bSRiver Riddle } 126785ab413bSRiver Riddle 126885ab413bSRiver Riddle module @rewriters { 1269f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 127085ab413bSRiver Riddle %op = pdl_interp.create_operation "test.success" 127185ab413bSRiver Riddle pdl_interp.erase %root 127285ab413bSRiver Riddle pdl_interp.finalize 127385ab413bSRiver Riddle } 127485ab413bSRiver Riddle } 127585ab413bSRiver Riddle} 127685ab413bSRiver Riddle 127785ab413bSRiver Riddle// CHECK-LABEL: test.get_results_1 127885ab413bSRiver Riddle// CHECK: "test.success" 127985ab413bSRiver Riddlemodule @ir attributes { test.get_results_1 } { 128085ab413bSRiver Riddle %a:5 = "test.producer"() : () -> (i32, i32, i32, i32, i32) 128185ab413bSRiver Riddle} 128285ab413bSRiver Riddle 128385ab413bSRiver Riddle// ----- 128485ab413bSRiver Riddle 128585ab413bSRiver Riddle// Test all of the various combinations related to `AttrSizedResultSegments`. 128685ab413bSRiver Riddlemodule @patterns { 1287f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 128885ab413bSRiver Riddle pdl_interp.check_operation_name of %root is "test.attr_sized_results" -> ^pat1, ^end 128985ab413bSRiver Riddle 129085ab413bSRiver Riddle ^pat1: 129185ab413bSRiver Riddle %results_0 = pdl_interp.get_results 0 of %root : !pdl.range<value> 129285ab413bSRiver Riddle pdl_interp.is_not_null %results_0 : !pdl.range<value> -> ^pat2, ^end 129385ab413bSRiver Riddle 129485ab413bSRiver Riddle ^pat2: 129585ab413bSRiver Riddle %results_0_single = pdl_interp.get_results 0 of %root : !pdl.value 129685ab413bSRiver Riddle pdl_interp.is_not_null %results_0_single : !pdl.value -> ^end, ^pat3 129785ab413bSRiver Riddle 129885ab413bSRiver Riddle ^pat3: 129985ab413bSRiver Riddle %results_1 = pdl_interp.get_results 1 of %root : !pdl.range<value> 130085ab413bSRiver Riddle pdl_interp.is_not_null %results_1 : !pdl.range<value> -> ^pat4, ^end 130185ab413bSRiver Riddle 130285ab413bSRiver Riddle ^pat4: 130385ab413bSRiver Riddle %results_1_single = pdl_interp.get_results 1 of %root : !pdl.value 130485ab413bSRiver Riddle pdl_interp.is_not_null %results_1_single : !pdl.value -> ^end, ^pat5 130585ab413bSRiver Riddle 130685ab413bSRiver Riddle ^pat5: 130785ab413bSRiver Riddle %results_2 = pdl_interp.get_results 2 of %root : !pdl.range<value> 130885ab413bSRiver Riddle pdl_interp.is_not_null %results_2 : !pdl.range<value> -> ^pat6, ^end 130985ab413bSRiver Riddle 131085ab413bSRiver Riddle ^pat6: 131185ab413bSRiver Riddle %results_2_single = pdl_interp.get_results 2 of %root : !pdl.value 131285ab413bSRiver Riddle pdl_interp.is_not_null %results_2_single : !pdl.value -> ^pat7, ^end 131385ab413bSRiver Riddle 131485ab413bSRiver Riddle ^pat7: 131585ab413bSRiver Riddle %invalid_results = pdl_interp.get_results 50 of %root : !pdl.value 131685ab413bSRiver Riddle pdl_interp.is_not_null %invalid_results : !pdl.value -> ^end, ^pat8 131785ab413bSRiver Riddle 131885ab413bSRiver Riddle ^pat8: 131985ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root, %results_0, %results_1, %results_2, %results_2_single : !pdl.operation, !pdl.range<value>, !pdl.range<value>, !pdl.range<value>, !pdl.value) : benefit(1), loc([%root]) -> ^end 132085ab413bSRiver Riddle 132185ab413bSRiver Riddle 132285ab413bSRiver Riddle ^end: 132385ab413bSRiver Riddle pdl_interp.finalize 132485ab413bSRiver Riddle } 132585ab413bSRiver Riddle 132685ab413bSRiver Riddle module @rewriters { 1327f96a8675SRiver Riddle pdl_interp.func @success(%root: !pdl.operation, %results_0: !pdl.range<value>, %results_1: !pdl.range<value>, %results_2: !pdl.range<value>, %results_2_single: !pdl.value) { 132885ab413bSRiver Riddle %results_0_types = pdl_interp.get_value_type of %results_0 : !pdl.range<type> 132985ab413bSRiver Riddle %results_1_types = pdl_interp.get_value_type of %results_1 : !pdl.range<type> 133085ab413bSRiver Riddle %results_2_types = pdl_interp.get_value_type of %results_2 : !pdl.range<type> 133185ab413bSRiver Riddle %results_2_single_types = pdl_interp.get_value_type of %results_2_single : !pdl.type 133285ab413bSRiver Riddle 133385ab413bSRiver Riddle %op0 = pdl_interp.create_operation "test.success" -> (%results_0_types : !pdl.range<type>) 133485ab413bSRiver Riddle %op1 = pdl_interp.create_operation "test.success" -> (%results_1_types : !pdl.range<type>) 133585ab413bSRiver Riddle %op2 = pdl_interp.create_operation "test.success" -> (%results_2_types : !pdl.range<type>) 133685ab413bSRiver Riddle %op3 = pdl_interp.create_operation "test.success" -> (%results_2_single_types : !pdl.type) 133785ab413bSRiver Riddle 133885ab413bSRiver Riddle %new_results_0 = pdl_interp.get_results of %op0 : !pdl.range<value> 133985ab413bSRiver Riddle %new_results_1 = pdl_interp.get_results of %op1 : !pdl.range<value> 134085ab413bSRiver Riddle %new_results_2 = pdl_interp.get_results of %op2 : !pdl.range<value> 134185ab413bSRiver Riddle 134285ab413bSRiver Riddle pdl_interp.replace %root with (%new_results_0, %new_results_1, %new_results_2 : !pdl.range<value>, !pdl.range<value>, !pdl.range<value>) 134385ab413bSRiver Riddle pdl_interp.finalize 134485ab413bSRiver Riddle } 134585ab413bSRiver Riddle } 134685ab413bSRiver Riddle} 134785ab413bSRiver Riddle 134885ab413bSRiver Riddle// CHECK-LABEL: test.get_results_2 134985ab413bSRiver Riddle// CHECK: "test.success"() : () -> () 135085ab413bSRiver Riddle// CHECK: %[[RESULTS_1:.*]]:4 = "test.success"() : () -> (i32, i32, i32, i32) 135185ab413bSRiver Riddle// CHECK: %[[RESULTS_2:.*]] = "test.success"() : () -> i32 135285ab413bSRiver Riddle// CHECK: %[[RESULTS_2_SINGLE:.*]] = "test.success"() : () -> i32 135385ab413bSRiver Riddle// CHECK: "test.consumer"(%[[RESULTS_1]]#0, %[[RESULTS_1]]#1, %[[RESULTS_1]]#2, %[[RESULTS_1]]#3, %[[RESULTS_2]]) : (i32, i32, i32, i32, i32) -> () 135485ab413bSRiver Riddlemodule @ir attributes { test.get_results_2 } { 1355363b6559SMehdi Amini %results:5 = "test.attr_sized_results"() {resultSegmentSizes = array<i32: 0, 4, 1, 0>} : () -> (i32, i32, i32, i32, i32) 135685ab413bSRiver Riddle "test.consumer"(%results#0, %results#1, %results#2, %results#3, %results#4) : (i32, i32, i32, i32, i32) -> () 135785ab413bSRiver Riddle} 135885ab413bSRiver Riddle 135985ab413bSRiver Riddle// ----- 136085ab413bSRiver Riddle 136185ab413bSRiver Riddle//===----------------------------------------------------------------------===// 1362abfd1a8bSRiver Riddle// pdl_interp::GetValueTypeOp 1363abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1364abfd1a8bSRiver Riddle 1365abfd1a8bSRiver Riddle// Fully tested within the tests for other operations. 1366abfd1a8bSRiver Riddle 1367abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1368abfd1a8bSRiver Riddle// pdl_interp::IsNotNullOp 1369abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1370abfd1a8bSRiver Riddle 1371abfd1a8bSRiver Riddle// Fully tested within the tests for other operations. 1372abfd1a8bSRiver Riddle 1373abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1374abfd1a8bSRiver Riddle// pdl_interp::RecordMatchOp 1375abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1376abfd1a8bSRiver Riddle 1377abfd1a8bSRiver Riddle// Check that the highest benefit pattern is selected. 1378abfd1a8bSRiver Riddlemodule @patterns { 1379f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1380abfd1a8bSRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat1, ^end 1381abfd1a8bSRiver Riddle 1382abfd1a8bSRiver Riddle ^pat1: 1383abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@failure(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^pat2 1384abfd1a8bSRiver Riddle 1385abfd1a8bSRiver Riddle ^pat2: 1386abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(2), loc([%root]) -> ^end 1387abfd1a8bSRiver Riddle 1388abfd1a8bSRiver Riddle ^end: 1389abfd1a8bSRiver Riddle pdl_interp.finalize 1390abfd1a8bSRiver Riddle } 1391abfd1a8bSRiver Riddle 1392abfd1a8bSRiver Riddle module @rewriters { 1393f96a8675SRiver Riddle pdl_interp.func @failure(%root : !pdl.operation) { 1394abfd1a8bSRiver Riddle pdl_interp.erase %root 1395abfd1a8bSRiver Riddle pdl_interp.finalize 1396abfd1a8bSRiver Riddle } 1397f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 13983a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 1399abfd1a8bSRiver Riddle pdl_interp.erase %root 1400abfd1a8bSRiver Riddle pdl_interp.finalize 1401abfd1a8bSRiver Riddle } 1402abfd1a8bSRiver Riddle } 1403abfd1a8bSRiver Riddle} 1404abfd1a8bSRiver Riddle 1405abfd1a8bSRiver Riddle// CHECK-LABEL: test.record_match_1 1406abfd1a8bSRiver Riddle// CHECK: "test.success" 1407abfd1a8bSRiver Riddlemodule @ir attributes { test.record_match_1 } { 1408abfd1a8bSRiver Riddle "test.op"() : () -> () 1409abfd1a8bSRiver Riddle} 1410abfd1a8bSRiver Riddle 1411abfd1a8bSRiver Riddle// ----- 1412abfd1a8bSRiver Riddle 141385ab413bSRiver Riddle// Check that ranges are properly forwarded to the result. 141485ab413bSRiver Riddlemodule @patterns { 1415f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 141685ab413bSRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat1, ^end 141785ab413bSRiver Riddle 141885ab413bSRiver Riddle ^pat1: 141985ab413bSRiver Riddle %operands = pdl_interp.get_operands of %root : !pdl.range<value> 142085ab413bSRiver Riddle %results = pdl_interp.get_results of %root : !pdl.range<value> 142185ab413bSRiver Riddle %types = pdl_interp.get_value_type of %results : !pdl.range<type> 142285ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%operands, %types, %root : !pdl.range<value>, !pdl.range<type>, !pdl.operation) : benefit(1), loc([%root]) -> ^end 142385ab413bSRiver Riddle 142485ab413bSRiver Riddle ^end: 142585ab413bSRiver Riddle pdl_interp.finalize 142685ab413bSRiver Riddle } 142785ab413bSRiver Riddle 142885ab413bSRiver Riddle module @rewriters { 1429f96a8675SRiver Riddle pdl_interp.func @success(%operands: !pdl.range<value>, %types: !pdl.range<type>, %root: !pdl.operation) { 143085ab413bSRiver Riddle %op = pdl_interp.create_operation "test.success"(%operands : !pdl.range<value>) -> (%types : !pdl.range<type>) 143185ab413bSRiver Riddle %results = pdl_interp.get_results of %op : !pdl.range<value> 143285ab413bSRiver Riddle pdl_interp.replace %root with (%results : !pdl.range<value>) 143385ab413bSRiver Riddle pdl_interp.finalize 143485ab413bSRiver Riddle } 143585ab413bSRiver Riddle } 143685ab413bSRiver Riddle} 143785ab413bSRiver Riddle 143885ab413bSRiver Riddle// CHECK-LABEL: test.record_match_2 143985ab413bSRiver Riddle// CHECK: %[[OPERAND:.*]] = "test.producer"() : () -> i32 144085ab413bSRiver Riddle// CHECK: %[[RESULTS:.*]]:2 = "test.success"(%[[OPERAND]]) : (i32) -> (i64, i32) 144185ab413bSRiver Riddle// CHECK: "test.consumer"(%[[RESULTS]]#0, %[[RESULTS]]#1) : (i64, i32) -> () 144285ab413bSRiver Riddlemodule @ir attributes { test.record_match_2 } { 144385ab413bSRiver Riddle %input = "test.producer"() : () -> i32 144485ab413bSRiver Riddle %results:2 = "test.op"(%input) : (i32) -> (i64, i32) 144585ab413bSRiver Riddle "test.consumer"(%results#0, %results#1) : (i64, i32) -> () 144685ab413bSRiver Riddle} 144785ab413bSRiver Riddle 144885ab413bSRiver Riddle// ----- 144985ab413bSRiver Riddle 1450abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1451abfd1a8bSRiver Riddle// pdl_interp::ReplaceOp 1452abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1453abfd1a8bSRiver Riddle 1454abfd1a8bSRiver Riddlemodule @patterns { 1455f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1456abfd1a8bSRiver Riddle pdl_interp.check_operation_name of %root is "test.op" -> ^pat, ^end 1457abfd1a8bSRiver Riddle 1458abfd1a8bSRiver Riddle ^pat: 1459abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 1460abfd1a8bSRiver Riddle 1461abfd1a8bSRiver Riddle ^end: 1462abfd1a8bSRiver Riddle pdl_interp.finalize 1463abfd1a8bSRiver Riddle } 1464abfd1a8bSRiver Riddle 1465abfd1a8bSRiver Riddle module @rewriters { 1466f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 1467abfd1a8bSRiver Riddle %operand = pdl_interp.get_operand 0 of %root 14683a833a0eSRiver Riddle pdl_interp.replace %root with (%operand : !pdl.value) 1469abfd1a8bSRiver Riddle pdl_interp.finalize 1470abfd1a8bSRiver Riddle } 1471abfd1a8bSRiver Riddle } 1472abfd1a8bSRiver Riddle} 1473abfd1a8bSRiver Riddle 1474abfd1a8bSRiver Riddle// CHECK-LABEL: test.replace_op_1 1475abfd1a8bSRiver Riddle// CHECK: %[[INPUT:.*]] = "test.op_input" 1476abfd1a8bSRiver Riddle// CHECK-NOT: "test.op" 1477abfd1a8bSRiver Riddle// CHECK: "test.op_consumer"(%[[INPUT]]) 1478abfd1a8bSRiver Riddlemodule @ir attributes { test.replace_op_1 } { 1479abfd1a8bSRiver Riddle %input = "test.op_input"() : () -> i32 1480abfd1a8bSRiver Riddle %result = "test.op"(%input) : (i32) -> i32 1481abfd1a8bSRiver Riddle "test.op_consumer"(%result) : (i32) -> () 1482abfd1a8bSRiver Riddle} 1483abfd1a8bSRiver Riddle 1484abfd1a8bSRiver Riddle// ----- 1485abfd1a8bSRiver Riddle 1486abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1487abfd1a8bSRiver Riddle// pdl_interp::SwitchAttributeOp 1488abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1489abfd1a8bSRiver Riddle 1490abfd1a8bSRiver Riddlemodule @patterns { 1491f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1492abfd1a8bSRiver Riddle %attr = pdl_interp.get_attribute "test_attr" of %root 1493abfd1a8bSRiver Riddle pdl_interp.switch_attribute %attr to [0, unit](^end, ^pat) -> ^end 1494abfd1a8bSRiver Riddle 1495abfd1a8bSRiver Riddle ^pat: 1496abfd1a8bSRiver Riddle %attr_2 = pdl_interp.get_attribute "test_attr_2" of %root 1497abfd1a8bSRiver Riddle pdl_interp.switch_attribute %attr_2 to [0, unit](^end, ^end) -> ^pat2 1498abfd1a8bSRiver Riddle 1499abfd1a8bSRiver Riddle ^pat2: 1500abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 1501abfd1a8bSRiver Riddle 1502abfd1a8bSRiver Riddle ^end: 1503abfd1a8bSRiver Riddle pdl_interp.finalize 1504abfd1a8bSRiver Riddle } 1505abfd1a8bSRiver Riddle 1506abfd1a8bSRiver Riddle module @rewriters { 1507f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 15083a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 1509abfd1a8bSRiver Riddle pdl_interp.erase %root 1510abfd1a8bSRiver Riddle pdl_interp.finalize 1511abfd1a8bSRiver Riddle } 1512abfd1a8bSRiver Riddle } 1513abfd1a8bSRiver Riddle} 1514abfd1a8bSRiver Riddle 1515abfd1a8bSRiver Riddle// CHECK-LABEL: test.switch_attribute_1 1516abfd1a8bSRiver Riddle// CHECK: "test.success" 1517abfd1a8bSRiver Riddlemodule @ir attributes { test.switch_attribute_1 } { 1518abfd1a8bSRiver Riddle "test.op"() { test_attr } : () -> () 1519abfd1a8bSRiver Riddle} 1520abfd1a8bSRiver Riddle 1521abfd1a8bSRiver Riddle// ----- 1522abfd1a8bSRiver Riddle 1523abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1524abfd1a8bSRiver Riddle// pdl_interp::SwitchOperandCountOp 1525abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1526abfd1a8bSRiver Riddle 1527abfd1a8bSRiver Riddlemodule @patterns { 1528f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1529abfd1a8bSRiver Riddle pdl_interp.switch_operand_count of %root to dense<[0, 1]> : vector<2xi32>(^end, ^pat) -> ^end 1530abfd1a8bSRiver Riddle 1531abfd1a8bSRiver Riddle ^pat: 1532abfd1a8bSRiver Riddle pdl_interp.switch_operand_count of %root to dense<[0, 2]> : vector<2xi32>(^end, ^end) -> ^pat2 1533abfd1a8bSRiver Riddle 1534abfd1a8bSRiver Riddle ^pat2: 1535abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 1536abfd1a8bSRiver Riddle 1537abfd1a8bSRiver Riddle ^end: 1538abfd1a8bSRiver Riddle pdl_interp.finalize 1539abfd1a8bSRiver Riddle } 1540abfd1a8bSRiver Riddle 1541abfd1a8bSRiver Riddle module @rewriters { 1542f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 15433a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 1544abfd1a8bSRiver Riddle pdl_interp.erase %root 1545abfd1a8bSRiver Riddle pdl_interp.finalize 1546abfd1a8bSRiver Riddle } 1547abfd1a8bSRiver Riddle } 1548abfd1a8bSRiver Riddle} 1549abfd1a8bSRiver Riddle 1550abfd1a8bSRiver Riddle// CHECK-LABEL: test.switch_operand_1 1551abfd1a8bSRiver Riddle// CHECK: "test.success" 1552abfd1a8bSRiver Riddlemodule @ir attributes { test.switch_operand_1 } { 1553abfd1a8bSRiver Riddle %input = "test.op_input"() : () -> i32 1554abfd1a8bSRiver Riddle "test.op"(%input) : (i32) -> () 1555abfd1a8bSRiver Riddle} 1556abfd1a8bSRiver Riddle 1557abfd1a8bSRiver Riddle// ----- 1558abfd1a8bSRiver Riddle 1559abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1560abfd1a8bSRiver Riddle// pdl_interp::SwitchOperationNameOp 1561abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1562abfd1a8bSRiver Riddle 1563abfd1a8bSRiver Riddlemodule @patterns { 1564f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1565abfd1a8bSRiver Riddle pdl_interp.switch_operation_name of %root to ["foo.op", "test.op"](^end, ^pat1) -> ^end 1566abfd1a8bSRiver Riddle 1567abfd1a8bSRiver Riddle ^pat1: 1568abfd1a8bSRiver Riddle pdl_interp.switch_operation_name of %root to ["foo.op", "bar.op"](^end, ^end) -> ^pat2 1569abfd1a8bSRiver Riddle 1570abfd1a8bSRiver Riddle ^pat2: 1571abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 1572abfd1a8bSRiver Riddle 1573abfd1a8bSRiver Riddle ^end: 1574abfd1a8bSRiver Riddle pdl_interp.finalize 1575abfd1a8bSRiver Riddle } 1576abfd1a8bSRiver Riddle 1577abfd1a8bSRiver Riddle module @rewriters { 1578f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 15793a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 1580abfd1a8bSRiver Riddle pdl_interp.erase %root 1581abfd1a8bSRiver Riddle pdl_interp.finalize 1582abfd1a8bSRiver Riddle } 1583abfd1a8bSRiver Riddle } 1584abfd1a8bSRiver Riddle} 1585abfd1a8bSRiver Riddle 1586abfd1a8bSRiver Riddle// CHECK-LABEL: test.switch_operation_name_1 1587abfd1a8bSRiver Riddle// CHECK: "test.success" 1588abfd1a8bSRiver Riddlemodule @ir attributes { test.switch_operation_name_1 } { 1589abfd1a8bSRiver Riddle "test.op"() : () -> () 1590abfd1a8bSRiver Riddle} 1591abfd1a8bSRiver Riddle 1592abfd1a8bSRiver Riddle// ----- 1593abfd1a8bSRiver Riddle 1594abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1595abfd1a8bSRiver Riddle// pdl_interp::SwitchResultCountOp 1596abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1597abfd1a8bSRiver Riddle 1598abfd1a8bSRiver Riddlemodule @patterns { 1599f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1600abfd1a8bSRiver Riddle pdl_interp.switch_result_count of %root to dense<[0, 1]> : vector<2xi32>(^end, ^pat) -> ^end 1601abfd1a8bSRiver Riddle 1602abfd1a8bSRiver Riddle ^pat: 1603abfd1a8bSRiver Riddle pdl_interp.switch_result_count of %root to dense<[0, 2]> : vector<2xi32>(^end, ^end) -> ^pat2 1604abfd1a8bSRiver Riddle 1605abfd1a8bSRiver Riddle ^pat2: 1606abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 1607abfd1a8bSRiver Riddle 1608abfd1a8bSRiver Riddle ^end: 1609abfd1a8bSRiver Riddle pdl_interp.finalize 1610abfd1a8bSRiver Riddle } 1611abfd1a8bSRiver Riddle 1612abfd1a8bSRiver Riddle module @rewriters { 1613f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 16143a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 1615abfd1a8bSRiver Riddle pdl_interp.erase %root 1616abfd1a8bSRiver Riddle pdl_interp.finalize 1617abfd1a8bSRiver Riddle } 1618abfd1a8bSRiver Riddle } 1619abfd1a8bSRiver Riddle} 1620abfd1a8bSRiver Riddle 1621abfd1a8bSRiver Riddle// CHECK-LABEL: test.switch_result_1 1622abfd1a8bSRiver Riddle// CHECK: "test.success" 1623abfd1a8bSRiver Riddlemodule @ir attributes { test.switch_result_1 } { 1624abfd1a8bSRiver Riddle "test.op"() : () -> i32 1625abfd1a8bSRiver Riddle} 1626abfd1a8bSRiver Riddle 1627abfd1a8bSRiver Riddle// ----- 1628abfd1a8bSRiver Riddle 1629abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1630abfd1a8bSRiver Riddle// pdl_interp::SwitchTypeOp 1631abfd1a8bSRiver Riddle//===----------------------------------------------------------------------===// 1632abfd1a8bSRiver Riddle 1633abfd1a8bSRiver Riddlemodule @patterns { 1634f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 1635abfd1a8bSRiver Riddle %attr = pdl_interp.get_attribute "test_attr" of %root 1636abfd1a8bSRiver Riddle pdl_interp.is_not_null %attr : !pdl.attribute -> ^pat1, ^end 1637abfd1a8bSRiver Riddle 1638abfd1a8bSRiver Riddle ^pat1: 1639abfd1a8bSRiver Riddle %type = pdl_interp.get_attribute_type of %attr 1640abfd1a8bSRiver Riddle pdl_interp.switch_type %type to [i32, i64](^pat2, ^end) -> ^end 1641abfd1a8bSRiver Riddle 1642abfd1a8bSRiver Riddle ^pat2: 1643abfd1a8bSRiver Riddle pdl_interp.switch_type %type to [i16, i64](^end, ^end) -> ^pat3 1644abfd1a8bSRiver Riddle 1645abfd1a8bSRiver Riddle ^pat3: 1646abfd1a8bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 1647abfd1a8bSRiver Riddle 1648abfd1a8bSRiver Riddle ^end: 1649abfd1a8bSRiver Riddle pdl_interp.finalize 1650abfd1a8bSRiver Riddle } 1651abfd1a8bSRiver Riddle 1652abfd1a8bSRiver Riddle module @rewriters { 1653f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 16543a833a0eSRiver Riddle %op = pdl_interp.create_operation "test.success" 1655abfd1a8bSRiver Riddle pdl_interp.erase %root 1656abfd1a8bSRiver Riddle pdl_interp.finalize 1657abfd1a8bSRiver Riddle } 1658abfd1a8bSRiver Riddle } 1659abfd1a8bSRiver Riddle} 1660abfd1a8bSRiver Riddle 1661abfd1a8bSRiver Riddle// CHECK-LABEL: test.switch_type_1 1662abfd1a8bSRiver Riddle// CHECK: "test.success" 1663abfd1a8bSRiver Riddlemodule @ir attributes { test.switch_type_1 } { 1664abfd1a8bSRiver Riddle "test.op"() { test_attr = 10 : i32 } : () -> () 1665abfd1a8bSRiver Riddle} 166685ab413bSRiver Riddle 166785ab413bSRiver Riddle// ----- 166885ab413bSRiver Riddle 166985ab413bSRiver Riddle//===----------------------------------------------------------------------===// 167085ab413bSRiver Riddle// pdl_interp::SwitchTypesOp 167185ab413bSRiver Riddle//===----------------------------------------------------------------------===// 167285ab413bSRiver Riddle 167385ab413bSRiver Riddlemodule @patterns { 1674f96a8675SRiver Riddle pdl_interp.func @matcher(%root : !pdl.operation) { 167585ab413bSRiver Riddle %results = pdl_interp.get_results of %root : !pdl.range<value> 167685ab413bSRiver Riddle %types = pdl_interp.get_value_type of %results : !pdl.range<type> 167785ab413bSRiver Riddle pdl_interp.switch_types %types to [[i64, i64], [i32]](^pat2, ^end) -> ^end 167885ab413bSRiver Riddle 167985ab413bSRiver Riddle ^pat2: 168085ab413bSRiver Riddle pdl_interp.switch_types %types to [[i32], [i64, i32]](^end, ^end) -> ^pat3 168185ab413bSRiver Riddle 168285ab413bSRiver Riddle ^pat3: 168385ab413bSRiver Riddle pdl_interp.record_match @rewriters::@success(%root : !pdl.operation) : benefit(1), loc([%root]) -> ^end 168485ab413bSRiver Riddle 168585ab413bSRiver Riddle ^end: 168685ab413bSRiver Riddle pdl_interp.finalize 168785ab413bSRiver Riddle } 168885ab413bSRiver Riddle 168985ab413bSRiver Riddle module @rewriters { 1690f96a8675SRiver Riddle pdl_interp.func @success(%root : !pdl.operation) { 169185ab413bSRiver Riddle %op = pdl_interp.create_operation "test.success" 169285ab413bSRiver Riddle pdl_interp.erase %root 169385ab413bSRiver Riddle pdl_interp.finalize 169485ab413bSRiver Riddle } 169585ab413bSRiver Riddle } 169685ab413bSRiver Riddle} 169785ab413bSRiver Riddle 169885ab413bSRiver Riddle// CHECK-LABEL: test.switch_types_1 169985ab413bSRiver Riddle// CHECK: "test.success" 170085ab413bSRiver Riddlemodule @ir attributes { test.switch_types_1 } { 170185ab413bSRiver Riddle %results:2 = "test.op"() : () -> (i64, i64) 170285ab413bSRiver Riddle} 1703