Skip to content

Commit 4482142

Browse files
committed
move variant sched class resolution into callback, per quentin's idea
1 parent 8d2c37d commit 4482142

File tree

2 files changed

+35
-23
lines changed

2 files changed

+35
-23
lines changed

llvm/include/llvm/MC/MCSchedule.h

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,12 @@ struct MCSchedModel {
378378

379379
template <typename MCSubtargetInfo, typename MCInstrInfo,
380380
typename InstrItineraryData, typename MCInstOrMachineInstr>
381-
int computeInstrLatency(const MCSubtargetInfo &STI, const MCInstrInfo &MCII,
382-
const MCInstOrMachineInstr &Inst) const;
381+
int computeInstrLatency(
382+
const MCSubtargetInfo &STI, const MCInstrInfo &MCII,
383+
const MCInstOrMachineInstr &Inst,
384+
llvm::function_ref<const MCSchedClassDesc *(const MCSchedClassDesc *)>
385+
ResolveVariantSchedClass =
386+
[](const MCSchedClassDesc *SCDesc) { return SCDesc; }) const;
383387

384388
// Returns the reciprocal throughput information from a MCSchedClassDesc.
385389
static double
@@ -408,9 +412,11 @@ struct MCSchedModel {
408412
// the MC layer depend on CodeGen.
409413
template <typename MCSubtargetInfo, typename MCInstrInfo,
410414
typename InstrItineraryData, typename MCInstOrMachineInstr>
411-
int MCSchedModel::computeInstrLatency(const MCSubtargetInfo &STI,
412-
const MCInstrInfo &MCII,
413-
const MCInstOrMachineInstr &Inst) const {
415+
int MCSchedModel::computeInstrLatency(
416+
const MCSubtargetInfo &STI, const MCInstrInfo &MCII,
417+
const MCInstOrMachineInstr &Inst,
418+
llvm::function_ref<const MCSchedClassDesc *(const MCSchedClassDesc *)>
419+
ResolveVariantSchedClass) const {
414420
static const int NoInformationAvailable = -1;
415421
// Check if we have a scheduling model for instructions.
416422
if (!hasInstrSchedModel()) {
@@ -440,25 +446,12 @@ int MCSchedModel::computeInstrLatency(const MCSubtargetInfo &STI,
440446

441447
unsigned SchedClass = MCII.get(Inst.getOpcode()).getSchedClass();
442448
const MCSchedClassDesc *SCDesc = getSchedClassDesc(SchedClass);
443-
if (!SCDesc->isValid())
444-
return 0;
445-
446-
if constexpr (std::is_same_v<MCInstOrMachineInstr, MCInst>) {
447-
unsigned CPUID = getProcessorID();
448-
while (SCDesc->isVariant()) {
449-
SchedClass =
450-
STI.resolveVariantSchedClass(SchedClass, &Inst, &MCII, CPUID);
451-
SCDesc = getSchedClassDesc(SchedClass);
452-
}
453-
454-
if (SchedClass)
455-
return MCSchedModel::computeInstrLatency(STI, *SCDesc);
449+
SCDesc = ResolveVariantSchedClass(SCDesc);
456450

457-
llvm_unreachable("unsupported variant scheduling class");
458-
} else if (SchedClass)
459-
return MCSchedModel::computeInstrLatency(STI, SchedClass);
451+
if (!SCDesc || !SCDesc->isValid())
452+
return NoInformationAvailable;
460453

461-
return NoInformationAvailable;
454+
return MCSchedModel::computeInstrLatency(STI, *SCDesc);
462455
}
463456

464457
} // namespace llvm

llvm/lib/MC/MCSchedule.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,26 @@ int MCSchedModel::computeInstrLatency(const MCSubtargetInfo &STI,
7171
const MCInst &Inst) const {
7272
return MCSchedModel::computeInstrLatency<MCSubtargetInfo, MCInstrInfo,
7373
InstrItineraryData, MCInst>(
74-
STI, MCII, Inst);
74+
STI, MCII, Inst,
75+
[&](const MCSchedClassDesc *SCDesc) -> const MCSchedClassDesc * {
76+
if (!SCDesc->isValid())
77+
return nullptr;
78+
79+
unsigned CPUID = getProcessorID();
80+
unsigned SchedClass = 0;
81+
while (SCDesc->isVariant()) {
82+
SchedClass =
83+
STI.resolveVariantSchedClass(SchedClass, &Inst, &MCII, CPUID);
84+
SCDesc = getSchedClassDesc(SchedClass);
85+
}
86+
87+
if (!SchedClass) {
88+
assert(false && "unsupported variant scheduling class");
89+
return nullptr;
90+
}
91+
92+
return SCDesc;
93+
});
7594
}
7695

7796
double

0 commit comments

Comments
 (0)