@@ -34,6 +34,11 @@ let Namespace = "Test" in {
34
34
def Inst0 : TestInst<0>;
35
35
def Inst1 : TestInst<1>;
36
36
37
+ def BothFusionPredicate: BothFusionPredicateWithMCInstPredicate<CheckRegOperand<0, X0>>;
38
+ def TestBothFusionPredicate: Fusion<"test-both-fusion-predicate", "HasBothFusionPredicate",
39
+ "Test BothFusionPredicate",
40
+ [BothFusionPredicate]>;
41
+
37
42
def TestFusion: SimpleFusion<"test-fusion", "HasTestFusion", "Test Fusion",
38
43
CheckOpcode<[Inst0]>,
39
44
CheckAll<[
@@ -45,6 +50,7 @@ def TestFusion: SimpleFusion<"test-fusion", "HasTestFusion", "Test Fusion",
45
50
// CHECK-PREDICATOR-NEXT: #undef GET_Test_MACRO_FUSION_PRED_DECL
46
51
// CHECK-PREDICATOR-EMPTY:
47
52
// CHECK-PREDICATOR-NEXT: namespace llvm {
53
+ // CHECK-PREDICATOR-NEXT: bool isTestBothFusionPredicate(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
48
54
// CHECK-PREDICATOR-NEXT: bool isTestFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
49
55
// CHECK-PREDICATOR-NEXT: } // end namespace llvm
50
56
// CHECK-PREDICATOR-EMPTY:
@@ -54,6 +60,24 @@ def TestFusion: SimpleFusion<"test-fusion", "HasTestFusion", "Test Fusion",
54
60
// CHECK-PREDICATOR-NEXT: #undef GET_Test_MACRO_FUSION_PRED_IMPL
55
61
// CHECK-PREDICATOR-EMPTY:
56
62
// 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: }
57
81
// CHECK-PREDICATOR-NEXT: bool isTestFusion(
58
82
// CHECK-PREDICATOR-NEXT: const TargetInstrInfo &TII,
59
83
// CHECK-PREDICATOR-NEXT: const TargetSubtargetInfo &STI,
@@ -106,6 +130,7 @@ def TestFusion: SimpleFusion<"test-fusion", "HasTestFusion", "Test Fusion",
106
130
107
131
// CHECK-SUBTARGET: std::vector<MacroFusionPredTy> TestGenSubtargetInfo::getMacroFusions() const {
108
132
// CHECK-SUBTARGET-NEXT: std::vector<MacroFusionPredTy> Fusions;
133
+ // CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestBothFusionPredicate)) Fusions.push_back(llvm::isTestBothFusionPredicate);
109
134
// CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestFusion)) Fusions.push_back(llvm::isTestFusion);
110
135
// CHECK-SUBTARGET-NEXT: return Fusions;
111
136
// CHECK-SUBTARGET-NEXT: }
0 commit comments