xref: /llvm-project/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-permutations.td (revision 7d81062352f75cf328d91d4900af52c1842b950e)
1// RUN: llvm-tblgen -I %p/../../../include -gen-global-isel-combiner \
2// RUN:     -combiners=MyCombiner -gicombiner-debug-cxxpreds %s | \
3// RUN: FileCheck %s
4
5include "llvm/Target/Target.td"
6include "llvm/Target/GlobalISel/Combine.td"
7
8def MyTargetISA : InstrInfo;
9def MyTarget : Target { let InstructionSet = MyTargetISA; }
10
11def MatchFooPerms: GICombinePatFrag<
12    (outs root:$foo),
13    (ins gi_imm:$cst),
14    [
15      (pattern (G_ZEXT $foo, $b), (G_TRUNC $b, $x):$dbg0, "return foo(${x}, ${cst})"),
16      (pattern (G_TRUNC $foo, $z):$dbg1, "return bar(${foo}, ${cst})")
17    ]>;
18
19def Test0 : GICombineRule<
20  (defs root:$dst),
21  (match (G_AND $dst, $cst0, $tmp),
22         (G_AND $tmp, $cst1, $cst2),
23         (MatchFooPerms $cst0, (i32 10)):$a,
24         (MatchFooPerms $cst1, (i32 20)):$b,
25         (MatchFooPerms $cst2, (i32 30)):$c
26  ),
27  (apply "APPLY ${cst0}")>;
28
29def MyCombiner: GICombiner<"GenMyCombiner", [
30  Test0
31]>;
32
33// CHECK:      bool GenMyCombiner::testMIPredicate_MI(unsigned PredicateID, const MachineInstr & MI, const MatcherState &State) const {
34// CHECK-NEXT:   switch (PredicateID) {
35// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner0: {
36// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[0], c[0]]
37// CHECK-NEXT:     return foo(State.MIs[2]->getOperand(1), 10)
38// CHECK-NEXT:     llvm_unreachable("GICombiner0 should have returned");
39// CHECK-NEXT:   }
40// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner1: {
41// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[0], c[0]]
42// CHECK-NEXT:     return foo(State.MIs[5]->getOperand(1), 20)
43// CHECK-NEXT:     llvm_unreachable("GICombiner1 should have returned");
44// CHECK-NEXT:   }
45// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner2: {
46// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[0], c[0]]
47// CHECK-NEXT:     return foo(State.MIs[7]->getOperand(1), 30)
48// CHECK-NEXT:     llvm_unreachable("GICombiner2 should have returned");
49// CHECK-NEXT:   }
50// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner3: {
51// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[0], c[1]]
52// CHECK-NEXT:     return foo(State.MIs[2]->getOperand(1), 10)
53// CHECK-NEXT:     llvm_unreachable("GICombiner3 should have returned");
54// CHECK-NEXT:   }
55// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner4: {
56// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[0], c[1]]
57// CHECK-NEXT:     return foo(State.MIs[5]->getOperand(1), 20)
58// CHECK-NEXT:     llvm_unreachable("GICombiner4 should have returned");
59// CHECK-NEXT:   }
60// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner5: {
61// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[0], c[1]]
62// CHECK-NEXT:     return bar(State.MIs[3]->getOperand(2), 30)
63// CHECK-NEXT:     llvm_unreachable("GICombiner5 should have returned");
64// CHECK-NEXT:   }
65// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner6: {
66// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[1], c[0]]
67// CHECK-NEXT:     return foo(State.MIs[2]->getOperand(1), 10)
68// CHECK-NEXT:     llvm_unreachable("GICombiner6 should have returned");
69// CHECK-NEXT:   }
70// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner7: {
71// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[1], c[0]]
72// CHECK-NEXT:     return bar(State.MIs[3]->getOperand(1), 20)
73// CHECK-NEXT:     llvm_unreachable("GICombiner7 should have returned");
74// CHECK-NEXT:   }
75// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner8: {
76// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[1], c[0]]
77// CHECK-NEXT:     return foo(State.MIs[6]->getOperand(1), 30)
78// CHECK-NEXT:     llvm_unreachable("GICombiner8 should have returned");
79// CHECK-NEXT:   }
80// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner9: {
81// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[1], c[1]]
82// CHECK-NEXT:     return foo(State.MIs[2]->getOperand(1), 10)
83// CHECK-NEXT:     llvm_unreachable("GICombiner9 should have returned");
84// CHECK-NEXT:   }
85// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner10: {
86// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[1], c[1]]
87// CHECK-NEXT:     return bar(State.MIs[3]->getOperand(1), 20)
88// CHECK-NEXT:     llvm_unreachable("GICombiner10 should have returned");
89// CHECK-NEXT:   }
90// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner11: {
91// CHECK-NEXT:     // Pattern Alternatives: [a[0], b[1], c[1]]
92// CHECK-NEXT:     return bar(State.MIs[3]->getOperand(2), 30)
93// CHECK-NEXT:     llvm_unreachable("GICombiner11 should have returned");
94// CHECK-NEXT:   }
95// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner12: {
96// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[0], c[0]]
97// CHECK-NEXT:     return bar(State.MIs[0]->getOperand(1), 10)
98// CHECK-NEXT:     llvm_unreachable("GICombiner12 should have returned");
99// CHECK-NEXT:   }
100// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner13: {
101// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[0], c[0]]
102// CHECK-NEXT:     return foo(State.MIs[4]->getOperand(1), 20)
103// CHECK-NEXT:     llvm_unreachable("GICombiner13 should have returned");
104// CHECK-NEXT:   }
105// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner14: {
106// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[0], c[0]]
107// CHECK-NEXT:     return foo(State.MIs[6]->getOperand(1), 30)
108// CHECK-NEXT:     llvm_unreachable("GICombiner14 should have returned");
109// CHECK-NEXT:   }
110// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner15: {
111// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[0], c[1]]
112// CHECK-NEXT:     return bar(State.MIs[0]->getOperand(1), 10)
113// CHECK-NEXT:     llvm_unreachable("GICombiner15 should have returned");
114// CHECK-NEXT:   }
115// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner16: {
116// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[0], c[1]]
117// CHECK-NEXT:     return foo(State.MIs[4]->getOperand(1), 20)
118// CHECK-NEXT:     llvm_unreachable("GICombiner16 should have returned");
119// CHECK-NEXT:   }
120// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner17: {
121// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[0], c[1]]
122// CHECK-NEXT:     return bar(State.MIs[3]->getOperand(2), 30)
123// CHECK-NEXT:     llvm_unreachable("GICombiner17 should have returned");
124// CHECK-NEXT:   }
125// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner18: {
126// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[1], c[0]]
127// CHECK-NEXT:     return bar(State.MIs[0]->getOperand(1), 10)
128// CHECK-NEXT:     llvm_unreachable("GICombiner18 should have returned");
129// CHECK-NEXT:   }
130// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner19: {
131// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[1], c[0]]
132// CHECK-NEXT:     return bar(State.MIs[3]->getOperand(1), 20)
133// CHECK-NEXT:     llvm_unreachable("GICombiner19 should have returned");
134// CHECK-NEXT:   }
135// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner20: {
136// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[1], c[0]]
137// CHECK-NEXT:     return foo(State.MIs[5]->getOperand(1), 30)
138// CHECK-NEXT:     llvm_unreachable("GICombiner20 should have returned");
139// CHECK-NEXT:   }
140// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner21: {
141// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[1], c[1]]
142// CHECK-NEXT:     return bar(State.MIs[0]->getOperand(1), 10)
143// CHECK-NEXT:     llvm_unreachable("GICombiner21 should have returned");
144// CHECK-NEXT:   }
145// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner22: {
146// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[1], c[1]]
147// CHECK-NEXT:     return bar(State.MIs[3]->getOperand(1), 20)
148// CHECK-NEXT:     llvm_unreachable("GICombiner22 should have returned");
149// CHECK-NEXT:   }
150// CHECK-NEXT:   case GICXXPred_MI_Predicate_GICombiner23: {
151// CHECK-NEXT:     // Pattern Alternatives: [a[1], b[1], c[1]]
152// CHECK-NEXT:     return bar(State.MIs[3]->getOperand(2), 30)
153// CHECK-NEXT:     llvm_unreachable("GICombiner23 should have returned");
154// CHECK-NEXT:   }
155// CHECK-NEXT:   }
156// CHECK-NEXT:   llvm_unreachable("Unknown predicate");
157// CHECK-NEXT:   return false;
158// CHECK-NEXT: }
159
160// CHECK:      const uint8_t *GenMyCombiner::getMatchTable() const {
161// CHECK-NEXT:   constexpr static uint8_t MatchTable0[] = {
162// CHECK-NEXT:     GIM_Try, /*On fail goto*//*Label 0*/ GIMT_Encode4(562),
163// CHECK-NEXT:       GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_AND),
164// CHECK-NEXT:       GIM_Try, /*On fail goto*//*Label 1*/ GIMT_Encode4(66), // Rule ID 7 //
165// CHECK-NEXT:         GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
166// CHECK-NEXT:         // MIs[0] dst
167// CHECK-NEXT:         // No operand predicates
168// CHECK-NEXT:         // MIs[0] cst0
169// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
170// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_TRUNC),
171// CHECK-NEXT:         // MIs[1] a.z
172// CHECK-NEXT:         // No operand predicates
173// CHECK-NEXT:         // MIs[0] tmp
174// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/2, /*MI*/0, /*OpIdx*/2, // MIs[2]
175// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/2, GIMT_Encode2(TargetOpcode::G_AND),
176// CHECK-NEXT:         // MIs[2] cst1
177// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/3, /*MI*/2, /*OpIdx*/1, // MIs[3]
178// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/3, GIMT_Encode2(TargetOpcode::G_TRUNC),
179// CHECK-NEXT:         // MIs[3] b.z
180// CHECK-NEXT:         // No operand predicates
181// CHECK-NEXT:         // MIs[2] cst2
182// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/4, /*MI*/2, /*OpIdx*/2, // MIs[4]
183// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/4, GIMT_Encode2(TargetOpcode::G_TRUNC),
184// CHECK-NEXT:         // MIs[4] c.z
185// CHECK-NEXT:         // No operand predicates
186// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner21),
187// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner22),
188// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner23),
189// CHECK-NEXT:         GIM_CheckIsSafeToFold, /*NumInsns*/4,
190// CHECK-NEXT:         // Combiner Rule #0: Test0 @ [a[1], b[1], c[1]]
191// CHECK-NEXT:         GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
192// CHECK-NEXT:       // Label 1: @66
193// CHECK-NEXT:       GIM_Try, /*On fail goto*//*Label 2*/ GIMT_Encode4(131), // Rule ID 6 //
194// CHECK-NEXT:         GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
195// CHECK-NEXT:         // MIs[0] dst
196// CHECK-NEXT:         // No operand predicates
197// CHECK-NEXT:         // MIs[0] cst0
198// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
199// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_TRUNC),
200// CHECK-NEXT:         // MIs[1] a.z
201// CHECK-NEXT:         // No operand predicates
202// CHECK-NEXT:         // MIs[0] tmp
203// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/2, /*MI*/0, /*OpIdx*/2, // MIs[2]
204// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/2, GIMT_Encode2(TargetOpcode::G_AND),
205// CHECK-NEXT:         // MIs[2] cst1
206// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/3, /*MI*/2, /*OpIdx*/1, // MIs[3]
207// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/3, GIMT_Encode2(TargetOpcode::G_TRUNC),
208// CHECK-NEXT:         // MIs[3] b.z
209// CHECK-NEXT:         // No operand predicates
210// CHECK-NEXT:         // MIs[2] cst2
211// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/4, /*MI*/2, /*OpIdx*/2, // MIs[4]
212// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/4, GIMT_Encode2(TargetOpcode::G_ZEXT),
213// CHECK-NEXT:         // MIs[4] c.b
214// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/5, /*MI*/4, /*OpIdx*/1, // MIs[5]
215// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/5, GIMT_Encode2(TargetOpcode::G_TRUNC),
216// CHECK-NEXT:         // MIs[5] c.x
217// CHECK-NEXT:         // No operand predicates
218// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner18),
219// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner19),
220// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner20),
221// CHECK-NEXT:         GIM_CheckIsSafeToFold, /*NumInsns*/5,
222// CHECK-NEXT:         // Combiner Rule #0: Test0 @ [a[1], b[1], c[0]]
223// CHECK-NEXT:         GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
224// CHECK-NEXT:       // Label 2: @131
225// CHECK-NEXT:       GIM_Try, /*On fail goto*//*Label 3*/ GIMT_Encode4(196), // Rule ID 5 //
226// CHECK-NEXT:         GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
227// CHECK-NEXT:         // MIs[0] dst
228// CHECK-NEXT:         // No operand predicates
229// CHECK-NEXT:         // MIs[0] cst0
230// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
231// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_TRUNC),
232// CHECK-NEXT:         // MIs[1] a.z
233// CHECK-NEXT:         // No operand predicates
234// CHECK-NEXT:         // MIs[0] tmp
235// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/2, /*MI*/0, /*OpIdx*/2, // MIs[2]
236// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/2, GIMT_Encode2(TargetOpcode::G_AND),
237// CHECK-NEXT:         // MIs[2] cst1
238// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/3, /*MI*/2, /*OpIdx*/1, // MIs[3]
239// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/3, GIMT_Encode2(TargetOpcode::G_ZEXT),
240// CHECK-NEXT:         // MIs[3] b.b
241// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/4, /*MI*/3, /*OpIdx*/1, // MIs[4]
242// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/4, GIMT_Encode2(TargetOpcode::G_TRUNC),
243// CHECK-NEXT:         // MIs[4] b.x
244// CHECK-NEXT:         // No operand predicates
245// CHECK-NEXT:         // MIs[2] cst2
246// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/5, /*MI*/2, /*OpIdx*/2, // MIs[5]
247// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/5, GIMT_Encode2(TargetOpcode::G_TRUNC),
248// CHECK-NEXT:         // MIs[5] c.z
249// CHECK-NEXT:         // No operand predicates
250// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner15),
251// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner16),
252// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner17),
253// CHECK-NEXT:         GIM_CheckIsSafeToFold, /*NumInsns*/5,
254// CHECK-NEXT:         // Combiner Rule #0: Test0 @ [a[1], b[0], c[1]]
255// CHECK-NEXT:         GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
256// CHECK-NEXT:       // Label 3: @196
257// CHECK-NEXT:       GIM_Try, /*On fail goto*//*Label 4*/ GIMT_Encode4(269), // Rule ID 4 //
258// CHECK-NEXT:         GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
259// CHECK-NEXT:         // MIs[0] dst
260// CHECK-NEXT:         // No operand predicates
261// CHECK-NEXT:         // MIs[0] cst0
262// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
263// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_TRUNC),
264// CHECK-NEXT:         // MIs[1] a.z
265// CHECK-NEXT:         // No operand predicates
266// CHECK-NEXT:         // MIs[0] tmp
267// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/2, /*MI*/0, /*OpIdx*/2, // MIs[2]
268// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/2, GIMT_Encode2(TargetOpcode::G_AND),
269// CHECK-NEXT:         // MIs[2] cst1
270// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/3, /*MI*/2, /*OpIdx*/1, // MIs[3]
271// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/3, GIMT_Encode2(TargetOpcode::G_ZEXT),
272// CHECK-NEXT:         // MIs[3] b.b
273// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/4, /*MI*/3, /*OpIdx*/1, // MIs[4]
274// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/4, GIMT_Encode2(TargetOpcode::G_TRUNC),
275// CHECK-NEXT:         // MIs[4] b.x
276// CHECK-NEXT:         // No operand predicates
277// CHECK-NEXT:         // MIs[2] cst2
278// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/5, /*MI*/2, /*OpIdx*/2, // MIs[5]
279// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/5, GIMT_Encode2(TargetOpcode::G_ZEXT),
280// CHECK-NEXT:         // MIs[5] c.b
281// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/6, /*MI*/5, /*OpIdx*/1, // MIs[6]
282// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/6, GIMT_Encode2(TargetOpcode::G_TRUNC),
283// CHECK-NEXT:         // MIs[6] c.x
284// CHECK-NEXT:         // No operand predicates
285// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner12),
286// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner13),
287// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner14),
288// CHECK-NEXT:         GIM_CheckIsSafeToFold, /*NumInsns*/6,
289// CHECK-NEXT:         // Combiner Rule #0: Test0 @ [a[1], b[0], c[0]]
290// CHECK-NEXT:         GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
291// CHECK-NEXT:       // Label 4: @269
292// CHECK-NEXT:       GIM_Try, /*On fail goto*//*Label 5*/ GIMT_Encode4(334), // Rule ID 3 //
293// CHECK-NEXT:         GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
294// CHECK-NEXT:         // MIs[0] dst
295// CHECK-NEXT:         // No operand predicates
296// CHECK-NEXT:         // MIs[0] cst0
297// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
298// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_ZEXT),
299// CHECK-NEXT:         // MIs[1] a.b
300// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/2, /*MI*/1, /*OpIdx*/1, // MIs[2]
301// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/2, GIMT_Encode2(TargetOpcode::G_TRUNC),
302// CHECK-NEXT:         // MIs[2] a.x
303// CHECK-NEXT:         // No operand predicates
304// CHECK-NEXT:         // MIs[0] tmp
305// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/3, /*MI*/0, /*OpIdx*/2, // MIs[3]
306// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/3, GIMT_Encode2(TargetOpcode::G_AND),
307// CHECK-NEXT:         // MIs[3] cst1
308// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/4, /*MI*/3, /*OpIdx*/1, // MIs[4]
309// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/4, GIMT_Encode2(TargetOpcode::G_TRUNC),
310// CHECK-NEXT:         // MIs[4] b.z
311// CHECK-NEXT:         // No operand predicates
312// CHECK-NEXT:         // MIs[3] cst2
313// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/5, /*MI*/3, /*OpIdx*/2, // MIs[5]
314// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/5, GIMT_Encode2(TargetOpcode::G_TRUNC),
315// CHECK-NEXT:         // MIs[5] c.z
316// CHECK-NEXT:         // No operand predicates
317// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner9),
318// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner10),
319// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner11),
320// CHECK-NEXT:         GIM_CheckIsSafeToFold, /*NumInsns*/5,
321// CHECK-NEXT:         // Combiner Rule #0: Test0 @ [a[0], b[1], c[1]]
322// CHECK-NEXT:         GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
323// CHECK-NEXT:       // Label 5: @334
324// CHECK-NEXT:       GIM_Try, /*On fail goto*//*Label 6*/ GIMT_Encode4(407), // Rule ID 2 //
325// CHECK-NEXT:         GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
326// CHECK-NEXT:         // MIs[0] dst
327// CHECK-NEXT:         // No operand predicates
328// CHECK-NEXT:         // MIs[0] cst0
329// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
330// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_ZEXT),
331// CHECK-NEXT:         // MIs[1] a.b
332// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/2, /*MI*/1, /*OpIdx*/1, // MIs[2]
333// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/2, GIMT_Encode2(TargetOpcode::G_TRUNC),
334// CHECK-NEXT:         // MIs[2] a.x
335// CHECK-NEXT:         // No operand predicates
336// CHECK-NEXT:         // MIs[0] tmp
337// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/3, /*MI*/0, /*OpIdx*/2, // MIs[3]
338// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/3, GIMT_Encode2(TargetOpcode::G_AND),
339// CHECK-NEXT:         // MIs[3] cst1
340// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/4, /*MI*/3, /*OpIdx*/1, // MIs[4]
341// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/4, GIMT_Encode2(TargetOpcode::G_TRUNC),
342// CHECK-NEXT:         // MIs[4] b.z
343// CHECK-NEXT:         // No operand predicates
344// CHECK-NEXT:         // MIs[3] cst2
345// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/5, /*MI*/3, /*OpIdx*/2, // MIs[5]
346// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/5, GIMT_Encode2(TargetOpcode::G_ZEXT),
347// CHECK-NEXT:         // MIs[5] c.b
348// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/6, /*MI*/5, /*OpIdx*/1, // MIs[6]
349// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/6, GIMT_Encode2(TargetOpcode::G_TRUNC),
350// CHECK-NEXT:         // MIs[6] c.x
351// CHECK-NEXT:         // No operand predicates
352// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner6),
353// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner7),
354// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner8),
355// CHECK-NEXT:         GIM_CheckIsSafeToFold, /*NumInsns*/6,
356// CHECK-NEXT:         // Combiner Rule #0: Test0 @ [a[0], b[1], c[0]]
357// CHECK-NEXT:         GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
358// CHECK-NEXT:       // Label 6: @407
359// CHECK-NEXT:       GIM_Try, /*On fail goto*//*Label 7*/ GIMT_Encode4(480), // Rule ID 1 //
360// CHECK-NEXT:         GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
361// CHECK-NEXT:         // MIs[0] dst
362// CHECK-NEXT:         // No operand predicates
363// CHECK-NEXT:         // MIs[0] cst0
364// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
365// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_ZEXT),
366// CHECK-NEXT:         // MIs[1] a.b
367// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/2, /*MI*/1, /*OpIdx*/1, // MIs[2]
368// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/2, GIMT_Encode2(TargetOpcode::G_TRUNC),
369// CHECK-NEXT:         // MIs[2] a.x
370// CHECK-NEXT:         // No operand predicates
371// CHECK-NEXT:         // MIs[0] tmp
372// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/3, /*MI*/0, /*OpIdx*/2, // MIs[3]
373// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/3, GIMT_Encode2(TargetOpcode::G_AND),
374// CHECK-NEXT:         // MIs[3] cst1
375// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/4, /*MI*/3, /*OpIdx*/1, // MIs[4]
376// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/4, GIMT_Encode2(TargetOpcode::G_ZEXT),
377// CHECK-NEXT:         // MIs[4] b.b
378// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/5, /*MI*/4, /*OpIdx*/1, // MIs[5]
379// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/5, GIMT_Encode2(TargetOpcode::G_TRUNC),
380// CHECK-NEXT:         // MIs[5] b.x
381// CHECK-NEXT:         // No operand predicates
382// CHECK-NEXT:         // MIs[3] cst2
383// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/6, /*MI*/3, /*OpIdx*/2, // MIs[6]
384// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/6, GIMT_Encode2(TargetOpcode::G_TRUNC),
385// CHECK-NEXT:         // MIs[6] c.z
386// CHECK-NEXT:         // No operand predicates
387// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner3),
388// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner4),
389// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner5),
390// CHECK-NEXT:         GIM_CheckIsSafeToFold, /*NumInsns*/6,
391// CHECK-NEXT:         // Combiner Rule #0: Test0 @ [a[0], b[0], c[1]]
392// CHECK-NEXT:         GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
393// CHECK-NEXT:       // Label 7: @480
394// CHECK-NEXT:       GIM_Try, /*On fail goto*//*Label 8*/ GIMT_Encode4(561), // Rule ID 0 //
395// CHECK-NEXT:         GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),
396// CHECK-NEXT:         // MIs[0] dst
397// CHECK-NEXT:         // No operand predicates
398// CHECK-NEXT:         // MIs[0] cst0
399// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
400// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_ZEXT),
401// CHECK-NEXT:         // MIs[1] a.b
402// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/2, /*MI*/1, /*OpIdx*/1, // MIs[2]
403// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/2, GIMT_Encode2(TargetOpcode::G_TRUNC),
404// CHECK-NEXT:         // MIs[2] a.x
405// CHECK-NEXT:         // No operand predicates
406// CHECK-NEXT:         // MIs[0] tmp
407// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/3, /*MI*/0, /*OpIdx*/2, // MIs[3]
408// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/3, GIMT_Encode2(TargetOpcode::G_AND),
409// CHECK-NEXT:         // MIs[3] cst1
410// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/4, /*MI*/3, /*OpIdx*/1, // MIs[4]
411// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/4, GIMT_Encode2(TargetOpcode::G_ZEXT),
412// CHECK-NEXT:         // MIs[4] b.b
413// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/5, /*MI*/4, /*OpIdx*/1, // MIs[5]
414// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/5, GIMT_Encode2(TargetOpcode::G_TRUNC),
415// CHECK-NEXT:         // MIs[5] b.x
416// CHECK-NEXT:         // No operand predicates
417// CHECK-NEXT:         // MIs[3] cst2
418// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/6, /*MI*/3, /*OpIdx*/2, // MIs[6]
419// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/6, GIMT_Encode2(TargetOpcode::G_ZEXT),
420// CHECK-NEXT:         // MIs[6] c.b
421// CHECK-NEXT:         GIM_RecordInsnIgnoreCopies, /*DefineMI*/7, /*MI*/6, /*OpIdx*/1, // MIs[7]
422// CHECK-NEXT:         GIM_CheckOpcode, /*MI*/7, GIMT_Encode2(TargetOpcode::G_TRUNC),
423// CHECK-NEXT:         // MIs[7] c.x
424// CHECK-NEXT:         // No operand predicates
425// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner0),
426// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner1),
427// CHECK-NEXT:         GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner2),
428// CHECK-NEXT:         GIM_CheckIsSafeToFold, /*NumInsns*/7,
429// CHECK-NEXT:         // Combiner Rule #0: Test0 @ [a[0], b[0], c[0]]
430// CHECK-NEXT:         GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),
431// CHECK-NEXT:       // Label 8: @561
432// CHECK-NEXT:       GIM_Reject,
433// CHECK-NEXT:     // Label 0: @562
434// CHECK-NEXT:     GIM_Reject,
435// CHECK-NEXT:     }; // Size: 563 bytes
436// CHECK-NEXT:   return MatchTable0;
437// CHECK-NEXT: }
438