35#ifndef TTA_CONTROL_FLOW_GRAPH_HH
36#define TTA_CONTROL_FLOW_GRAPH_HH
45#include <boost/graph/reverse_graph.hpp>
46#include <boost/graph/depth_first_search.hpp>
69 class InstructionReferenceManager;
70 class POMRelocBookkeeper;
82 class MachineFunction;
83 class MachineBasicBlock;
88using boost::reverse_graph;
129 llvm::MachineFunction& mf,
159 llvm::MachineBasicBlock&
getMBB(
160 llvm::MachineFunction& mf,
192 typedef hash_map<InstructionAddress, const TTAProgram::Instruction*>
200 typedef std::pair<InstructionAddress, ControlFlowEdge::CFGEdgePredicate>
208 template <
typename EdgeDescriptor,
typename Graph >
273 int jumpInsIndex,
int jumpMoveIndex);
308 const llvm::MCInstrDesc&
313 llvm::MachineBasicBlock& mbb,
326 hash_map<InstructionAddress, BasicBlockNode*>
blocks_;
329 typedef hash_map<TTAProgram::Instruction*,TTAProgram::Instruction*>
346 mutable std::map<const TTAProgram::BasicBlock*, llvm::MachineBasicBlock*>
351 mutable std::set<std::pair<ProgramOperationPtr, llvm::MCSymbol*> >
tpos_;
354 mutable std::map<ProgramOperation*, llvm::MachineInstr*>
UInt32 InstructionAddress
#define IGNORE_COMPILER_WARNING(X)
#define POP_COMPILER_DIAGS
#define IGNORE_CLANG_WARNING(X)
GraphTraits::vertex_descriptor NodeDescriptor
Type with which nodes of the graph are seen internally.
boost::adjacency_list< boost::listS, boost::vecS, boost::bidirectionalS, Node *, Edge * > Graph
Internal graph type, providing actual graph-like operations. This type definition relies on bundled p...
std::set< ControlFlowEdge *, typename GraphEdge::Comparator > EdgeSet
Node & node(const int index) const
EdgeDescriptor connectingEdge(const Node &nTail, const Node &nHead) const
virtual const TCEString & name() const
GraphTraits::edge_descriptor EdgeDescriptor
Type with which edges of the graph are seen internally.
std::set< BasicBlockNode *, typename GraphNode::Comparator > NodeSet
DFS visitor which when finding back edge marks such edge as back edge.
void back_edge(EdgeDescriptor e, const Graph &g) const
std::vector< InstructionAddress > InstructionAddressVector
std::set< ReturnSource > ReturnSourceSet
virtual ~ControlFlowGraph()
void copyToLLVMMachineFunction(llvm::MachineFunction &mf, TTAProgram::InstructionReferenceManager *irm=NULL)
void setInstructionReferenceManager(TTAProgram::InstructionReferenceManager &irm)
void splitBasicBlocksWithCallsAndRefs()
BasicBlockNode & entryNode() const
void updateReferencesFromProcToCfg()
InsMap cfgToOriginalInstructions_
void deleteNodeAndRefs(BasicBlockNode &node)
BasicBlockNode * fallThruSuccessor(const BasicBlockNode &bbn) const
const CFGStatistics & statistics()
void createJumps(InstructionAddressMap &leaders, const InstructionAddress &leaderAddr, InstructionAddressMap &dataCodeRellocations, const TTAProgram::Procedure &procedure, int insIndex, int moveIndex)
ReturnSourceSet returnSources_
@ LAST_ELEMENT_REMOVED
jump removed, other things remain in BB
@ JUMP_REMOVED
nothing removed
void mergeNodes(BasicBlockNode &node1, BasicBlockNode &node2, DataDependenceGraph *ddg, const ControlFlowEdge &connectingEdge)
void convertBBRefsToInstRefs()
hash_map< TTAProgram::Instruction *, TTAProgram::Instruction * > InsMap
bool jumpToBBN(const TTAProgram::Terminal &jumpAddr, const BasicBlockNode &bbn) const
void addExitFromSinkNodes(BasicBlockNode *exitNode)
void createBBEdges(const TTAProgram::Procedure &procedure, InstructionAddressMap &leaders, InstructionAddressMap &dataCodeRellocations)
unsigned int findNextIndex(const TTAProgram::Procedure &proc, int jumpInsIndex, int jumpMoveIndex)
bool hasIncomingExternalJumps(const BasicBlockNode &bbn) const
void buildFrom(const TTAProgram::Procedure &procedure)
void indirectJump(InstructionAddressMap &leaders, const InstructionAddress &leaderAddr, InstructionAddressMap &dataCodeRellocations, int insIndex, int moveIndex, const TTAProgram::Procedure &procedure)
hash_map< InstructionAddress, BasicBlockNode * > blocks_
void buildMBBFromBB(llvm::MachineBasicBlock &mbb, const TTAProgram::BasicBlock &bb) const
ControlFlowEdge * incomingFTEdge(const BasicBlockNode &bbn) const
TTAProgram::InstructionReferenceManager & instructionReferenceManager()
std::map< ProgramOperation *, llvm::MachineInstr * > programOperationToMIMap_
For LLVM conversion: mapping of created MachineInstructions to TCE ProgramOperations.
bool computeLeadersFromJumpSuccessors(InstructionAddressMap &leaders, const TTAProgram::Procedure &procedure)
BasicBlockNode * fallThroughPredecessor(const BasicBlockNode &bbn) const
void copyToProcedure(TTAProgram::Procedure &proc, TTAProgram::InstructionReferenceManager *irm=NULL)
ReversedGraph & reversedGraph() const
std::pair< InstructionAddress, ControlFlowEdge::CFGEdgePredicate > ReturnSource
std::set< std::pair< ProgramOperationPtr, llvm::MCSymbol * > > tpos_
For LLVM conversion: the dummy label instructions for SPU should be created for with the given MCSymb...
reverse_graph< ControlFlowGraph::Graph > ReversedGraph
BasicBlockNode * jumpSuccessor(BasicBlockNode &bbn)
bool hasMultipleUnconditionalSuccessors(const BasicBlockNode &node) const
InterPassData * passData_
TTAProgram::Address startAddress_
BasicBlockNode * splitBB(BasicBlockNode &n, int remainingSize)
bool hasFallThruPredecessor(const BasicBlockNode &bbn)
EdgeSet incomingJumpEdges(const BasicBlockNode &bbn) const
BasicBlockNode & exitNode() const
void directJump(InstructionAddressMap &leaders, const InstructionAddress &leaderAddr, int insIndex, int moveIndex, const TTAProgram::Instruction &instructionTarget, const TTAProgram::Procedure &procedure)
void removeEntryExitEdge()
void computeLeadersFromRelocations(InstructionAddressMap &leaderSet, InstructionAddressMap &dataCodeRellocations, const TTAProgram::Procedure &procedure)
NodeSet findReachableNodes()
TTAProgram::Program * program() const
ControlFlowEdge & createControlFlowEdge(const TTAProgram::Instruction &iTail, const TTAProgram::Instruction &iHead, ControlFlowEdge::CFGEdgePredicate edgePredicate=ControlFlowEdge::CFLOW_EDGE_NORMAL, ControlFlowEdge::CFGEdgeType edgeType=ControlFlowEdge::CFLOW_EDGE_JUMP)
int findRelJumpDistance(const BasicBlockNode &src, const TTAProgram::Terminal &jumpAddr, const TTAMachine::Machine &mach) const
std::map< const TTAProgram::BasicBlock *, llvm::MachineBasicBlock * > bbMap_
bool allScheduledInBetween(const BasicBlockNode &src, const BasicBlockNode &dst) const
TTAProgram::Terminal * findJumpAddress(BasicBlockNode &src, ControlFlowEdge &e)
TTAProgram::Immediate * findLimmWrite(TTAProgram::Move &move, BasicBlockNode &bb, int moveIndex)
NodeSet findUnreachableNodes(const NodeSet &reachableNodes)
void createAllBlocks(InstructionAddressMap &leaders, const TTAProgram::Procedure &procedure)
void reverseGuardOnOutEdges(const BasicBlockNode &bbn)
void removeUnreachableNodes(const NodeSet &unreachableNodes, DataDependenceGraph *ddg)
hash_map< InstructionAddress, const TTAProgram::Instruction * > InstructionAddressMap
const llvm::MCInstrDesc & findLLVMTargetInstrDesc(TCEString name, const llvm::MCInstrInfo &tii) const
BoostGraph< BasicBlockNode, ControlFlowEdge >::NodeDescriptor NodeDescriptor
BasicBlockNode & createBlock(TTAProgram::Instruction &leader, const TTAProgram::Instruction &endBlock)
void computeLeadersFromRefManager(InstructionAddressMap &leaders, const TTAProgram::Procedure &procedure)
TTAProgram::Program * program_
TCEString procedureName() const
bool isSingleBBLoop(const BasicBlockNode &node) const
InsMap originalToCfgInstructions_
bool hasInstructionAnotherJump(const TTAProgram::Instruction &ins, int moveIndex)
TCEString printStatistics()
TTAProgram::InstructionReferenceManager * irm_
llvm::MachineBasicBlock & getMBB(llvm::MachineFunction &mf, const TTAProgram::BasicBlock &bb) const
BasicBlockNode & firstNormalNode() const
RemovedJumpData removeJumpToTarget(TTAProgram::CodeSnippet &cs, const TTAProgram::Instruction &target, int idx, DataDependenceGraph *ddg=NULL)
void optimizeBBOrdering(bool removeDeadCode, TTAProgram::InstructionReferenceManager &irm, DataDependenceGraph *ddg)
TTAProgram::Address endAddress_
BasicBlockNode * splitBasicBlockAtIndex(BasicBlockNode &bbn, int index)
const TTAProgram::Procedure * procedure_