@@ -62,12 +62,19 @@ def TestSingleFusion: SingleFusion<"test-single-fusion", "HasTestSingleFusion",
62
62
Inst0, Inst2,
63
63
secondInstPred=CheckRegOperand<0, X0>>;
64
64
65
+ def TestFirstSameRegFusion: Fusion<"test-first-same-reg-fusion", "HasTestFirstSameRegFusion",
66
+ "Test FirstSameReg",
67
+ [FirstInstHasSameReg<0, 1>]> {
68
+ bit IsCommutable = 1;
69
+ }
70
+
65
71
// CHECK-PREDICATOR: #ifdef GET_Test_MACRO_FUSION_PRED_DECL
66
72
// CHECK-PREDICATOR-NEXT: #undef GET_Test_MACRO_FUSION_PRED_DECL
67
73
// CHECK-PREDICATOR-EMPTY:
68
74
// CHECK-PREDICATOR-NEXT: namespace llvm {
69
75
// 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 &);
71
78
// CHECK-PREDICATOR-NEXT: bool isTestFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
72
79
// CHECK-PREDICATOR-NEXT: bool isTestSingleFusion(const TargetInstrInfo &, const TargetSubtargetInfo &, const MachineInstr *, const MachineInstr &);
73
80
// CHECK-PREDICATOR-NEXT: } // end namespace llvm
@@ -144,6 +151,24 @@ def TestSingleFusion: SingleFusion<"test-single-fusion", "HasTestSingleFusion",
144
151
// CHECK-PREDICATOR-NEXT: }
145
152
// CHECK-PREDICATOR-NEXT: return true;
146
153
// 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: }
147
172
// CHECK-PREDICATOR-NEXT: bool isTestFusion(
148
173
// CHECK-PREDICATOR-NEXT: const TargetInstrInfo &TII,
149
174
// CHECK-PREDICATOR-NEXT: const TargetSubtargetInfo &STI,
@@ -238,6 +263,7 @@ def TestSingleFusion: SingleFusion<"test-single-fusion", "HasTestSingleFusion",
238
263
// Check that we have generated target subfeature.
239
264
// CHECK-SUBTARGET: { "test-both-fusion-predicate", "Test BothFusionPredicate", Test::TestBothFusionPredicate
240
265
// CHECK-SUBTARGET: { "test-commutable-fusion", "Test Commutable Fusion", Test::TestCommutableFusion
266
+ // CHECK-SUBTARGET: { "test-first-same-reg-fusion", "Test FirstSameReg", Test::TestFirstSameRegFusion
241
267
// CHECK-SUBTARGET: { "test-fusion", "Test Fusion", Test::TestFusion
242
268
// CHECK-SUBTARGET: { "test-single-fusion", "Test SingleFusion", Test::TestSingleFusion
243
269
@@ -246,8 +272,9 @@ def TestSingleFusion: SingleFusion<"test-single-fusion", "HasTestSingleFusion",
246
272
247
273
// CHECK-SUBTARGET: std::vector<MacroFusionPredTy> TestGenSubtargetInfo::getMacroFusions() const {
248
274
// 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);
251
278
// CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestFusion)) Fusions.push_back(llvm::isTestFusion);
252
279
// CHECK-SUBTARGET-NEXT: if (hasFeature(Test::TestSingleFusion)) Fusions.push_back(llvm::isTestSingleFusion);
253
280
// CHECK-SUBTARGET-NEXT: return Fusions;
0 commit comments