Skip to content

Commit c0bc72b

Browse files
committed
[TableGen][SchedModel] Introduce a new SchedPredicate that checks against SubtargetFeature
1 parent cb8b48e commit c0bc72b

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

llvm/include/llvm/Target/TargetSchedule.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,11 @@ class MCSchedPredicate<MCInstPredicate P> : SchedPredicateBase {
377377
SchedMachineModel SchedModel = ?;
378378
}
379379

380+
class FeatureSchedPredicate<SubtargetFeature SF> : SchedPredicateBase {
381+
SubtargetFeature Feature = SF;
382+
SchedMachineModel SchedModel = ?;
383+
}
384+
380385
// Define a predicate to determine which SchedVariant applies to a
381386
// particular MachineInstr. The code snippet is used as an
382387
// if-statement's expression. Available variables are MI, SchedModel,

llvm/test/TableGen/ResolveSchedClass.td

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,57 @@ def TestTarget : Target {
88
let InstructionSet = TestTargetInstrInfo;
99
}
1010

11+
def FeatureFoo : SubtargetFeature<"foo", "HasFoo", "true", "enable foo">;
12+
13+
def ResX0 : ProcResource<1>;
14+
15+
let OutOperandList = (outs), InOperandList = (ins) in
16+
def Inst_A : Instruction;
17+
18+
def SchedModel_A: SchedMachineModel {
19+
let CompleteModel = false;
20+
}
21+
22+
let SchedModel = SchedModel_A in {
23+
def SchedWriteResA : SchedWriteRes<[ResX0]> {
24+
let Latency = 2;
25+
}
26+
def SchedWriteResB : SchedWriteRes<[ResX0]> {
27+
let Latency = 4;
28+
}
29+
30+
// Check SchedPredicate with subtarget feature.
31+
def FeatureFooPred : FeatureSchedPredicate<FeatureFoo>;
32+
33+
def Variant : SchedWriteVariant<[
34+
SchedVar<FeatureFooPred, [SchedWriteResA]>,
35+
SchedVar<NoSchedPred, [SchedWriteResB]>
36+
]>;
37+
38+
def : InstRW<[Variant], (instrs Inst_A)>;
39+
}
40+
41+
def ProcessorA: ProcessorModel<"ProcessorA", SchedModel_A, []>;
42+
1143
// CHECK: unsigned resolveVariantSchedClassImpl(unsigned SchedClass,
1244
// CHECK-NEXT: const MCInst *MI, const MCInstrInfo *MCII, const MCSubtargetInfo &STI, unsigned CPUID)
45+
// CHECK: case {{.*}}: // Inst_A
46+
// CHECK-NEXT: if (CPUID == {{.*}}) { // SchedModel_A
47+
// CHECK-NEXT: if (STI.hasFeature(TestTarget::FeatureFoo))
48+
// CHECK-NEXT: return {{.*}}; // SchedWriteResA
49+
// CHECK-NEXT: return {{.*}}; // SchedWriteResB
1350

1451
// CHECK: unsigned resolveVariantSchedClass(unsigned SchedClass,
1552
// CHECK-NEXT: const MCInst *MI, const MCInstrInfo *MCII,
1653
// CHECK-NEXT: unsigned CPUID) const override {
1754
// CHECK-NEXT: return TestTarget_MC::resolveVariantSchedClassImpl(SchedClass, MI, MCII, *this, CPUID);
1855
// CHECK-NEXT: }
56+
57+
// CHECK: unsigned TestTargetGenSubtargetInfo
58+
// CHECK-NEXT: ::resolveSchedClass(unsigned SchedClass, const MachineInstr *MI, const TargetSchedModel *SchedModel) const {
59+
// CHECK-NEXT: switch (SchedClass) {
60+
// CHECK-NEXT: case {{.*}}: // Inst_A
61+
// CHECK-NEXT: if (SchedModel->getProcessorID() == {{.*}}) { // SchedModel_A
62+
// CHECK-NEXT: if (this->hasFeature(TestTarget::FeatureFoo))
63+
// CHECK-NEXT: return {{.*}}; // SchedWriteResA
64+
// CHECK-NEXT: return {{.*}}; // SchedWriteResB

llvm/utils/TableGen/SubtargetEmitter.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1586,6 +1586,17 @@ static void emitPredicates(const CodeGenSchedTransition &T,
15861586
continue;
15871587
}
15881588

1589+
if (Rec->isSubClassOf("FeatureSchedPredicate")) {
1590+
const Record *FR = Rec->getValueAsDef("Feature");
1591+
if (PE.shouldExpandForMC())
1592+
SS << "STI.";
1593+
else
1594+
SS << "this->";
1595+
SS << "hasFeature(" << PE.getTargetName() << "::" << FR->getName()
1596+
<< ")";
1597+
continue;
1598+
}
1599+
15891600
// Expand this legacy predicate and wrap it around braces if there is more
15901601
// than one predicate to expand.
15911602
SS << ((NumNonTruePreds > 1) ? "(" : "")
@@ -1618,7 +1629,8 @@ static void emitSchedModelHelperEpilogue(raw_ostream &OS,
16181629

16191630
static bool hasMCSchedPredicates(const CodeGenSchedTransition &T) {
16201631
return all_of(T.PredTerm, [](const Record *Rec) {
1621-
return Rec->isSubClassOf("MCSchedPredicate");
1632+
return Rec->isSubClassOf("MCSchedPredicate") ||
1633+
Rec->isSubClassOf("FeatureSchedPredicate");
16221634
});
16231635
}
16241636

0 commit comments

Comments
 (0)