Generalize the MachineTraceMetrics public API.

Naturally, we should be able to pass in extra instructions, not just
extra blocks.

llvm-svn: 180667
This commit is contained in:
Andrew Trick 2013-04-27 03:54:20 +00:00
parent bcda43135c
commit 85058af650
2 changed files with 21 additions and 3 deletions

View File

@ -260,9 +260,13 @@ public:
/// independent, exposing the maximum instruction-level parallelism.
///
/// Any blocks in Extrablocks are included as if they were part of the
/// trace.
/// trace. Likewise, extra resources required by the specified scheduling
/// classes are included. For the caller to account for extra machine
/// instructions, it must first resolve each instruction's scheduling class.
unsigned getResourceLength(ArrayRef<const MachineBasicBlock*> Extrablocks =
ArrayRef<const MachineBasicBlock*>()) const;
ArrayRef<const MachineBasicBlock*>(),
ArrayRef<const MCSchedClassDesc*> ExtraInstrs =
ArrayRef<const MCSchedClassDesc*>()) const;
/// Return the length of the (data dependency) critical path through the
/// trace.

View File

@ -1200,8 +1200,10 @@ unsigned MachineTraceMetrics::Trace::getResourceDepth(bool Bottom) const {
return std::max(Instrs, PRMax);
}
unsigned MachineTraceMetrics::Trace::
getResourceLength(ArrayRef<const MachineBasicBlock*> Extrablocks) const {
getResourceLength(ArrayRef<const MachineBasicBlock*> Extrablocks,
ArrayRef<const MCSchedClassDesc*> ExtraInstrs) const {
// Add up resources above and below the center block.
ArrayRef<unsigned> PRDepths = TE.getProcResourceDepths(getBlockNum());
ArrayRef<unsigned> PRHeights = TE.getProcResourceHeights(getBlockNum());
@ -1210,6 +1212,18 @@ getResourceLength(ArrayRef<const MachineBasicBlock*> Extrablocks) const {
unsigned PRCycles = PRDepths[K] + PRHeights[K];
for (unsigned I = 0; I != Extrablocks.size(); ++I)
PRCycles += TE.MTM.getProcResourceCycles(Extrablocks[I]->getNumber())[K];
for (unsigned I = 0; I != ExtraInstrs.size(); ++I) {
const MCSchedClassDesc* SC = ExtraInstrs[I];
if (!SC->isValid())
continue;
for (TargetSchedModel::ProcResIter
PI = TE.MTM.SchedModel.getWriteProcResBegin(SC),
PE = TE.MTM.SchedModel.getWriteProcResEnd(SC); PI != PE; ++PI) {
if (PI->ProcResourceIdx != K)
continue;
PRCycles += (PI->Cycles * TE.MTM.SchedModel.getResourceFactor(K));
}
}
PRMax = std::max(PRMax, PRCycles);
}
// Convert to cycle count.