98 targetMachine_(targetMachine),
99 scheduledProcedure_(NULL),
101 softwareBypasser_(bypasser),
102 delaySlotFiller_(delaySlotFiller),
103 basicBlocksScheduled_(0),
104 totalBasicBlocks_(0) {
125 static const TCEString SP_DATUM =
"STACK_POINTER";
126 static const TCEString FP_DATUM =
"FRAME_POINTER";
127 static const TCEString RV_DATUM =
"RV_REGISTER";
129 static const TCEString RV_HIGH_DATUM =
"RV_HIGH_REGISTER";
134 bool bbScheduled =
false;
152 std::vector<DDGPass*> bbSchedulers;
176 <<
"CFG detects single BB loop" << std::endl
177 <<
"tripcount: " << bb.
tripCount() << std::endl;
181 if (analysis != NULL) {
186 <<
"loop analyzis analyzed loop to have fixed trip count"
192 <<
"loop analyzis analyzed loop to have variable trip count"
207 setLoopLimits(analysis);
212 <<
"executing loop pass with trip count " << bb.
tripCount()
217 bb, targetMachine, irm, bbSchedulers, bbn) ) {
222 <<
"loop scheduler failed, using basic block "
223 <<
"scheduler instead" << std::endl;
233 bb, targetMachine, irm, bbSchedulers, bbn);
252 std::cerr <<
"Wargning: BB liverange data null for: "
255 for (
unsigned int i = 0; i < bbSchedulers.size(); i++)
256 delete bbSchedulers[i];
259#ifdef DEBUG_REG_COPY_ADDER
260static int graphCount = 0;
308 (boost::format(
"proc_%s_before_scheduling.dot") %
314 (boost::format(
"proc_%s_before_scheduling.xml") %
323#ifdef BIG_DDG_SNAPSHOTS
352 (boost::format(
"proc_%s_after_scheduling.dot") %
bigDDG_->
name())
358 (boost::format(
"proc_%s_after_scheduling.xml") %
bigDDG_->
name())
410 return "Instruction scheduler with a basic block scope.";
424 "Basic block scheduler that uses the longest path information of "
425 "data dependency graph to prioritize the ready list. Assumes that "
426 "the input has registers allocated and no connectivity missing.";
463 static int bbNumber = 0;
466 if (ddgPasses.size() > 1) {
467 for (
unsigned int i = 0; i < ddgPasses.size(); i++) {
475 ddgPasses[i]->handleDDG(*ddg, *rm, targetMachine, minCycle,
true);
505 std::string name =
"scheduling";
510 ddgPasses[fastest]->handleDDG(*ddg, *rm, targetMachine, minCycle);
521 std::string name =
"scheduling";
551 <<
"DDG height " << ddg->
height() << std::endl;
563 if (procName ==
"") procName = cfg.
name();
599 for (
int bbIndex = 0; bbIndex < nodeCount; ++bbIndex) {
612 for (
int bbIndex = 0; bbIndex < nodeCount; ++bbIndex) {
615 if (jumpDest !=
nullptr && jumpDest->isNormalBB()) {
626 for (
int bbIndex = cfg.
nodeCount() -1; bbIndex >= 0; --bbIndex) {
629 if (jumpDest ==
nullptr || !jumpDest->isNormalBB()) {
636 bbIndex = nodeCount -1;
641 for (
int bbIndex = cfg.
nodeCount() -1; bbIndex >= 0; --bbIndex) {
645 bbIndex = nodeCount -1;
#define abortWithError(message)
static const int MAXIMUM_II
static const int DEFAULT_LOWMEM_MODE_THRESHOLD
find Finds info of the inner loops in the program
static MachInfoCmdLineOptions options
static CmdLineOptions * cmdLineOptions()
static int verboseLevel()
static std::ostream & logStream()
ControlFlowGraph * cfg_
Control flow graph of the procedure.
DataDependenceGraph * bigDDG_
whole-procedure DDG.
TTAProgram::Procedure * scheduledProcedure_
The currently scheduled procedure.
int basicBlocksScheduled_
Number of basic blocks scheduled so far.
LLVMTCECmdLineOptions * options_
SoftwareBypasser * softwareBypasser_
The software bypasser to use to bypass registers when possible.
bool handleBBNode(ControlFlowGraph &cfg, BasicBlockNode &bbn, const TTAMachine::Machine &targetMachine, int nodeCount)
BBSchedulerController(const TTAMachine::Machine &targetMachine, InterPassData &data, SoftwareBypasser *bypasser=NULL, CopyingDelaySlotFiller *delaySlotFiller=NULL, DataDependenceGraph *bigDDG=NULL)
virtual void handleBasicBlock(TTAProgram::BasicBlock &bb, const TTAMachine::Machine &targetMachine, TTAProgram::InstructionReferenceManager &irm, BasicBlockNode *bbn=NULL) override
virtual void handleProgram(TTAProgram::Program &program, const TTAMachine::Machine &targetMachine) override
CopyingDelaySlotFiller * delaySlotFiller_
virtual DataDependenceGraph * createDDGFromBB(TTAProgram::BasicBlock &bb, const TTAMachine::Machine &mach)
virtual ~BBSchedulerController()
virtual void executeDDGPass(TTAProgram::BasicBlock &bb, const TTAMachine::Machine &targetMachine, TTAProgram::InstructionReferenceManager &irm, std::vector< DDGPass * > ddgPasses, BasicBlockNode *bbn=NULL) override
virtual std::string shortDescription() const override
virtual std::string longDescription() const override
int totalBasicBlocks_
Total basic blocks in the CFG currently being scheduled.
virtual void handleProcedure(TTAProgram::Procedure &procedure, const TTAMachine::Machine &targetMachine) override
virtual void handleControlFlowGraph(ControlFlowGraph &cfg, const TTAMachine::Machine &targetMachine) override
virtual void handleCFGDDG(ControlFlowGraph &cfg, DataDependenceGraph *ddg, const TTAMachine::Machine &targetMachine)
void setScheduled(bool state=true)
TTAProgram::BasicBlock & basicBlock()
const BasicBlockNode * predecessor() const
std::string toString() const
void updateHWloopLength(unsigned len)
static void copyRMToBB(SimpleResourceManager &rm, TTAProgram::BasicBlock &bb, const TTAMachine::Machine &targetMachine, TTAProgram::InstructionReferenceManager &irm, int lastCycle=-1)
virtual bool executeLoopPass(TTAProgram::BasicBlock &bb, const TTAMachine::Machine &targetMachine, TTAProgram::InstructionReferenceManager &irm, std::vector< DDGPass * > ddgPasses, BasicBlockNode *bbn=NULL)
virtual DataDependenceGraphBuilder & ddgBuilder()
void ddgSnapshot(DataDependenceGraph *ddg, std::string &name, DataDependenceGraph::DumpFileFormat format, bool final)
Node & node(const int index) const
virtual const TCEString & name() const
void updateReferencesFromProcToCfg()
TTAProgram::InstructionReferenceManager & instructionReferenceManager()
void copyToProcedure(TTAProgram::Procedure &proc, TTAProgram::InstructionReferenceManager *irm=NULL)
BasicBlockNode * jumpSuccessor(BasicBlockNode &bbn)
bool allScheduledInBetween(const BasicBlockNode &src, const BasicBlockNode &dst) const
TCEString procedureName() const
bool isSingleBBLoop(const BasicBlockNode &node) const
static std::string toString(const T &source)
void initialize(ControlFlowGraph &cfg, DataDependenceGraph &ddg, const TTAMachine::Machine &machine)
void fillDelaySlots(ControlFlowGraph &cfg, DataDependenceGraph &ddg, const TTAMachine::Machine &machine)
void addResourceManager(TTAProgram::BasicBlock &bbn, SimpleResourceManager &rm)
void bbnScheduled(BasicBlockNode &bbn)
virtual DataDependenceGraph * build(ControlFlowGraph &cGraph, DataDependenceGraph::AntidependenceLevel antidependenceLevel, const TTAMachine::Machine &mach, const UniversalMachine *um=NULL, bool createMemAndFUDeps=true, bool createDeathInformation=true, llvm::AliasAnalysis *AA=NULL)
DataDependenceGraph * createSubgraph(NodeSet &nodes, bool includeLoops=false)
int smallestCycle() const
void writeToXMLFile(std::string fileName) const
@ SINGLE_BB_LOOP_ANTIDEPS
std::string errorMessageStack(bool messagesOnly=false) const
virtual void writeToDotFile(const TCEString &fileName) const
bool hasDatum(const std::string &key) const
bool useBubbleFish2Scheduler() const
bool useBUScheduler() const
virtual bool dumpDDGsDot() const
virtual bool dumpDDGsXML() const
bool useTDScheduler() const
static LoopAnalysisResult * analyze(BasicBlockNode &bbn, DataDependenceGraph &ddg)
static std::set< const TTAMachine::RegisterFile *, TTAMachine::MachinePart::Comparator > tempRegisterFiles(const TTAMachine::Machine &machine)
std::string toString() const
static void executeProcedurePass(TTAProgram::Program &program, const TTAMachine::Machine &targetMachine, ProcedurePass &procedurePass)
void analyzePreSchedule()
virtual void handleControlFlowGraph(ControlFlowGraph &cfg, const TTAMachine::Machine &mach) override
bool printResourceConstraints() const
virtual int lowMemModeThreshold() const
virtual bool isLoopOptDefined() const
InterPassData & interPassData()
void setBBN(const BasicBlockNode *bbn)
static void disposeRM(SimpleResourceManager *rm, bool allowReuse=true)
void setCFG(const ControlFlowGraph *cfg)
static SimpleResourceManager * createRM(const TTAMachine::Machine &machine, unsigned int ii=0)
void setDDG(const DataDependenceGraph *ddg)
virtual void clearOldResources()
LiveRangeData * liveRangeData_
bool isInInnerLoop() const
returns true in case the BB is known to be inside an inner loop
void setTripCount(unsigned count)
unsigned tripCount() const
in case the BB is inside a loop and trip count is known, returns it, otherwise returns 0
virtual int instructionCount() const
virtual Instruction & lastInstruction() const
MoveNodeUseMapSet regFirstUses_
MoveNodeUseMapSet regLastUses_
std::set< TCEString > registersUsedAfter_
MoveNodeUseMapSet regFirstDefines_
MoveNodeUseMapSet regDefines_
MoveNodeUseMapSet regDefReaches_
MoveNode * counterValueNode