mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
Add trace accessor methods, implement primitive if-conversion heuristic.
Compare the critical paths of the two traces through an if-conversion candidate. If the difference is larger than the branch brediction penalty, reject the if-conversion. If would never pay. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161433 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include "llvm/CodeGen/MachineLoopInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/MC/MCInstrItineraries.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
@@ -1017,6 +1018,29 @@ MachineTraceMetrics::Ensemble::getTrace(const MachineBasicBlock *MBB) {
|
||||
return Trace(*this, BlockInfo[MBB->getNumber()]);
|
||||
}
|
||||
|
||||
unsigned
|
||||
MachineTraceMetrics::Trace::getInstrSlack(const MachineInstr *MI) const {
|
||||
assert(MI && "Not an instruction.");
|
||||
assert(getBlockNum() == unsigned(MI->getParent()->getNumber()) &&
|
||||
"MI must be in the trace center block");
|
||||
InstrCycles Cyc = getInstrCycles(MI);
|
||||
return getCriticalPath() - (Cyc.Depth + Cyc.Height);
|
||||
}
|
||||
|
||||
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
|
||||
// and return the max.
|
||||
unsigned Instrs = TBI.InstrDepth;
|
||||
if (Bottom)
|
||||
Instrs += TE.MTM.BlockInfo[getBlockNum()].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