xref: /llvm-project/mlir/test/Rewrite/pdl-bytecode.mlir (revision 8ec28af8eaff5acd0df3e53340159c034f08533d)
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