mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 22:58:50 +00:00
[MC] Move the instruction latency computation from TargetSchedModel to MCSchedModel.
The goal is to make the latency information accessible through the MCSchedModel interface. This is particularly important for tools like llvm-mca that only have access to the MCSchedModel API. This partially fixes PR36676. No functional change intended. Differential Revision: https://reviews.llvm.org/D44383 llvm-svn: 327406
This commit is contained in:
parent
7dd9e8e307
commit
ebf966ab9b
@ -21,6 +21,7 @@
|
||||
namespace llvm {
|
||||
|
||||
struct InstrItinerary;
|
||||
class MCSubtargetInfo;
|
||||
|
||||
/// Define a kind of processor resource that will be modeled by the scheduler.
|
||||
struct MCProcResourceDesc {
|
||||
@ -226,6 +227,10 @@ struct MCSchedModel {
|
||||
return &SchedClassTable[SchedClassIdx];
|
||||
}
|
||||
|
||||
/// Returns the latency value for the scheduling class.
|
||||
static int computeInstrLatency(const MCSubtargetInfo &STI,
|
||||
const MCSchedClassDesc &SCDesc);
|
||||
|
||||
/// Returns the default initialized model.
|
||||
static const MCSchedModel &GetDefaultSchedModel() { return Default; }
|
||||
static const MCSchedModel Default;
|
||||
|
@ -257,15 +257,7 @@ unsigned TargetSchedModel::computeOperandLatency(
|
||||
|
||||
unsigned
|
||||
TargetSchedModel::computeInstrLatency(const MCSchedClassDesc &SCDesc) const {
|
||||
unsigned Latency = 0;
|
||||
for (unsigned DefIdx = 0, DefEnd = SCDesc.NumWriteLatencyEntries;
|
||||
DefIdx != DefEnd; ++DefIdx) {
|
||||
// Lookup the definition's write latency in SubtargetInfo.
|
||||
const MCWriteLatencyEntry *WLEntry =
|
||||
STI->getWriteLatencyEntry(&SCDesc, DefIdx);
|
||||
Latency = std::max(Latency, capLatency(WLEntry->Cycles));
|
||||
}
|
||||
return Latency;
|
||||
return capLatency(MCSchedModel::computeInstrLatency(*STI, SCDesc));
|
||||
}
|
||||
|
||||
unsigned TargetSchedModel::computeInstrLatency(unsigned Opcode) const {
|
||||
|
@ -12,6 +12,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/MC/MCSchedule.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include <type_traits>
|
||||
|
||||
using namespace llvm;
|
||||
@ -32,3 +33,19 @@ const MCSchedModel MCSchedModel::Default = {DefaultIssueWidth,
|
||||
0,
|
||||
0,
|
||||
nullptr};
|
||||
|
||||
int MCSchedModel::computeInstrLatency(const MCSubtargetInfo &STI,
|
||||
const MCSchedClassDesc &SCDesc) {
|
||||
int Latency = 0;
|
||||
for (unsigned DefIdx = 0, DefEnd = SCDesc.NumWriteLatencyEntries;
|
||||
DefIdx != DefEnd; ++DefIdx) {
|
||||
// Lookup the definition's write latency in SubtargetInfo.
|
||||
const MCWriteLatencyEntry *WLEntry =
|
||||
STI.getWriteLatencyEntry(&SCDesc, DefIdx);
|
||||
// Early exit if we found an invalid latency.
|
||||
if (WLEntry->Cycles < 0)
|
||||
return WLEntry->Cycles;
|
||||
Latency = std::max(Latency, static_cast<int>(WLEntry->Cycles));
|
||||
}
|
||||
return Latency;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user