Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions llvm/include/llvm/Target/TargetSchedule.td
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,12 @@ class MCSchedPredicate<MCInstPredicate P> : SchedPredicateBase {
SchedMachineModel SchedModel = ?;
}

// A scheduling predicate whose logic depends on a SubtargetFeature.
class FeatureSchedPredicate<SubtargetFeature SF> : SchedPredicateBase {
SubtargetFeature Feature = SF;
SchedMachineModel SchedModel = ?;
}

// Define a predicate to determine which SchedVariant applies to a
// particular MachineInstr. The code snippet is used as an
// if-statement's expression. Available variables are MI, SchedModel,
Expand Down
46 changes: 46 additions & 0 deletions llvm/test/TableGen/ResolveSchedClass.td
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,57 @@ def TestTarget : Target {
let InstructionSet = TestTargetInstrInfo;
}

def FeatureFoo : SubtargetFeature<"foo", "HasFoo", "true", "enable foo">;

def ResX0 : ProcResource<1>;

let OutOperandList = (outs), InOperandList = (ins) in
def Inst_A : Instruction;

def SchedModel_A: SchedMachineModel {
let CompleteModel = false;
}

let SchedModel = SchedModel_A in {
def SchedWriteResA : SchedWriteRes<[ResX0]> {
let Latency = 2;
}
def SchedWriteResB : SchedWriteRes<[ResX0]> {
let Latency = 4;
}

// Check SchedPredicate with subtarget feature.
def FeatureFooPred : FeatureSchedPredicate<FeatureFoo>;

def Variant : SchedWriteVariant<[
SchedVar<FeatureFooPred, [SchedWriteResA]>,
SchedVar<NoSchedPred, [SchedWriteResB]>
]>;

def : InstRW<[Variant], (instrs Inst_A)>;
}

def ProcessorA: ProcessorModel<"ProcessorA", SchedModel_A, []>;

// CHECK: unsigned resolveVariantSchedClassImpl(unsigned SchedClass,
// CHECK-NEXT: const MCInst *MI, const MCInstrInfo *MCII, const MCSubtargetInfo &STI, unsigned CPUID)
// CHECK: case {{.*}}: // Inst_A
// CHECK-NEXT: if (CPUID == {{.*}}) { // SchedModel_A
// CHECK-NEXT: if (STI.hasFeature(TestTarget::FeatureFoo))
// CHECK-NEXT: return {{.*}}; // SchedWriteResA
// CHECK-NEXT: return {{.*}}; // SchedWriteResB

// CHECK: unsigned resolveVariantSchedClass(unsigned SchedClass,
// CHECK-NEXT: const MCInst *MI, const MCInstrInfo *MCII,
// CHECK-NEXT: unsigned CPUID) const override {
// CHECK-NEXT: return TestTarget_MC::resolveVariantSchedClassImpl(SchedClass, MI, MCII, *this, CPUID);
// CHECK-NEXT: }

// CHECK: unsigned TestTargetGenSubtargetInfo
// CHECK-NEXT: ::resolveSchedClass(unsigned SchedClass, const MachineInstr *MI, const TargetSchedModel *SchedModel) const {
// CHECK-NEXT: switch (SchedClass) {
// CHECK-NEXT: case {{.*}}: // Inst_A
// CHECK-NEXT: if (SchedModel->getProcessorID() == {{.*}}) { // SchedModel_A
// CHECK-NEXT: if (this->hasFeature(TestTarget::FeatureFoo))
// CHECK-NEXT: return {{.*}}; // SchedWriteResA
// CHECK-NEXT: return {{.*}}; // SchedWriteResB
21 changes: 20 additions & 1 deletion llvm/utils/TableGen/SubtargetEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1586,6 +1586,24 @@ static void emitPredicates(const CodeGenSchedTransition &T,
continue;
}

if (Rec->isSubClassOf("FeatureSchedPredicate")) {
const Record *FR = Rec->getValueAsDef("Feature");
if (PE.shouldExpandForMC()) {
// MC version of this predicate will be emitted into
// resolveVariantSchedClassImpl, which accesses MCSubtargetInfo
// through argument STI.
SS << "STI.";
} else {
// Otherwise, this predicate will be emitted directly into
// TargetGenSubtargetInfo::resolveSchedClass, which can just access
// TargetSubtargetInfo / MCSubtargetInfo through `this`.
SS << "this->";
}
SS << "hasFeature(" << PE.getTargetName() << "::" << FR->getName()
<< ")";
continue;
}

// Expand this legacy predicate and wrap it around braces if there is more
// than one predicate to expand.
SS << ((NumNonTruePreds > 1) ? "(" : "")
Expand Down Expand Up @@ -1618,7 +1636,8 @@ static void emitSchedModelHelperEpilogue(raw_ostream &OS,

static bool hasMCSchedPredicates(const CodeGenSchedTransition &T) {
return all_of(T.PredTerm, [](const Record *Rec) {
return Rec->isSubClassOf("MCSchedPredicate");
return Rec->isSubClassOf("MCSchedPredicate") ||
Rec->isSubClassOf("FeatureSchedPredicate");
});
}

Expand Down