5
5
// CHECK: // PatFrag predicates.
6
6
// CHECK-NEXT: enum {
7
7
// CHECK-NEXT: GICXXPred_MI_Predicate_and_or_pat = GICXXPred_Invalid + 1,
8
+ // CHECK-NEXT: GICXXPred_MI_Predicate_mul_pat,
8
9
// CHECK-NEXT: GICXXPred_MI_Predicate_or_oneuse,
9
10
// CHECK-NEXT: GICXXPred_MI_Predicate_patfrags_test_pat,
10
11
// CHECK-NEXT: GICXXPred_MI_Predicate_sub3_pat,
15
16
// CHECK: bool MyTargetInstructionSelector::testMIPredicate_MI(
16
17
// CHECK: case GICXXPred_MI_Predicate_and_or_pat: {
17
18
// CHECK: return doesComplexCheck(MI);
19
+ // CHECK: case GICXXPred_MI_Predicate_mul_pat: {
20
+ // CHECK: return doesComplexCheck(MI);
18
21
// CHECK: case GICXXPred_MI_Predicate_or_oneuse: {
19
22
// CHECK: return MRI.hasOneNonDBGUse(MI.getOperand(0).getReg());
20
23
// CHECK: case GICXXPred_MI_Predicate_patfrags_test_pat: {
@@ -49,6 +52,7 @@ def D0 : MyReg<"d0", [S0, S1]>;
49
52
def DRegs : MyClass<32, [i32], (sequence "D%u", 0, 0)>;
50
53
def DOP : RegisterOperand<DRegs>;
51
54
def AND_OR : I<(outs DRegs:$dst), (ins DOP:$src0, DOP:$src1, DOP:$src2), []>;
55
+ def MUL_OR : I<(outs DRegs:$dst), (ins DOP:$src0, DOP:$src1, DOP:$src2), []>;
52
56
53
57
def or_oneuse : PatFrag<
54
58
(ops node:$x, node:$y),
@@ -69,7 +73,7 @@ def and_or_pat : PatFrag<
69
73
let PredicateCodeUsesOperands = 1;
70
74
}
71
75
72
- // CHECK: GIM_Try, /*On fail goto*//*Label 0*/ 99, // Rule ID 6 //
76
+ // CHECK: GIM_Try, /*On fail goto*//*Label 0*/ 99, // Rule ID 7 //
73
77
// CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,
74
78
// CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_AND,
75
79
// CHECK-NEXT: // MIs[0] dst
@@ -135,6 +139,79 @@ def : Pat<
135
139
(AND_OR DOP:$src0, DOP:$src1, DOP:$src2)
136
140
>;
137
141
142
+ def mul_pat : PatFrag<
143
+ (ops node:$x, node:$y),
144
+ (mul node:$x, node:$y), [{ return foo(); }]> {
145
+ let GISelPredicateCode = [{
146
+ return doesComplexCheck(MI);
147
+ }];
148
+ let PredicateCodeUsesOperands = 1;
149
+ }
150
+
151
+ // CHECK: GIM_Try, /*On fail goto*//*Label 2*/ 293, // Rule ID 4 //
152
+ // CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,
153
+ // CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_MUL,
154
+ // CHECK-NEXT: // MIs[0] dst
155
+ // CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/0, /*Type*/GILLT_s32,
156
+ // CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/0, /*Op*/0, /*RC*/Test::DRegsRegClassID,
157
+ // CHECK-NEXT: // MIs[0] Operand 1
158
+ // CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/1, /*Type*/GILLT_s32,
159
+ // CHECK-NEXT: GIM_RecordNamedOperand, /*MI*/0, /*Op*/1, /*StoreIdx*/0, // Name : pred:4:x
160
+ // CHECK-NEXT: GIM_RecordInsn, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]
161
+ // CHECK-NEXT: GIM_CheckNumOperands, /*MI*/1, /*Expected*/3,
162
+ // CHECK-NEXT: GIM_CheckOpcode, /*MI*/1, TargetOpcode::G_OR,
163
+ // CHECK-NEXT: // MIs[1] Operand 0
164
+ // CHECK-NEXT: GIM_CheckType, /*MI*/1, /*Op*/0, /*Type*/GILLT_s32,
165
+ // CHECK-NEXT: // MIs[1] src0
166
+ // CHECK-NEXT: GIM_CheckType, /*MI*/1, /*Op*/1, /*Type*/GILLT_s32,
167
+ // CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/1, /*Op*/1, /*RC*/Test::DRegsRegClassID,
168
+ // CHECK-NEXT: // MIs[1] src1
169
+ // CHECK-NEXT: GIM_CheckType, /*MI*/1, /*Op*/2, /*Type*/GILLT_s32,
170
+ // CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/1, /*Op*/2, /*RC*/Test::DRegsRegClassID,
171
+ // CHECK-NEXT: // MIs[0] src2
172
+ // CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/2, /*Type*/GILLT_s32,
173
+ // CHECK-NEXT: GIM_RecordNamedOperand, /*MI*/0, /*Op*/2, /*StoreIdx*/1, // Name : pred:4:y
174
+ // CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/0, /*Op*/2, /*RC*/Test::DRegsRegClassID,
175
+ // CHECK-NEXT: GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GICXXPred_MI_Predicate_mul_pat,
176
+ // CHECK-NEXT: GIM_CheckIsSafeToFold, /*InsnID*/1,
177
+ // CHECK-NEXT: // (mul:{ *:[i32] } (or:{ *:[i32] } DOP:{ *:[i32] }:$src0, DOP:{ *:[i32] }:$src1):$pred:4:x, DOP:{ *:[i32] }:$src2:$pred:4:y)<<P:4:Predicate_mul_pat>> => (MUL_OR:{ *:[i32] } DOP:{ *:[i32] }:$src0, DOP:{ *:[i32] }:$src1, DOP:{ *:[i32] }:$src2)
178
+ // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::MUL_OR,
179
+
180
+ // CHECK: GIM_Try, /*On fail goto*//*Label 3*/ 388, // Rule ID 8 //
181
+ // CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,
182
+ // CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_MUL,
183
+ // CHECK-NEXT: // MIs[0] dst
184
+ // CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/0, /*Type*/GILLT_s32,
185
+ // CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/0, /*Op*/0, /*RC*/Test::DRegsRegClassID,
186
+ // CHECK-NEXT: // MIs[0] src2
187
+ // CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/1, /*Type*/GILLT_s32,
188
+ // CHECK-NEXT: GIM_RecordNamedOperand, /*MI*/0, /*Op*/1, /*StoreIdx*/1, // Name : pred:4:y
189
+ // CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/0, /*Op*/1, /*RC*/Test::DRegsRegClassID,
190
+ // CHECK-NEXT: // MIs[0] Operand 2
191
+ // CHECK-NEXT: GIM_CheckType, /*MI*/0, /*Op*/2, /*Type*/GILLT_s32,
192
+ // CHECK-NEXT: GIM_RecordNamedOperand, /*MI*/0, /*Op*/2, /*StoreIdx*/0, // Name : pred:4:x
193
+ // CHECK-NEXT: GIM_RecordInsn, /*DefineMI*/1, /*MI*/0, /*OpIdx*/2, // MIs[1]
194
+ // CHECK-NEXT: GIM_CheckNumOperands, /*MI*/1, /*Expected*/3,
195
+ // CHECK-NEXT: GIM_CheckOpcode, /*MI*/1, TargetOpcode::G_OR,
196
+ // CHECK-NEXT: // MIs[1] Operand 0
197
+ // CHECK-NEXT: GIM_CheckType, /*MI*/1, /*Op*/0, /*Type*/GILLT_s32,
198
+ // CHECK-NEXT: // MIs[1] src0
199
+ // CHECK-NEXT: GIM_CheckType, /*MI*/1, /*Op*/1, /*Type*/GILLT_s32,
200
+ // CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/1, /*Op*/1, /*RC*/Test::DRegsRegClassID,
201
+ // CHECK-NEXT: // MIs[1] src1
202
+ // CHECK-NEXT: GIM_CheckType, /*MI*/1, /*Op*/2, /*Type*/GILLT_s32,
203
+ // CHECK-NEXT: GIM_CheckRegBankForClass, /*MI*/1, /*Op*/2, /*RC*/Test::DRegsRegClassID,
204
+ // CHECK-NEXT: GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GICXXPred_MI_Predicate_mul_pat,
205
+ // CHECK-NEXT: GIM_CheckIsSafeToFold, /*InsnID*/1,
206
+ // CHECK-NEXT: // (mul:{ *:[i32] } DOP:{ *:[i32] }:$src2:$pred:4:y, (or:{ *:[i32] } DOP:{ *:[i32] }:$src0, DOP:{ *:[i32] }:$src1):$pred:4:x)<<P:4:Predicate_mul_pat>> => (MUL_OR:{ *:[i32] } DOP:{ *:[i32] }:$src0, DOP:{ *:[i32] }:$src1, DOP:{ *:[i32] }:$src2)
207
+ // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::MUL_OR,
208
+
209
+ // Test commutative patterns where named operands in the source pattern are not
210
+ // directly bound to PatFrag's operands.
211
+ def : Pat<
212
+ (i32 (mul_pat (or DOP:$src0, DOP:$src1), DOP:$src2)),
213
+ (MUL_OR DOP:$src0, DOP:$src1, DOP:$src2)
214
+ >;
138
215
139
216
def sub3_pat : PatFrag<
140
217
(ops node:$x, node:$y, node:$z),
@@ -146,7 +223,7 @@ def sub3_pat : PatFrag<
146
223
let PredicateCodeUsesOperands = 1;
147
224
}
148
225
149
- // CHECK: GIM_Try, /*On fail goto*//*Label 2 */ 285 , // Rule ID 0 //
226
+ // CHECK: GIM_Try, /*On fail goto*//*Label 4 */ 475 , // Rule ID 0 //
150
227
// CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,
151
228
// CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_SUB,
152
229
// CHECK-NEXT: // MIs[0] dst
@@ -192,16 +269,16 @@ def patfrags_test_pat : PatFrags<
192
269
let PredicateCodeUsesOperands = 1;
193
270
}
194
271
195
- // CHECK: GIM_Try, /*On fail goto*//*Label 3 */ 372 , // Rule ID 1 //
272
+ // CHECK: GIM_Try, /*On fail goto*//*Label 5 */ 562 , // Rule ID 1 //
196
273
// CHECK: // (xor:{ *:[i32] } (add:{ *:[i32] } i32:{ *:[i32] }:$src0:$pred:2:x, i32:{ *:[i32] }:$src1:$pred:2:y), i32:{ *:[i32] }:$src2:$pred:2:z)<<P:2:Predicate_patfrags_test_pat>> => (PATFRAGS:{ *:[i32] } i32:{ *:[i32] }:$src0, i32:{ *:[i32] }:$src1, i32:{ *:[i32] }:$src2)
197
274
198
- // CHECK: GIM_Try, /*On fail goto*//*Label 4 */ 459 , // Rule ID 2 //
275
+ // CHECK: GIM_Try, /*On fail goto*//*Label 6 */ 649 , // Rule ID 2 //
199
276
// CHECK: // (xor:{ *:[i32] } (sub:{ *:[i32] } i32:{ *:[i32] }:$src0:$pred:2:x, i32:{ *:[i32] }:$src1:$pred:2:y), i32:{ *:[i32] }:$src2:$pred:2:z)<<P:2:Predicate_patfrags_test_pat>> => (PATFRAGS:{ *:[i32] } i32:{ *:[i32] }:$src0, i32:{ *:[i32] }:$src1, i32:{ *:[i32] }:$src2)
200
277
201
- // CHECK: GIM_Try, /*On fail goto*//*Label 5 */ 546 , // Rule ID 4 //
278
+ // CHECK: GIM_Try, /*On fail goto*//*Label 7 */ 736 , // Rule ID 5 //
202
279
// CHECK: // (xor:{ *:[i32] } i32:{ *:[i32] }:$src2:$pred:2:z, (add:{ *:[i32] } i32:{ *:[i32] }:$src0:$pred:2:x, i32:{ *:[i32] }:$src1:$pred:2:y))<<P:2:Predicate_patfrags_test_pat>> => (PATFRAGS:{ *:[i32] } i32:{ *:[i32] }:$src0, i32:{ *:[i32] }:$src1, i32:{ *:[i32] }:$src2)
203
280
204
- // CHECK: GIM_Try, /*On fail goto*//*Label 6 */ 633 , // Rule ID 5 //
281
+ // CHECK: GIM_Try, /*On fail goto*//*Label 8 */ 823 , // Rule ID 6 //
205
282
// CHECK: // (xor:{ *:[i32] } i32:{ *:[i32] }:$src2:$pred:2:z, (sub:{ *:[i32] } i32:{ *:[i32] }:$src0:$pred:2:x, i32:{ *:[i32] }:$src1:$pred:2:y))<<P:2:Predicate_patfrags_test_pat>> => (PATFRAGS:{ *:[i32] } i32:{ *:[i32] }:$src0, i32:{ *:[i32] }:$src1, i32:{ *:[i32] }:$src2)
206
283
207
284
0 commit comments