Skip to content

Commit de1f338

Browse files
authored
[TableGen] Fix wrong codegen of BothFusionPredicateWithMCInstPredicate (llvm#83990)
We should generate the `MCInstPredicate` twice, one with `FirstMI` and another with `SecondMI`.
1 parent 94a0dd5 commit de1f338

File tree

3 files changed

+31
-8
lines changed

3 files changed

+31
-8
lines changed

llvm/include/llvm/Target/TargetSchedule.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ class SecondFusionPredicateWithMCInstPredicate<MCInstPredicate pred>
617617
: FusionPredicateWithMCInstPredicate<second_fusion_target, pred>;
618618
// The pred will be applied on both firstMI and secondMI.
619619
class BothFusionPredicateWithMCInstPredicate<MCInstPredicate pred>
620-
: FusionPredicateWithMCInstPredicate<second_fusion_target, pred>;
620+
: FusionPredicateWithMCInstPredicate<both_fusion_target, pred>;
621621

622622
// Tie firstOpIdx and secondOpIdx. The operand of `FirstMI` at position
623623
// `firstOpIdx` should be the same as the operand of `SecondMI` at position

llvm/test/TableGen/MacroFusion.td

+25
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ let Namespace = "Test" in {
3434
def Inst0 : TestInst<0>;
3535
def 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+
3742
def 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: }

llvm/utils/TableGen/MacroFusionPredicatorEmitter.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,7 @@ void MacroFusionPredicatorEmitter::emitFirstPredicate(Record *Predicate,
152152
<< "if (FirstDest.isVirtual() && !MRI.hasOneNonDBGUse(FirstDest))\n";
153153
OS.indent(4) << " return false;\n";
154154
OS.indent(2) << "}\n";
155-
} else if (Predicate->isSubClassOf(
156-
"FirstFusionPredicateWithMCInstPredicate")) {
155+
} else if (Predicate->isSubClassOf("FusionPredicateWithMCInstPredicate")) {
157156
OS.indent(2) << "{\n";
158157
OS.indent(4) << "const MachineInstr *MI = FirstMI;\n";
159158
OS.indent(4) << "if (";
@@ -173,7 +172,7 @@ void MacroFusionPredicatorEmitter::emitFirstPredicate(Record *Predicate,
173172
void MacroFusionPredicatorEmitter::emitSecondPredicate(Record *Predicate,
174173
PredicateExpander &PE,
175174
raw_ostream &OS) {
176-
if (Predicate->isSubClassOf("SecondFusionPredicateWithMCInstPredicate")) {
175+
if (Predicate->isSubClassOf("FusionPredicateWithMCInstPredicate")) {
177176
OS.indent(2) << "{\n";
178177
OS.indent(4) << "const MachineInstr *MI = &SecondMI;\n";
179178
OS.indent(4) << "if (";
@@ -185,7 +184,7 @@ void MacroFusionPredicatorEmitter::emitSecondPredicate(Record *Predicate,
185184
OS.indent(2) << "}\n";
186185
} else {
187186
PrintFatalError(Predicate->getLoc(),
188-
"Unsupported predicate for first instruction: " +
187+
"Unsupported predicate for second instruction: " +
189188
Predicate->getType()->getAsString());
190189
}
191190
}
@@ -196,9 +195,8 @@ void MacroFusionPredicatorEmitter::emitBothPredicate(Record *Predicate,
196195
if (Predicate->isSubClassOf("FusionPredicateWithCode"))
197196
OS << Predicate->getValueAsString("Predicate");
198197
else if (Predicate->isSubClassOf("BothFusionPredicateWithMCInstPredicate")) {
199-
Record *MCPred = Predicate->getValueAsDef("Predicate");
200-
emitFirstPredicate(MCPred, PE, OS);
201-
emitSecondPredicate(MCPred, PE, OS);
198+
emitFirstPredicate(Predicate, PE, OS);
199+
emitSecondPredicate(Predicate, PE, OS);
202200
} else if (Predicate->isSubClassOf("TieReg")) {
203201
int FirstOpIdx = Predicate->getValueAsInt("FirstOpIdx");
204202
int SecondOpIdx = Predicate->getValueAsInt("SecondOpIdx");

0 commit comments

Comments
 (0)