167 lines · plain
1// RUN: llvm-tblgen -I %p/../../../include -gen-global-isel-combiner \2// RUN: -combiners=MyCombiner %s | \3// RUN: FileCheck %s4 5include "llvm/Target/Target.td"6include "llvm/Target/GlobalISel/Combine.td"7 8def MyTargetISA : InstrInfo;9def MyTarget : Target { let InstructionSet = MyTargetISA; }10 11def OneMatchOneApply : GICombineRule<12 (defs root:$a),13 (match (G_FABS $a, $b), "return MATCH0;"),14 (apply "APPLY0")>;15 16def TwoMatchTwoApply : GICombineRule<17 (defs root:$a),18 (match (G_FNEG $a, $b), "return MATCH0;", "return MATCH1;"),19 (apply "APPLY0", "APPLY1")>;20 21def TwoMatchNoApply : GICombineRule<22 (defs root:$a),23 (match (G_STORE $x, $y):$a, "return MATCH0;", "return MATCH1;"),24 (apply (GIEraseRoot))>;25 26def NoMatchTwoApply : GICombineRule<27 (defs root:$a),28 (match (G_SEXT $a, $y)),29 (apply "APPLY0", "APPLY1")>;30 31def CombineCXXOrder : GICombineRule<32 (defs root:$a),33 (combine (G_ZEXT $a, $y), "A0", "return A1")>;34 35def MyCombiner: GICombiner<"GenMyCombiner", [36 OneMatchOneApply,37 TwoMatchTwoApply,38 TwoMatchNoApply,39 NoMatchTwoApply,40 CombineCXXOrder41]>;42 43// CHECK: bool GenMyCombiner::testMIPredicate_MI(unsigned PredicateID, const MachineInstr & MI, const MatcherState &State) const {44// CHECK-NEXT: switch (PredicateID) {45// CHECK-NEXT: case GICXXPred_MI_Predicate_GICombiner0: {46// CHECK-NEXT: return MATCH0;47// CHECK-NEXT: }48// CHECK-NEXT: case GICXXPred_MI_Predicate_GICombiner1: {49// CHECK-NEXT: return MATCH1;50// CHECK-NEXT: }51// CHECK-NEXT: }52// CHECK-NEXT: llvm_unreachable("Unknown predicate");53// CHECK-NEXT: return false;54// CHECK-NEXT: }55 56// CHECK: bool GenMyCombiner::runCustomAction(unsigned ApplyID, const MatcherState &State, NewMIVector &OutMIs) const {57// CHECK-NEXT: Helper.getBuilder().setInstrAndDebugLoc(*State.MIs[0]);58// CHECK-NEXT: switch(ApplyID) {59// CHECK-NEXT: case GICXXCustomAction_GICombiner0:{60// CHECK-NEXT: // Match Patterns61// CHECK-NEXT: if(![&](){return MATCH0;}()) {62// CHECK-NEXT: return false;63// CHECK-NEXT: }64// CHECK-NEXT: // Apply Patterns65// CHECK-NEXT: APPLY066// CHECK-NEXT: return true;67// CHECK-NEXT: }68// CHECK-NEXT: case GICXXCustomAction_GICombiner1:{69// CHECK-NEXT: // Match Patterns70// CHECK-NEXT: if(![&](){return MATCH0;}()) {71// CHECK-NEXT: return false;72// CHECK-NEXT: }73// CHECK-NEXT: if(![&](){return MATCH1;}()) {74// CHECK-NEXT: return false;75// CHECK-NEXT: }76// CHECK-NEXT: // Apply Patterns77// CHECK-NEXT: APPLY078// CHECK-NEXT: APPLY179// CHECK-NEXT: return true;80// CHECK-NEXT: }81// CHECK-NEXT: case GICXXCustomAction_GICombiner2:{82// CHECK-NEXT: // Apply Patterns83// CHECK-NEXT: APPLY084// CHECK-NEXT: APPLY185// CHECK-NEXT: return true;86// CHECK-NEXT: }87// CHECK-NEXT: case GICXXCustomAction_GICombiner3:{88// CHECK-NEXT: // Apply Patterns89// CHECK-NEXT: A090// CHECK-NEXT: return A191// CHECK-NEXT: return true;92// CHECK-NEXT: }93// CHECK-NEXT: }94// CHECK-NEXT: llvm_unreachable("Unknown Apply Action");95// CHECK-NEXT: }96 97// CHECK: const uint8_t *GenMyCombiner::getMatchTable() const {98// CHECK-NEXT: constexpr static uint8_t MatchTable0[] = {99// CHECK-NEXT: /* 0 */ GIM_SwitchOpcode, /*MI*/0, /*[*/GIMT_Encode2(104), GIMT_Encode2(216), /*)*//*default:*//*Label 5*/ GIMT_Encode4(524),100// CHECK-NEXT: /* 10 */ /*TargetOpcode::G_STORE*//*Label 0*/ GIMT_Encode4(458), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),101// CHECK-NEXT: /* 182 */ /*TargetOpcode::G_SEXT*//*Label 1*/ GIMT_Encode4(476), GIMT_Encode4(0),102// CHECK-NEXT: /* 190 */ /*TargetOpcode::G_ZEXT*//*Label 2*/ GIMT_Encode4(488), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),103// CHECK-NEXT: /* 418 */ /*TargetOpcode::G_FNEG*//*Label 3*/ GIMT_Encode4(500), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0),104// CHECK-NEXT: /* 454 */ /*TargetOpcode::G_FABS*//*Label 4*/ GIMT_Encode4(512),105// CHECK-NEXT: /* 458 */ // Label 0: @458106// CHECK-NEXT: /* 458 */ GIM_Try, /*On fail goto*//*Label 6*/ GIMT_Encode4(475), // Rule ID 2 //107// CHECK-NEXT: /* 463 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule2Enabled),108// CHECK-NEXT: /* 466 */ // MIs[0] x109// CHECK-NEXT: /* 466 */ // No operand predicates110// CHECK-NEXT: /* 466 */ // MIs[0] y111// CHECK-NEXT: /* 466 */ // No operand predicates112// CHECK-NEXT: /* 466 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner0),113// CHECK-NEXT: /* 470 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner1),114// CHECK-NEXT: /* 474 */ // Combiner Rule #2: TwoMatchNoApply115// CHECK-NEXT: /* 474 */ GIR_EraseRootFromParent_Done,116// CHECK-NEXT: /* 475 */ // Label 6: @475117// CHECK-NEXT: /* 475 */ GIM_Reject,118// CHECK-NEXT: /* 476 */ // Label 1: @476119// CHECK-NEXT: /* 476 */ GIM_Try, /*On fail goto*//*Label 7*/ GIMT_Encode4(487), // Rule ID 3 //120// CHECK-NEXT: /* 481 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule3Enabled),121// CHECK-NEXT: /* 484 */ // MIs[0] a122// CHECK-NEXT: /* 484 */ // No operand predicates123// CHECK-NEXT: /* 484 */ // MIs[0] y124// CHECK-NEXT: /* 484 */ // No operand predicates125// CHECK-NEXT: /* 484 */ // Combiner Rule #3: NoMatchTwoApply126// CHECK-NEXT: /* 484 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner2),127// CHECK-NEXT: /* 487 */ // Label 7: @487128// CHECK-NEXT: /* 487 */ GIM_Reject,129// CHECK-NEXT: /* 488 */ // Label 2: @488130// CHECK-NEXT: /* 488 */ GIM_Try, /*On fail goto*//*Label 8*/ GIMT_Encode4(499), // Rule ID 4 //131// CHECK-NEXT: /* 493 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule4Enabled),132// CHECK-NEXT: /* 496 */ // MIs[0] a133// CHECK-NEXT: /* 496 */ // No operand predicates134// CHECK-NEXT: /* 496 */ // MIs[0] y135// CHECK-NEXT: /* 496 */ // No operand predicates136// CHECK-NEXT: /* 496 */ // Combiner Rule #4: CombineCXXOrder137// CHECK-NEXT: /* 496 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner3),138// CHECK-NEXT: /* 499 */ // Label 8: @499139// CHECK-NEXT: /* 499 */ GIM_Reject,140// CHECK-NEXT: /* 500 */ // Label 3: @500141// CHECK-NEXT: /* 500 */ GIM_Try, /*On fail goto*//*Label 9*/ GIMT_Encode4(511), // Rule ID 1 //142// CHECK-NEXT: /* 505 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule1Enabled),143// CHECK-NEXT: /* 508 */ // MIs[0] a144// CHECK-NEXT: /* 508 */ // No operand predicates145// CHECK-NEXT: /* 508 */ // MIs[0] b146// CHECK-NEXT: /* 508 */ // No operand predicates147// CHECK-NEXT: /* 508 */ // Combiner Rule #1: TwoMatchTwoApply148// CHECK-NEXT: /* 508 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner1),149// CHECK-NEXT: /* 511 */ // Label 9: @511150// CHECK-NEXT: /* 511 */ GIM_Reject,151// CHECK-NEXT: /* 512 */ // Label 4: @512152// CHECK-NEXT: /* 512 */ GIM_Try, /*On fail goto*//*Label 10*/ GIMT_Encode4(523), // Rule ID 0 //153// CHECK-NEXT: /* 517 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled),154// CHECK-NEXT: /* 520 */ // MIs[0] a155// CHECK-NEXT: /* 520 */ // No operand predicates156// CHECK-NEXT: /* 520 */ // MIs[0] b157// CHECK-NEXT: /* 520 */ // No operand predicates158// CHECK-NEXT: /* 520 */ // Combiner Rule #0: OneMatchOneApply159// CHECK-NEXT: /* 520 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0),160// CHECK-NEXT: /* 523 */ // Label 10: @523161// CHECK-NEXT: /* 523 */ GIM_Reject,162// CHECK-NEXT: /* 524 */ // Label 5: @524163// CHECK-NEXT: /* 524 */ GIM_Reject,164// CHECK-NEXT: /* 525 */ }; // Size: 525 bytes165// CHECK-NEXT: return MatchTable0;166// CHECK-NEXT: }167