@@ -62,12 +62,19 @@ def TestSingleFusion: SingleFusion<"test-single-fusion", "HasTestSingleFusion",
6262 Inst0, Inst2,
6363 secondInstPred=CheckRegOperand<0, X0>>;
6464
65+ def TestFirstSameRegFusion: Fusion<"test-first-same-reg-fusion", "HasTestFirstSameRegFusion",
66+ "Test FirstSameReg",
67+ [FirstInstHasSameReg<0, 1>]> {
68+ bit IsCommutable = 1;
69+ }
70+
6571// CHECK-PREDICATOR: #ifdef GET_Test_MACRO_FUSION_PRED_DECL
6672// CHECK-PREDICATOR-NEXT: #undef GET_Test_MACRO_FUSION_PRED_DECL
6773// CHECK-PREDICATOR-EMPTY:
6874// CHECK-PREDICATOR-NEXT: namespace llvm {
6975// CHECK-PREDICATOR-NEXT: bool isTestBothFusionPredicate(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
70- // CHECK-PREDICATOR-NEXT: bool isTestCommutableFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
76+ // CHECK-PREDICATOR-NEXT: bool isTestCommutableFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
77+ // CHECK-PREDICATOR-NEXT: bool isTestFirstSameRegFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
7178// CHECK-PREDICATOR-NEXT: bool isTestFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
7279// CHECK-PREDICATOR-NEXT: bool isTestSingleFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
7380// CHECK-PREDICATOR-NEXT: } // end namespace llvm
@@ -144,6 +151,24 @@ def TestSingleFusion: SingleFusion<"test-single-fusion", "HasTestSingleFusion",
144151// CHECK-PREDICATOR-NEXT: }
145152// CHECK-PREDICATOR-NEXT: return true;
146153// CHECK-PREDICATOR-NEXT: }
154+ // CHECK-PREDICATOR-NEXT: bool isTestFirstSameRegFusion(
155+ // CHECK-PREDICATOR-NEXT: const TargetInstrInfo &TII,
156+ // CHECK-PREDICATOR-NEXT: const TargetSubtargetInfo &STI,
157+ // CHECK-PREDICATOR-NEXT: const MachineInstr *FirstMI,
158+ // CHECK-PREDICATOR-NEXT: const MachineInstr &SecondMI) {
159+ // CHECK-PREDICATOR-NEXT: {{[[]}}{{[[]}}maybe_unused{{[]]}}{{[]]}} auto &MRI = SecondMI.getMF()->getRegInfo();
160+ // CHECK-PREDICATOR-NEXT: if (!FirstMI->getOperand(0).getReg().isVirtual()) {
161+ // CHECK-PREDICATOR-NEXT: if (FirstMI->getOperand(0).getReg() != FirstMI->getOperand(1).getReg()) {
162+ // CHECK-PREDICATOR-NEXT: if (!FirstMI->getDesc().isCommutable())
163+ // CHECK-PREDICATOR-NEXT: return false;
164+ // CHECK-PREDICATOR-NEXT: unsigned SrcOpIdx1 = 1, SrcOpIdx2 = TargetInstrInfo::CommuteAnyOperandIndex;
165+ // CHECK-PREDICATOR-NEXT: if (TII.findCommutedOpIndices(FirstMI, SrcOpIdx1, SrcOpIdx2))
166+ // CHECK-PREDICATOR-NEXT: if (FirstMI->getOperand(0).getReg() != FirstMI->getOperand(SrcOpIdx2).getReg())
167+ // CHECK-PREDICATOR-NEXT: return false;
168+ // CHECK-PREDICATOR-NEXT: }
169+ // CHECK-PREDICATOR-NEXT: }
170+ // CHECK-PREDICATOR-NEXT: return true;
171+ // CHECK-PREDICATOR-NEXT: }
147172// CHECK-PREDICATOR-NEXT: bool isTestFusion(
148173// CHECK-PREDICATOR-NEXT: const TargetInstrInfo &TII,
149174// CHECK-PREDICATOR-NEXT: const TargetSubtargetInfo &STI,
@@ -238,6 +263,7 @@ def TestSingleFusion: SingleFusion<"test-single-fusion", "HasTestSingleFusion",
238263// Check that we have generated target subfeature.
239264// CHECK-SUBTARGET: { "test-both-fusion-predicate", "Test BothFusionPredicate", Test::TestBothFusionPredicate
240265// CHECK-SUBTARGET: { "test-commutable-fusion", "Test Commutable Fusion", Test::TestCommutableFusion
266+ // CHECK-SUBTARGET: { "test-first-same-reg-fusion", "Test FirstSameReg", Test::TestFirstSameRegFusion
241267// CHECK-SUBTARGET: { "test-fusion", "Test Fusion", Test::TestFusion
242268// CHECK-SUBTARGET: { "test-single-fusion", "Test SingleFusion", Test::TestSingleFusion
243269
@@ -246,8 +272,9 @@ def TestSingleFusion: SingleFusion<"test-single-fusion", "HasTestSingleFusion",
246272
247273// CHECK-SUBTARGET: std::vector<MacroFusionPredTy> TestGenSubtargetInfo::getMacroFusions() const {
248274// CHECK-SUBTARGET-NEXT: std::vector<MacroFusionPredTy> Fusions;
249- // CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestBothFusionPredicate)) Fusions.push_back(llvm::isTestBothFusionPredicate);
250- // CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestCommutableFusion)) Fusions.push_back(llvm::isTestCommutableFusion);
275+ // CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestBothFusionPredicate)) Fusions.push_back(llvm::isTestBothFusionPredicate);
276+ // CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestCommutableFusion)) Fusions.push_back(llvm::isTestCommutableFusion);
277+ // CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestFirstSameRegFusion)) Fusions.push_back(llvm::isTestFirstSameRegFusion);
251278// CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestFusion)) Fusions.push_back(llvm::isTestFusion);
252279// CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestSingleFusion)) Fusions.push_back(llvm::isTestSingleFusion);
253280// CHECK-SUBTARGET-NEXT: return Fusions;
0 commit comments