mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 22:24:07 +00:00
Add more trace query functions.
Trace::getResourceLength() computes the number of cycles required to execute the trace when ignoring data dependencies. The number can be compared to the critical path to estimate the trace ILP. Trace::getPHIDepth() computes the data dependency depth of a PHI in a trace successor that isn't necessarily part of the trace. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161711 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1044,6 +1044,23 @@ MachineTraceMetrics::Trace::getInstrSlack(const MachineInstr *MI) const {
|
||||
return getCriticalPath() - (Cyc.Depth + Cyc.Height);
|
||||
}
|
||||
|
||||
unsigned
|
||||
MachineTraceMetrics::Trace::getPHIDepth(const MachineInstr *PHI) const {
|
||||
const MachineBasicBlock *MBB = TE.MTM.MF->getBlockNumbered(getBlockNum());
|
||||
SmallVector<DataDep, 1> Deps;
|
||||
getPHIDeps(PHI, Deps, MBB, TE.MTM.MRI);
|
||||
assert(Deps.size() == 1 && "PHI doesn't have MBB as a predecessor");
|
||||
DataDep &Dep = Deps.front();
|
||||
unsigned DepCycle = getInstrCycles(Dep.DefMI).Depth;
|
||||
// Add latency if DefMI is a real instruction. Transients get latency 0.
|
||||
if (!Dep.DefMI->isTransient())
|
||||
DepCycle += TE.MTM.TII->computeOperandLatency(TE.MTM.ItinData,
|
||||
Dep.DefMI, Dep.DefOp,
|
||||
PHI, Dep.UseOp,
|
||||
/* FindMin = */ false);
|
||||
return DepCycle;
|
||||
}
|
||||
|
||||
unsigned MachineTraceMetrics::Trace::getResourceDepth(bool Bottom) const {
|
||||
// For now, we compute the resource depth from instruction count / issue
|
||||
// width. Eventually, we should compute resource depth per functional unit
|
||||
@ -1058,6 +1075,18 @@ unsigned MachineTraceMetrics::Trace::getResourceDepth(bool Bottom) const {
|
||||
return Instrs;
|
||||
}
|
||||
|
||||
unsigned MachineTraceMetrics::Trace::
|
||||
getResourceLength(ArrayRef<const MachineBasicBlock*> Extrablocks) const {
|
||||
unsigned Instrs = TBI.InstrDepth + TBI.InstrHeight;
|
||||
for (unsigned i = 0, e = Extrablocks.size(); i != e; ++i)
|
||||
Instrs += TE.MTM.getResources(Extrablocks[i])->InstrCount;
|
||||
if (const MCSchedModel *Model = TE.MTM.ItinData->SchedModel)
|
||||
if (Model->IssueWidth != 0)
|
||||
return Instrs / Model->IssueWidth;
|
||||
// Assume issue width 1 without a schedule model.
|
||||
return Instrs;
|
||||
}
|
||||
|
||||
void MachineTraceMetrics::Ensemble::print(raw_ostream &OS) const {
|
||||
OS << getName() << " ensemble:\n";
|
||||
for (unsigned i = 0, e = BlockInfo.size(); i != e; ++i) {
|
||||
|
Reference in New Issue
Block a user