@@ -34,6 +34,11 @@ let Namespace = "Test" in {
3434def Inst0 : TestInst<0>;
3535def Inst1 : TestInst<1>;
3636
37+ def BothFusionPredicate: BothFusionPredicateWithMCInstPredicate<CheckRegOperand<0, X0>>;
38+ def TestBothFusionPredicate: Fusion<"test-both-fusion-predicate", "HasBothFusionPredicate",
39+ "Test BothFusionPredicate",
40+ [BothFusionPredicate]>;
41+
3742def TestFusion: SimpleFusion<"test-fusion", "HasTestFusion", "Test Fusion",
3843 CheckOpcode<[Inst0]>,
3944 CheckAll<[
@@ -45,6 +50,7 @@ def TestFusion: SimpleFusion<"test-fusion", "HasTestFusion", "Test Fusion",
4550// CHECK-PREDICATOR-NEXT: #undef GET_Test_MACRO_FUSION_PRED_DECL
4651// CHECK-PREDICATOR-EMPTY:
4752// CHECK-PREDICATOR-NEXT: namespace llvm {
53+ // CHECK-PREDICATOR-NEXT: bool isTestBothFusionPredicate(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
4854// CHECK-PREDICATOR-NEXT: bool isTestFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
4955// CHECK-PREDICATOR-NEXT: } // end namespace llvm
5056// CHECK-PREDICATOR-EMPTY:
@@ -54,6 +60,24 @@ def TestFusion: SimpleFusion<"test-fusion", "HasTestFusion", "Test Fusion",
5460// CHECK-PREDICATOR-NEXT: #undef GET_Test_MACRO_FUSION_PRED_IMPL
5561// CHECK-PREDICATOR-EMPTY:
5662// CHECK-PREDICATOR-NEXT: namespace llvm {
63+ // CHECK-PREDICATOR-NEXT: bool isTestBothFusionPredicate(
64+ // CHECK-PREDICATOR-NEXT: const TargetInstrInfo &TII,
65+ // CHECK-PREDICATOR-NEXT: const TargetSubtargetInfo &STI,
66+ // CHECK-PREDICATOR-NEXT: const MachineInstr *FirstMI,
67+ // CHECK-PREDICATOR-NEXT: const MachineInstr &SecondMI) {
68+ // CHECK-PREDICATOR-NEXT: auto &MRI = SecondMI.getMF()->getRegInfo();
69+ // CHECK-PREDICATOR-NEXT: {
70+ // CHECK-PREDICATOR-NEXT: const MachineInstr *MI = FirstMI;
71+ // CHECK-PREDICATOR-NEXT: if (MI->getOperand(0).getReg() != Test::X0)
72+ // CHECK-PREDICATOR-NEXT: return false;
73+ // CHECK-PREDICATOR-NEXT: }
74+ // CHECK-PREDICATOR-NEXT: {
75+ // CHECK-PREDICATOR-NEXT: const MachineInstr *MI = &SecondMI;
76+ // CHECK-PREDICATOR-NEXT: if (MI->getOperand(0).getReg() != Test::X0)
77+ // CHECK-PREDICATOR-NEXT: return false;
78+ // CHECK-PREDICATOR-NEXT: }
79+ // CHECK-PREDICATOR-NEXT: return true;
80+ // CHECK-PREDICATOR-NEXT: }
5781// CHECK-PREDICATOR-NEXT: bool isTestFusion(
5882// CHECK-PREDICATOR-NEXT: const TargetInstrInfo &TII,
5983// CHECK-PREDICATOR-NEXT: const TargetSubtargetInfo &STI,
@@ -106,6 +130,7 @@ def TestFusion: SimpleFusion<"test-fusion", "HasTestFusion", "Test Fusion",
106130
107131// CHECK-SUBTARGET: std::vector<MacroFusionPredTy> TestGenSubtargetInfo::getMacroFusions() const {
108132// CHECK-SUBTARGET-NEXT: std::vector<MacroFusionPredTy> Fusions;
133+ // CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestBothFusionPredicate)) Fusions.push_back(llvm::isTestBothFusionPredicate);
109134// CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestFusion)) Fusions.push_back(llvm::isTestFusion);
110135// CHECK-SUBTARGET-NEXT: return Fusions;
111136// CHECK-SUBTARGET-NEXT: }
0 commit comments