brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.9 KiB · 2dd9286 Raw
291 lines · plain
1// RUN: llvm-tblgen %s -gen-global-isel -optimize-match-table=false -I %p/../../../include -I %p/../Common | FileCheck %s2 3// Verify that all MI predicates are enumerated.4//5// CHECK: // PatFrag predicates.6// CHECK-NEXT: enum {7// CHECK-NEXT:   GICXXPred_MI_Predicate_and_or_pat = GICXXPred_Invalid + 1,8// CHECK-NEXT:   GICXXPred_MI_Predicate_mul_pat,9// CHECK-NEXT:   GICXXPred_MI_Predicate_or_disjoint,10// CHECK-NEXT:   GICXXPred_MI_Predicate_or_oneuse,11// CHECK-NEXT:   GICXXPred_MI_Predicate_patfrags_test_pat,12// CHECK-NEXT:   GICXXPred_MI_Predicate_sub3_pat,13// CHECK-NEXT: };14 15// Verify that we emit cases for all MI predicates.16//17// CHECK: bool MyTargetInstructionSelector::testMIPredicate_MI(18// CHECK:    case GICXXPred_MI_Predicate_and_or_pat: {19// CHECK:      return doesComplexCheck(MI);20// CHECK:    case GICXXPred_MI_Predicate_mul_pat: {21// CHECK:      return doesComplexCheck(MI);22// CHECK:    case GICXXPred_MI_Predicate_or_oneuse: {23// CHECK:      return MRI.hasOneNonDBGUse(MI.getOperand(0).getReg());24// CHECK:    case GICXXPred_MI_Predicate_patfrags_test_pat: {25// CHECK:      return doesComplexCheck(MI);26// CHECK:    case GICXXPred_MI_Predicate_sub3_pat: {27// CHECK:      return doesComplexCheck(MI);28 29include "llvm/Target/Target.td"30include "GlobalISelEmitterCommon.td"31 32// Boilerplate code for setting up some registers with subregs.33class MyReg<string n, list<Register> subregs = []>34  : Register<n> {35  let SubRegs = subregs;36}37 38class MyClass<int size, list<ValueType> types, dag registers>39  : RegisterClass<"Test", types, size, registers> {40  let Size = size;41}42 43def sub0 : SubRegIndex<16>;44def sub1 : SubRegIndex<16, 16>;45def S0 : MyReg<"s0">;46def S1 : MyReg<"s1">;47def SRegs : MyClass<16, [i16], (sequence "S%u", 0, 1)>;48 49let SubRegIndices = [sub0, sub1] in {50def D0 : MyReg<"d0", [S0, S1]>;51}52 53def DRegs : MyClass<32, [i32], (sequence "D%u", 0, 0)>;54def DOP : RegisterOperand<DRegs>;55def AND_OR : I<(outs DRegs:$dst), (ins DOP:$src0, DOP:$src1, DOP:$src2), []>;56def MUL_OR : I<(outs DRegs:$dst), (ins DOP:$src0, DOP:$src1, DOP:$src2), []>;57 58def or_oneuse : PatFrag<59  (ops node:$x, node:$y),60  (or node:$x, node:$y), [{ return foo(); }]> {61  let GISelPredicateCode = [{62    return MRI.hasOneNonDBGUse(MI.getOperand(0).getReg());63  }];64}65 66 67// FIXME: GISelPredicateCode ignored if DAG predicate not set.68def and_or_pat : PatFrag<69  (ops node:$x, node:$y, node:$z),70  (and (or node:$x, node:$y), node:$z), [{ return foo(); }]> {71  let GISelPredicateCode = [{72    return doesComplexCheck(MI);73  }];74  let PredicateCodeUsesOperands = 1;75}76 77// CHECK:      GIM_Try, /*On fail goto*//*Label 0*/ GIMT_Encode4(97), // Rule ID 7 //78// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,79// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_AND),80// CHECK-NEXT:   // MIs[0] DstI[dst]81// CHECK-NEXT:   GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s32,82// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),83// CHECK-NEXT:   // MIs[0] src284// CHECK-NEXT:   GIM_RootCheckType, /*Op*/1, /*Type*/GILLT_s32,85// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/0, /*Op*/1, /*StoreIdx*/2, // Name : pred:3:z86// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),87// CHECK-NEXT:   // MIs[0] Operand 288// CHECK-NEXT:   GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32,89// CHECK-NEXT:   GIM_RecordInsn, /*DefineMI*/1, /*MI*/0, /*OpIdx*/2, // MIs[1]90// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/1, /*Expected*/3,91// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_OR),92// CHECK-NEXT:   // MIs[1] Operand 093// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/0, /*Type*/GILLT_s32,94// CHECK-NEXT:   // MIs[1] src095// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/1, /*Type*/GILLT_s32,96// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/1, /*Op*/1, /*StoreIdx*/0, // Name : pred:3:x97// CHECK-NEXT:   GIM_CheckRegBankForClass, /*MI*/1, /*Op*/1, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),98// CHECK-NEXT:   // MIs[1] src199// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/2, /*Type*/GILLT_s32,100// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/1, /*Op*/2, /*StoreIdx*/1, // Name : pred:3:y101// CHECK-NEXT:   GIM_CheckRegBankForClass, /*MI*/1, /*Op*/2, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),102// CHECK-NEXT:   GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_and_or_pat),103// CHECK-NEXT:   GIM_CheckIsSafeToFold, /*NumInsns*/1,104// CHECK-NEXT:   // (and:{ *:[i32] } DOP:{ *:[i32] }:$src2:$pred:3:z, (or:{ *:[i32] } DOP:{ *:[i32] }:$src0:$pred:3:x, DOP:{ *:[i32] }:$src1:$pred:3:y))<<P:3:Predicate_and_or_pat>>  =>  (AND_OR:{ *:[i32] } DOP:{ *:[i32] }:$src0, DOP:{ *:[i32] }:$src1, DOP:{ *:[i32] }:$src2)105// CHECK-NEXT:   GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::AND_OR),106 107// CHECK:      GIM_Try, /*On fail goto*//*Label 1*/ GIMT_Encode4(194), // Rule ID 3 //108// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,109// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_AND),110// CHECK-NEXT:   // MIs[0] DstI[dst]111// CHECK-NEXT:   GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s32,112// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),113// CHECK-NEXT:   // MIs[0] Operand 1114// CHECK-NEXT:   GIM_RootCheckType, /*Op*/1, /*Type*/GILLT_s32,115// CHECK-NEXT:   GIM_RecordInsn, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]116// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/1, /*Expected*/3,117// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_OR),118// CHECK-NEXT:   // MIs[1] Operand 0119// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/0, /*Type*/GILLT_s32,120// CHECK-NEXT:   // MIs[1] src0121// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/1, /*Type*/GILLT_s32,122// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/1, /*Op*/1, /*StoreIdx*/0, // Name : pred:3:x123// CHECK-NEXT:   GIM_CheckRegBankForClass, /*MI*/1, /*Op*/1, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),124// CHECK-NEXT:   // MIs[1] src1125// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/2, /*Type*/GILLT_s32,126// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/1, /*Op*/2, /*StoreIdx*/1, // Name : pred:3:y127// CHECK-NEXT:   GIM_CheckRegBankForClass, /*MI*/1, /*Op*/2, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),128// CHECK-NEXT:   // MIs[0] src2129// CHECK-NEXT:   GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32,130// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/0, /*Op*/2, /*StoreIdx*/2, // Name : pred:3:z131// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/2, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),132// CHECK-NEXT:   GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_and_or_pat),133// CHECK-NEXT:   GIM_CheckIsSafeToFold, /*NumInsns*/1,134// CHECK-NEXT:   // (and:{ *:[i32] } (or:{ *:[i32] } DOP:{ *:[i32] }:$src0:$pred:3:x, DOP:{ *:[i32] }:$src1:$pred:3:y), DOP:{ *:[i32] }:$src2:$pred:3:z)<<P:3:Predicate_and_or_pat>>  =>  (AND_OR:{ *:[i32] } DOP:{ *:[i32] }:$src0, DOP:{ *:[i32] }:$src1, DOP:{ *:[i32] }:$src2)135// CHECK-NEXT:   GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::AND_OR),136 137// Test commutative, standalone pattern.138def : Pat<139  (i32 (and_or_pat DOP:$src0, DOP:$src1, DOP:$src2)),140  (AND_OR DOP:$src0, DOP:$src1, DOP:$src2)141>;142 143def mul_pat : PatFrag<144  (ops node:$x, node:$y),145  (mul node:$x, node:$y), [{ return foo(); }]> {146  let GISelPredicateCode = [{147    return doesComplexCheck(MI);148  }];149  let PredicateCodeUsesOperands = 1;150}151 152// CHECK:      GIM_Try, /*On fail goto*//*Label 2*/ GIMT_Encode4(287), // Rule ID 4 //153// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,154// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_MUL),155// CHECK-NEXT:   // MIs[0] DstI[dst]156// CHECK-NEXT:   GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s32,157// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),158// CHECK-NEXT:   // MIs[0] Operand 1159// CHECK-NEXT:   GIM_RootCheckType, /*Op*/1, /*Type*/GILLT_s32,160// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/0, /*Op*/1, /*StoreIdx*/0, // Name : pred:4:x161// CHECK-NEXT:   GIM_RecordInsn, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]162// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/1, /*Expected*/3,163// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_OR),164// CHECK-NEXT:   // MIs[1] Operand 0165// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/0, /*Type*/GILLT_s32,166// CHECK-NEXT:   // MIs[1] src0167// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/1, /*Type*/GILLT_s32,168// CHECK-NEXT:   GIM_CheckRegBankForClass, /*MI*/1, /*Op*/1, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),169// CHECK-NEXT:   // MIs[1] src1170// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/2, /*Type*/GILLT_s32,171// CHECK-NEXT:   GIM_CheckRegBankForClass, /*MI*/1, /*Op*/2, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),172// CHECK-NEXT:   // MIs[0] src2173// CHECK-NEXT:   GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32,174// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/0, /*Op*/2, /*StoreIdx*/1, // Name : pred:4:y175// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/2, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),176// CHECK-NEXT:   GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_mul_pat),177// CHECK-NEXT:   GIM_CheckIsSafeToFold, /*NumInsns*/1,178// 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)179// CHECK-NEXT:   GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::MUL_OR),180 181// CHECK:      GIM_Try, /*On fail goto*//*Label 3*/ GIMT_Encode4(380), // Rule ID 8 //182// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,183// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_MUL),184// CHECK-NEXT:   // MIs[0] DstI[dst]185// CHECK-NEXT:   GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s32,186// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),187// CHECK-NEXT:   // MIs[0] src2188// CHECK-NEXT:   GIM_RootCheckType, /*Op*/1, /*Type*/GILLT_s32,189// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/0, /*Op*/1, /*StoreIdx*/1, // Name : pred:4:y190// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),191// CHECK-NEXT:   // MIs[0] Operand 2192// CHECK-NEXT:   GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32,193// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/0, /*Op*/2, /*StoreIdx*/0, // Name : pred:4:x194// CHECK-NEXT:   GIM_RecordInsn, /*DefineMI*/1, /*MI*/0, /*OpIdx*/2, // MIs[1]195// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/1, /*Expected*/3,196// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_OR),197// CHECK-NEXT:   // MIs[1] Operand 0198// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/0, /*Type*/GILLT_s32,199// CHECK-NEXT:   // MIs[1] src0200// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/1, /*Type*/GILLT_s32,201// CHECK-NEXT:   GIM_CheckRegBankForClass, /*MI*/1, /*Op*/1, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),202// CHECK-NEXT:   // MIs[1] src1203// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/2, /*Type*/GILLT_s32,204// CHECK-NEXT:   GIM_CheckRegBankForClass, /*MI*/1, /*Op*/2, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),205// CHECK-NEXT:   GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_mul_pat),206// CHECK-NEXT:   GIM_CheckIsSafeToFold, /*NumInsns*/1,207// 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)208// CHECK-NEXT:   GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::MUL_OR),209 210// Test commutative patterns where named operands in the source pattern are not211// directly bound to PatFrag's operands.212def : Pat<213  (i32 (mul_pat (or DOP:$src0, DOP:$src1), DOP:$src2)),214  (MUL_OR DOP:$src0, DOP:$src1, DOP:$src2)215>;216 217def sub3_pat : PatFrag<218  (ops node:$x, node:$y, node:$z),219  (sub (sub node:$x, node:$y), node:$z), [{ return foo(); }]> {220  let GISelPredicateCode = [{221    return doesComplexCheck(MI);222  }];223 224  let PredicateCodeUsesOperands = 1;225}226 227// CHECK:      GIM_Try, /*On fail goto*//*Label 4*/ GIMT_Encode4(463), // Rule ID 0 //228// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/0, /*Expected*/3,229// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_SUB),230// CHECK-NEXT:   // MIs[0] DstI[dst]231// CHECK-NEXT:   GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s32,232// CHECK-NEXT:   GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(Test::DRegsRegClassID),233// CHECK-NEXT:   // MIs[0] Operand 1234// CHECK-NEXT:   GIM_RootCheckType, /*Op*/1, /*Type*/GILLT_s32,235// CHECK-NEXT:   GIM_RecordInsn, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1]236// CHECK-NEXT:   GIM_CheckNumOperands, /*MI*/1, /*Expected*/3,237// CHECK-NEXT:   GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_SUB),238// CHECK-NEXT:   // MIs[1] Operand 0239// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/0, /*Type*/GILLT_s32,240// CHECK-NEXT:   // MIs[1] src0241// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/1, /*Type*/GILLT_s32,242// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/1, /*Op*/1, /*StoreIdx*/0, // Name : pred:1:x243// CHECK-NEXT:   // MIs[1] src1244// CHECK-NEXT:   GIM_CheckType, /*MI*/1, /*Op*/2, /*Type*/GILLT_s32,245// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/1, /*Op*/2, /*StoreIdx*/1, // Name : pred:1:y246// CHECK-NEXT:   // MIs[0] src2247// CHECK-NEXT:   GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32,248// CHECK-NEXT:   GIM_RecordNamedOperand, /*MI*/0, /*Op*/2, /*StoreIdx*/2, // Name : pred:1:z249// CHECK-NEXT:   GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_sub3_pat),250// CHECK-NEXT:   GIM_CheckIsSafeToFold, /*NumInsns*/1,251// CHECK-NEXT:   // (sub:{ *:[i32] } (sub:{ *:[i32] } i32:{ *:[i32] }:$src0:$pred:1:x, i32:{ *:[i32] }:$src1:$pred:1:y), i32:{ *:[i32] }:$src2:$pred:1:z)<<P:1:Predicate_sub3_pat>>  =>  (SUB3:{ *:[i32] } i32:{ *:[i32] }:$src0, i32:{ *:[i32] }:$src1, i32:{ *:[i32] }:$src2)252// CHECK-NEXT:   GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::SUB3)253 254// Test a non-commutative pattern.255def SUB3 : I<(outs DRegs:$dst),256  (ins DOP:$src0, DOP:$src1, DOP:$src2),257  [(set DRegs:$dst, (sub3_pat i32:$src0, i32:$src1, i32:$src2))]258>;259 260 261def patfrags_test_pat : PatFrags<262  (ops node:$x, node:$y, node:$z),263  [ (xor (add node:$x, node:$y), node:$z),264    (xor (sub node:$x, node:$y), node:$z)265  ], [{ return foo(); }]> {266  let GISelPredicateCode = [{267    return doesComplexCheck(MI);268  }];269 270  let PredicateCodeUsesOperands = 1;271}272 273// CHECK: GIM_Try, /*On fail goto*//*Label 5*/ GIMT_Encode4(546), // Rule ID 1 //274// 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)275 276// CHECK: GIM_Try, /*On fail goto*//*Label 6*/ GIMT_Encode4(629), // Rule ID 2 //277// 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)278 279// CHECK: GIM_Try, /*On fail goto*//*Label 7*/ GIMT_Encode4(712), // Rule ID 5 //280// 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)281 282// CHECK: GIM_Try, /*On fail goto*//*Label 8*/ GIMT_Encode4(795), // Rule ID 6 //283// 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)284 285 286// Test a commutative pattern using multiple patterns using PatFrags.287def PATFRAGS : I<(outs DRegs:$dst),288  (ins DOP:$src0, DOP:$src1, DOP:$src2),289  [(set DRegs:$dst, (patfrags_test_pat i32:$src0, i32:$src1, i32:$src2))]290>;291