mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-29 10:32:47 +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:
parent
6b951b25c3
commit
5413b68b1f
@ -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) {
|
||||
|
@ -226,6 +226,15 @@ public:
|
||||
/// When Bottom is set, instructions in the trace center block are included.
|
||||
unsigned getResourceDepth(bool Bottom) const;
|
||||
|
||||
/// Return the resource length of the trace. This is the number of cycles
|
||||
/// required to execute the instructions in the trace if they were all
|
||||
/// independent, exposing the maximum instruction-level parallelism.
|
||||
///
|
||||
/// Any blocks in Extrablocks are included as if they were part of the
|
||||
/// trace.
|
||||
unsigned getResourceLength(ArrayRef<const MachineBasicBlock*> Extrablocks =
|
||||
ArrayRef<const MachineBasicBlock*>()) const;
|
||||
|
||||
/// Return the length of the (data dependency) critical path through the
|
||||
/// trace.
|
||||
unsigned getCriticalPath() const { return TBI.CriticalPath; }
|
||||
@ -241,6 +250,10 @@ public:
|
||||
/// before the critical path becomes longer.
|
||||
/// MI must be an instruction in the trace center block.
|
||||
unsigned getInstrSlack(const MachineInstr *MI) const;
|
||||
|
||||
/// Return the Depth of a PHI instruction in a trace center block successor.
|
||||
/// The PHI does not have to be part of the trace.
|
||||
unsigned getPHIDepth(const MachineInstr *PHI) const;
|
||||
};
|
||||
|
||||
/// A trace ensemble is a collection of traces selected using the same
|
||||
|
Loading…
Reference in New Issue
Block a user