34#ifndef TTA_DDG_BUILDER_HH
35#define TTA_DDG_BUILDER_HH
51 class TerminalRegister;
84 bool createMemAndFUDeps =
true,
85 bool createDeathInformation =
true,
93 bool createMemAndFUDeps =
true,
163 bool aliveInformationNeeded =
true);
177 bool addLoopProperty);
255 std::set<MoveNodeUse>& prevNodes,
260 std::set<MoveNodeUse>& defines);
273 bool guardedKillFound);
280 bool priorize =
false);
290 std::map<int,TCEString>& registers);
294 std::map<int,TCEString>& registers);
298 std::map<int,TCEString>& registers);
302 std::map<int,TCEString>& registers);
307 bool setLoopProperty);
std::shared_ptr< ProgramOperation > ProgramOperationPtr
LiveRangeData::MoveNodeUseSet MoveNodeUseSet
void processMemWrite(MoveNodeUse mnd)
void checkAndCreateMemAntideps(MoveNodeUse &mnd, std::set< MoveNodeUse > &prevNodes, DataDependenceEdge::DependenceType depType, bool traceable)
void constructIndividualBB(ConstructionPhase phase)
DataDependenceGraph * currentDDG_
void findStaticRegisters(TTAProgram::CodeSnippet &cs, std::map< int, TCEString > ®isters)
find special register data from old frontend code
virtual ~DataDependenceGraphBuilder()
std::map< int, TCEString > SpecialRegisters
void createRegisterAntideps(const TCEString ®, MoveNodeUse &mnd, MoveNodeUseSet &predecessorNodes, DataDependenceEdge::DependenceType depType, bool guardedKillFound)
void processCall(MoveNode &mn)
void appendMoveNodeUse(const LiveRangeData::MoveNodeUseSet &src, LiveRangeData::MoveNodeUseSet &dst, bool setLoopProperty)
bool updateRegistersAliveAfter(BBData &bbd)
static const TCEString RA_NAME
void updateBB(BBData &bbd, ConstructionPhase phase)
std::set< TCEString > allParamRegs_
void processSource(MoveNode &moveNode)
bool hasEarlierWriteWithSameGuard(MoveNodeUse &mnd, std::set< MoveNodeUse > &defines)
void processOperand(class MoveNode &moveNode, Operation &dop)
void processTriggerMemoryAndFUStates(MoveNode &moveNode, Operation &dop)
void clearUnneededBookkeeping()
void constructIndividualFromInlineAsmBB(ConstructionPhase phase)
void searchRegisterDeaths()
void processEntryNode(MoveNode &mn)
void createRegisterDeps()
void createSideEffectEdges(MoveNodeUseSet &prevMoves, const MoveNode &mn, Operation &dop)
std::set< MoveNodeUse > earlierWritesWithSameGuard(MoveNodeUse &mnd, std::set< MoveNodeUse > &defines)
void updatePreceedingRegistersUsedAfter(BBData &bbd, bool firstTime)
@ MEMORY_AND_SIDE_EFFECTS
@ REGISTERS_AND_PROGRAM_OPERATIONS
void createMemAndFUstateDeps()
bool isAddressTraceable(const ProgramOperation &pop)
void setSucceedingPredeps(BBData &bbd, bool queueAll, ConstructionPhase phase)
ControlFlowGraph::NodeSet BasicBlockNodeSet
@ BB_STATES
BB which is already processed and is not queued.
@ BB_QUEUED
Basic block we have not yet encountered.
@ BB_READY
BB which is queued to be processed.
void iterateBBs(ConstructionPhase phase)
InterPassData * interPassData_
bool hasEarlierMemWriteToSameAddressWithSameGuard(MoveNodeUse &mnd, std::set< MoveNodeUse > &defines)
DataDependenceGraph::NodeSet MNodeSet
DataDependenceGraphBuilder()
LiveRangeData::MoveNodeUseMap MoveNodeUseMap
void processTriggerRegistersAndOperations(MoveNode &moveNode, Operation &dop)
void processReturn(MoveNode &moveNode)
BasicBlockNode * currentBB_
SpecialRegisters specialRegisters_
contains stack pointer, RV and parameter registers.
void processRegUse(MoveNodeUse mn, const TCEString ®)
void processGuard(MoveNode &moveNode)
const TTAMachine::Machine * mach_
std::map< BasicBlockNode *, BBData * > BBDataMap
BasicBlockNode * queueFirstBB()
void initializeBBStates()
bool isTriggering(const MoveNode &mn)
void processResultRead(MoveNode &moveNode)
void updateMemUse(MoveNodeUse mnd, const TCEString &category)
void constructBB(BasicBlockNodeSet &inputBlocks)
void setSucceedingPredepsForBB(TTAProgram::BasicBlock &processedBB, BasicBlockNode &successor, bool queueAll, bool loop, ConstructionPhase phase)
bool checkAndCreateMemDep(MoveNodeUse prev, MoveNodeUse mnd, DataDependenceEdge::DependenceType depType)
void createTriggerDependencies(class MoveNode &moveNode, class Operation &dop)
void processTriggerPO(class MoveNode &moveNode, Operation &dop)
BBDataList blocksByState_[BB_STATES]
MemoryAliasAnalyzer::AliasingResult analyzeMemoryAlias(const ProgramOperation &pop1, const ProgramOperation &pop2, MoveNodeUse::BBRelation bbInfo)
void processDestination(class MoveNode &moveNode, ConstructionPhase phase)
bool updateRegistersUsedInOrAfter(BBData &bbd)
LiveRangeData::MoveNodeUseSetPair MoveNodeUseSetPair
void changeState(BBData &bbd, BBState newState, bool priorize=false)
void addAliasAnalyzer(MemoryAliasAnalyzer *analyzer)
void processRegWrite(MoveNodeUse mn, const TCEString ®)
void updateMemWrite(MoveNodeUse mnd, const TCEString &category)
AliasAnalyzerVector aliasAnalyzers_
std::vector< MemoryAliasAnalyzer * > AliasAnalyzerVector
bool appendUseMapSets(const MoveNodeUseMapSet &srcMap, MoveNodeUseMapSet &dstMap, bool addLoopProperty)
LiveRangeData::MoveNodeUsePair MoveNodeUsePair
std::list< BBData * > BBDataList
void createOperationEdges(ProgramOperationPtr po)
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)
bool isAlwaysDifferentFU(const MoveNode *srcMN, const MoveNode *dstMN)
void processMemUse(MoveNodeUse mnd)
TCEString memoryCategory(const MoveNodeUse &mnd)
LiveRangeData::MoveNodeUseMapSet MoveNodeUseMapSet
bool updateMemAndFuAliveAfter(BBData &bbd)
void iterateRegisterDeaths()
std::set< GraphNode *, typename GraphNode::Comparator > NodeSet
BBState state_
State of the BB.
ProgramOperationPtr readPending_
ProgramOperations lacking result read.
bool constructed_
Whether the BB has been constructed or not.
ProgramOperationPtr destPending_
ProgramOperations lacking operands.
std::pair< TCEString, MoveNodeUse > MoveNodeUsePair
std::map< TCEString, MoveNodeUse > MoveNodeUseMap
std::set< MoveNodeUse > MoveNodeUseSet
std::pair< TCEString, MoveNodeUseSet > MoveNodeUseSetPair
std::map< TCEString, MoveNodeUseSet > MoveNodeUseMapSet