41#include <boost/graph/depth_first_search.hpp>
42#include <boost/graph/properties.hpp>
43#include <boost/graph/strong_components.hpp>
44#include <boost/graph/graph_utility.hpp>
45#include <boost/graph/topological_sort.hpp>
46#include <boost/graph/exception.hpp>
47#include <boost/format.hpp>
48#include <boost/graph/graphviz.hpp>
111 for (
int i = 0; i < cdg.
nodeCount(); i++) {
134 std::pair<ControlDependenceNode*, ProgramDependenceNode*>(
138 std::pair<BasicBlockNode*, ControlDependenceNode*>(
144 std::pair<BasicBlockNode*, ControlDependenceNode*>(
150 for (
int i = 0; i < cdg.
edgeCount(); i++) {
183 for (
int i = 0; i < ddg.
nodeCount(); i++) {
184 Node* newNode = NULL;
189 node.move().isControlFlowMove() &&
190 !
node.move().isUnconditional()) {
192 }
else if (
node.isMove() &&
193 node.move().isControlFlowMove() &&
194 node.move().isJump() &&
195 !
node.move().isReturn()){
204 movePD.insert(std::pair<MoveNode*, ProgramDependenceNode*>(
209 for (
int j = 0; j < ddg.
edgeCount(); j++) {
229 for (
int i = 0; i < ddg.
nodeCount(); i++) {
242 "No Control Dependence Node for Basic Block Node!");
269 std::vector<Node*> tmp;
270 tmp.push_back(pNode);
271 moveToCD[cNode] = tmp;
273 std::vector<Node*> tmp = moveToCD[cNode];
274 tmp.push_back(pNode);
275 moveToCD[cNode] = tmp;
280 for (
int j = 0; j < cdg.
inDegree(*cNode); j++) {
338 "Guarded jump (%s) has inDegree different from 2! Degree =%d.\n")
341 for (EdgeSet::iterator ei = e.begin(); ei != e.end(); ei++) {
344 << (*ei)->toString() <<
" ";
348 for (
int i = 0; i <
inDegree(pNode); i++) {
349 if (
inEdge(pNode,i).isDataDependence()) {
354 if (guardSource == NULL) {
357 "Guarded jump did not have source of guard defined!");
388 "Basic block with guarded jump does not have"
389 " Region nodes as control dependent!");
405 "\tStarting PDG serialization for %s with %d nodes and %d edges.\n")
412 auto timer = std::chrono::steady_clock::now();
420 componentMap, rootMap, filteredCDG);
421 elapsed = std::chrono::duration_cast<std::chrono::seconds>(
422 std::chrono::steady_clock::now() - timer)
426 "\t\tStrong components:%d components, %d minutes and %d seconds.\n")
427 % componentCount % (elapsed/60) % (elapsed%60)).str();
436 Color colorsDFS(colorMap);
439 boost::time_stamper<PDGOrder, int, boost::on_finish_vertex>
440 lastOrderStamper(lastOrder, fStamp);
441 timer = std::chrono::steady_clock::now();
443 boost::depth_first_visit(
445 boost::make_dfs_visitor(lastOrderStamper), colorsDFS);
446 elapsed = std::chrono::duration_cast<std::chrono::seconds>(
447 std::chrono::steady_clock::now() - timer)
451 "\t\tPost order: %d minutes and %d seconds.\n")
452 % (elapsed/60) % (elapsed%60)).str();
457 timer = std::chrono::steady_clock::now();
459 elapsed = std::chrono::duration_cast<std::chrono::seconds>(
460 std::chrono::steady_clock::now() - timer)
464 "\t\tRegion: %d minutes and %d seconds.\n")
465 % (elapsed/60) % (elapsed%60)).str();
469 timer = std::chrono::steady_clock::now();
471 elapsed = std::chrono::duration_cast<std::chrono::seconds>(
472 std::chrono::steady_clock::now() - timer)
476 "\t\tEEC: %d minutes and %d seconds.\n")
477 % (elapsed/60) % (elapsed%60)).str();
481 timer = std::chrono::steady_clock::now();
488 for (Node::NodesInfo::iterator k = finalNodesInfo.begin();
489 k != finalNodesInfo.end(); k++) {
500 elapsed =
static_cast<long>(timer.elapsed());
503 "\t\tRelations: %d minutes and %d seconds.\n")
504 % (elapsed/60) % (elapsed%60)).str();
508 "Procedure %s has %d nodes and %d edges.\n")
537 std::vector<std::pair<Node*, Node*> > backEdges;
538 int componentCount = 0;
539 int currentComponents = 0;
540 int numberOfNodes = 0;
545 PDGOrder componentOrder(components);
547 currentComponents = 0;
549 numberOfNodes = boost::num_vertices(cdg);
550 currentComponents = boost::strong_components(
551 cdg, componentOrder, boost::root_map(componentRoots));
554 std::vector<std::set<Node*> > componentVector;
555 componentVector.resize(componentCount + currentComponents);
559 if (currentComponents == numberOfNodes) {
568 for (PDGOrderMap::iterator iterA = components.begin();
569 iterA != components.end(); iterA ++) {
570 Node* cNode = cdg[(*iterA).first];
571 componentVector[(*iterA).second].insert(cNode);
573 for (
unsigned int i = componentCount; i < componentVector.size(); i++){
574 if (componentVector[i].size() > 1) {
575 std::set<Node*>& vector = componentVector[i];
578 for (std::set<Node*>::iterator iterB = vector.begin();
579 iterB != vector.end();
583 if ((*iterB)->component() == -1){
594 std::vector<std::pair<Node*,int> > newEntry;
597 std::map<Node*, std::vector<Node*> > incomingToEntry;
598 for (
unsigned int i = componentCount;
602 for (std::set<Node*>::iterator iterD = nodes.begin();
603 iterD != nodes.end();
613 Node* testedNode = cdg[boost::source(*ei, cdg)];
614 if (nodes.find(testedNode) == nodes.end()) {
617 if (!(*iterD)->isLoopEntryNode(i)) {
620 std::pair<Node*,int>(*iterD,i));
621 incomingToEntry[*iterD].push_back(testedNode);
626 incomingToEntry[*iterD].push_back(testedNode);
635 for (
unsigned int j = 0; j < newEntry.size(); j++) {
636 Node* loopNode = newEntry[j].first;
637 std::set<Node*>& nodes =
650 std::vector<Edge*> storeEdges;
656 Node* sourceNode = cdg[boost::source(*ei, cdg)];
657 if (nodes.find(sourceNode) != nodes.end()){
660 storeEdges.push_back(
edge);
664 for (
unsigned int counter = 0;
665 counter < storeEdges.size();
667 moveInEdge(*loopNode, *close, *storeEdges[counter]);
671 std::pair<Node*, Node*>(close, loopNode));
676 TCEString msg =
"Close node for loop entry node ";
677 msg += loopNode->
toString() +
" was not connected!";
684 std::vector<Node*> tmp =
686 incomingToEntry, loopNode);
687 if (tmp.size() > 1) {
692 for (
unsigned int i = 0; i < tmp.size(); i++) {
693 Node* input = tmp[i];
708 for (
unsigned int i = 0; i < backEdges.size(); i++) {
712 connectNodes(*backEdges[i].first, *backEdges[i].second, *pdgEdge);
717 std::cerr <<
"\tComponent: " << i << std::endl;
720 std::cerr <<
"\t\t" << (*iter)->toString() << std::endl;
722 std::cerr << std::endl;
725 return componentCount;
746 int mapSize = orderMap.size();
749 "No nodes in CDG graph for " +
name() +
"!");
754 for (
int i = mapSize -1 ; i >= 0 ; i--) {
758 if (!
node->isLoopEntryNode()) {
763 for (Node::NodesInfo::iterator k = finalNodesInfo.begin();
764 k != finalNodesInfo.end(); k++) {
765 node->addToRegion(**k);
768 }
else if (
node->region().size() == 0) {
774 std::vector<Node*> entries;
776 for (std::set<Node*>::iterator si = component.begin();
777 si != component.end(); si++) {
779 if ((*si)->isLoopEntryNode(
node->component())) {
780 entries.push_back(*si);
784 for (
unsigned int i = 0; i < entries.size(); i++) {
789 for (
unsigned j = 0; j < entries.size(); j++) {
790 Node* result = entries[j];
791 for (Node::NodesInfo::iterator k = finalNodesInfo.begin();
792 k != finalNodesInfo.end();
818 int mapSize = orderMap.size();
820 for (
int i = 0; i < mapSize; i++) {
826 if (
node->eec().size() > 0) {
831 if (
node->isLoopCloseNode() &&
node->eec().size() == 0) {
832 std::vector<Node*> closeNodes;
835 for (std::set<Node*>::iterator si = component.begin();
836 si != component.end(); si++) {
837 if ((*si)->isLoopCloseNode()) {
838 closeNodes.push_back(*si);
839 }
else if ((*si)->isRegionNode()
840 || (*si)->isPredicateMoveNode()) {
841 (*si)->setLastNode();
846 finalInfo.insert(
node->region().begin(),
node->region().end());
847 for (
unsigned int i = 0; i < closeNodes.size(); i++) {
849 finalInfo, closeNodes[i]->region(), storeResult);
850 finalInfo.swap(storeResult);
854 for (
unsigned j = 0; j < closeNodes.size(); j++) {
855 Node* result = closeNodes[j];
857 if(result->
eec().size() != 0) {
859 "Close node %s in %s already has eec!\n")
863 for (Node::NodesInfo::iterator k = finalInfo.begin();
864 k != finalInfo.end(); k++) {
869 }
else if (boost::out_degree(
descriptor(*
node), filteredCDG) == 0) {
872 for (Node::NodesInfo::iterator t = regionX.begin();
873 t != regionX.end(); t++) {
874 node->addToEEC( **t);
885 Node* testedNode = filteredCDG[boost::target(*ei, filteredCDG)];
886 childNodes.insert(testedNode);
892 (*(childNodes.begin()))->eec().begin(),
893 (*(childNodes.begin()))->eec().end());
895 for(Node::NodesInfo::iterator j = childNodes.begin();
896 j != childNodes.end(); j++ ) {
899 finalEEC.swap(storeResult);
902 std::vector<Node*> result(finalEEC.size(), NULL);
905 std::vector<Node*>::iterator resultEnd =
906 std::set_difference(finalEEC.begin(), finalEEC.end(),
907 childNodes.begin(), childNodes.end(), result.begin());
909 for (std::vector<Node*>::iterator t = result.begin();
910 t != resultEnd; t++) {
933#ifdef AVOID_COMPILER_WARNINGS_REMOVE_THESE_LINES
978 && AinA ==
true && BinB ==
true) {
999 && AinA ==
false && BinB ==
true) {
1004 && AinA ==
true && BinB ==
false) {
1009 && AinA ==
false && BinB ==
false) {
1081 "Found two regions with identical control dependencies. "
1082 "Known issue with CDG detection not reusing regions.\n")).str();
1103 "Trying to get entry node before it was defined!");
1124 std::vector<Node::NodesInfo> tmpResult;
1130 Node* previous = cdg[boost::source(*ei, cdg)];
1134 if (previous->
region().size() == 0 &&
1140 for (Node::NodesInfo::iterator k = addedNodesInfo.begin();
1141 k != addedNodesInfo.end();
1157 boost::out_edges(
descriptor(*previous), cdg);
1161 Node* testedNode = cdg[boost::target(*ei, cdg)];
1162 tmp.insert(testedNode);
1164 tmpResult.push_back(tmp);
1168 tmpResult.push_back(tmp);
1174 if (tmpResult.size() > 0) {
1175 finalNodesInfo.insert(
1176 tmpResult[0].begin(), tmpResult[0].end());
1181 for (
unsigned int l = 1; l < tmpResult.size(); l++) {
1184 finalNodesInfo, tmpResult[l], storeResult);
1185 finalNodesInfo.swap(storeResult);
1186 storeResult.clear();
1208 subgraphNodes.insert(regionNode);
1209 std::vector<std::pair<Node*, Node*> > newEdges;
1210 std::vector<std::pair<Node*, Node*> > unorderable;
1212 ei1 != edges.second;
1216 subgraphNodes.insert(node1);
1222 for (; ei2 != edges.second; ++ei2) {
1223 Node* node2 =
graph_[boost::target(*ei2, filteredCDG)];
1236 "Ordering error for A='%s' and B='%s'")
1239 newEdges.push_back(std::pair<Node*, Node*>(node1, node2));
1242 newEdges.push_back(std::pair<Node*, Node*>(node2, node1));
1247 "Nodes (%s) and (%s) can not "
1248 "be put into any order.\n")
1251 unorderable.push_back(
1252 std::pair<Node*, Node*>(node1, node2));
1264 for (
unsigned int i = 0; i < newEdges.size(); i++) {
1266 connectNodes(*newEdges[i].first, *newEdges[i].second, *direction);
1272 regionNode, subgraphNodes,
graph_);
1278 std::vector<NodeDescriptor> sorted;
1280 boost::topological_sort(
sub, std::back_inserter(sorted));
1281 }
catch (boost::not_a_dag & x) {
1288 std::ofstream output(outName.c_str());
1289 boost::write_graphviz(output,
sub,lb,lb);
1292 "Topological sort of %s(%s) failed.\n"
1293 "Most likely loop is present.\n")
1298 "Topological sort of %s(%s) failed.\n"
1299 "Most likely loop is present.\n")
1305 std::vector<BasicBlockNode*> leafBlocks;
1306 bool changeBB =
false;
1308 for (std::vector<NodeDescriptor>::reverse_iterator iter = sorted.rbegin();
1309 iter != sorted.rend(); iter++) {
1318 assert(leafBlocks.size() == 0 && lastBB == NULL);
1323 if (lastBB != NULL) {
1324 assert(leafBlocks.size() == 0);
1329 if (changeBB ==
true) {
1341 std::cerr <<
"Adding for lastBB != NULL" << std::endl;
1367 if (lastBB == NULL || changeBB ==
true) {
1385 if (changeBB ==
true && lastBB != NULL) {
1391 assert(leafBlocks.size() == 0);
1410 if (leafBlocks.size() > 0) {
1421 (boost::format(
" Undetected case! %s inside %s\n")
1428 if (leafBlocks.size() > 0) {
1432 if (lastBB != NULL) {
1441 unorderable.clear();
1458 int mapSize = orderMap.size();
1463 for (
int i = 0; i < mapSize; i++) {
1469 if (
node->isRegionNode()
1470 ||
node->isLoopEntryNode()) {
1474 if (
node->isPredicateMoveNode()){
1478 if (
node->isLoopCloseNode()) {
1503 for (NodeSet::iterator iter = subgraphNodes.begin();
1504 iter != subgraphNodes.end();
1508 if ((*iter) == &root) {
1513 bool copyInsteadOfMove =
false;
1514 if (!(*iter)->isMoveNode()) {
1517 int parentCount = boost::in_degree(
descriptor(**iter), filteredCDG);
1518 if (parentCount > 1) {
1519 copyInsteadOfMove =
true;
1524 for (EdgeSet::iterator ein = inputs.begin();
1525 ein != inputs.end();
1530 if (!(*ein)->isDataDependence() || (*ein)->fixed()) {
1535 Edge* testedEdge = *ein;
1537 bool duplicateEdge =
false;
1538 for (EdgeSet::iterator testIter = inputEdges.begin();
1539 testIter != inputEdges.end();
1541 if (!(*testIter)->isDataDependence()) {
1545 (*testIter)->dataDependenceEdge().dependenceType())
1548 (*testIter)->dataDependenceEdge().edgeReason())) {
1551 duplicateEdge =
true;
1554 if (copyInsteadOfMove && !duplicateEdge) {
1558 }
else if (duplicateEdge) {
1572 for (EdgeSet::iterator eout = outputs.begin();
1573 eout != outputs.end();
1578 if (!(*eout)->isDataDependence() || (*eout)->fixed()) {
1583 Edge* testedEdge = *eout;
1585 bool duplicateEdge =
false;
1586 for (EdgeSet::iterator testIter = outputEdges.begin();
1587 testIter != outputEdges.end();
1589 if (!(*testIter)->isDataDependence()) {
1593 (*testIter)->dataDependenceEdge().dependenceType())
1596 (*testIter)->dataDependenceEdge().edgeReason())) {
1599 duplicateEdge =
true;
1602 if (copyInsteadOfMove && !duplicateEdge) {
1606 }
else if (duplicateEdge) {
1615 (*eout)->setFixed();
1650 if (
node->isRegionNode()
1651 ||
node->isLoopEntryNode()
1652 ||
node->isLoopCloseNode()) {
1656 cNode = &
node->cdgNode();
1667 bBlockToCDNode, BB);
1670 "No CD node for basic block!" + BB->
toString());
1675 std::vector<Node*> nodesInBB = moveToCD[cNode];
1676 int currentComponent = cNode->
component();
1677 for (
unsigned int i = 0; i < nodesInBB.size(); i++) {
1680 nodesInBB[i]->setComponent(currentComponent);
1686 for (ControlDependenceNode::NodesInfo::iterator iter = rInfo.begin();
1687 iter != rInfo.end();
1690 if ((*iter)->isRegionNode()
1691 || (*iter)->isLoopCloseNode()
1692 || (*iter)->isLoopEntryNode()) {
1693 Node* target = cDNodeToPNode[*iter];
1694 node->addToRegion(*target);
1697 std::vector<Node*> nodesInBB = moveToCD[*iter];
1698 for (
unsigned int i = 0; i < nodesInBB.size(); i++) {
1699 node->addToRegion(*nodesInBB[i]);
1712 eecInfo = cNode->
eec();
1716 &&
node->isPredicateMoveNode()
1718 node->setLastNode();
1721 for (ControlDependenceNode::NodesInfo::iterator iter =
1722 eecInfo.begin(); iter != eecInfo.end(); iter++) {
1723 if ((*iter)->isRegionNode()
1724 || (*iter)->isLoopCloseNode()
1725 || (*iter)->isLoopEntryNode()) {
1726 Node* target = cDNodeToPNode[*iter];
1727 node->addToEEC(*target);
1729 std::vector<Node*> nodesInBB = moveToCD[*iter];
1730 for (
unsigned int i = 0; i < nodesInBB.size(); i++) {
1731 node->addToEEC(*nodesInBB[i]);
1778 subgraphNodes.insert(predicate);
1797 bool hasTrue =
false;
1798 bool hasFalse =
false;
1800 ei1 != edges.second;
1803 if (
edge->isArtificialControlDependence()) {
1808 subgraphNodes.insert(
node);
1813 if(
node->newFirstBB() != NULL) {
1816 if (
edge->controlDependenceEdge().isTrueEdge()) {
1828 *bb, *
node->newFirstBB(), *newEdge);
1829 std::cerr <<
"Adding for predicate" << std::endl;
1833 if(boost::out_degree(des, filteredCDG) != 0) {
1835 "Found a node without first BB set. %s for predicate %s"
1836 " in procedure %s\n")
1841 if (
node->isLoopCloseNode()) {
1845 if (
node->isLoopEntryNode()) {
1851 if (!(hasTrue && hasFalse)) {
1867 std::vector<BasicBlockNode*> leafBlocks,
1869 for (
unsigned int i = 0; i < leafBlocks.size(); i++) {
1878 for(ControlFlowGraph::EdgeSet::iterator cfe = edges.begin();
1879 cfe != edges.end(); cfe++) {
1880 if ((*cfe)->isTrueEdge()) {
1884 if ((*cfe)->isFalseEdge()) {
1892 "Adding leaf edge from %s to %s in %s\n")
1893 % leafBlocks[i]->toString() % bb->
toString() %
name()).str();
1895 std::cerr <<
"Adding for leaf edges" << std::endl;
1912 node->setNewFirstBB(bb);
1930 for(NodeSet::iterator ni = inputs.begin(); ni != inputs.end();
1932 if((*ni)->isLoopCloseNode()
1933 && (*ni)->newFirstBB() != NULL
1934 && (*ni)->component() ==
node->component()) {
1939 edge->setBackEdge();
1941 std::cerr <<
"Adding for loop entry" << std::endl;
1954 std::vector<ControlFlowGraph::NodeDescriptor> sorted;
1956 boost::topological_sort(*
newCFG_, std::back_inserter(sorted));
1959 "CFG %s can not be topologically sorted\n")
1962 for (std::vector<ControlFlowGraph::NodeDescriptor>::reverse_iterator iter =
1964 iter != sorted.rend(); iter++) {
1966 if (
node->isNormalBB()) {
1968 POMDIsassembler::disassemble(
node->basicBlock());
1973 "Trying out %s with node count %d\n")
1991 for (
int i = 0; i < count; i++) {
2017 "Creating jump from %s to %s\n")
2034 auto jumpMove = std::make_shared<TTAProgram::Move>(
2035 jump0Terminal, jump1Terminal,
2041 for (
int i = 0; i < busNav.
count(); i++) {
2043 for (
int i = 0; i < bus->
guardCount(); i++) {
2046 if (regGuard != NULL &&
2058 for (
int i = 0; i < busNav.
count(); i++) {
2060 for (
int i = 0; i < bus->
guardCount(); i++) {
2063 if (regGuard != NULL &&
2080 std::cerr <<
" before result " << inst->
toString() << std::endl;
2082 std::cerr <<
" after result " << inst->
toString() << std::endl;
2085 "Failed to add jump for %s %s, %s, %s\n")
#define abortWithError(message)
#define assert(condition)
static int verboseLevel()
static std::ostream & logStream()
TTAProgram::BasicBlock & basicBlock()
std::string toString() const
virtual void removeEdge(Edge &e)
EdgeDescriptor descriptor(const Edge &e) const
GraphTraits::vertex_descriptor NodeDescriptor
Type with which nodes of the graph are seen internally.
virtual Node & headNode(const Edge &edge) const
virtual void copyOutEdge(const Node &destination, Edge &edge, const Node *head=NULL)
std::set< ProgramDependenceEdge *, typename GraphEdge::Comparator > EdgeSet
virtual Edge & outEdge(const Node &node, const int index) const
virtual void removeNode(Node &node)
virtual Edge & inEdge(const Node &node, const int index) const
virtual void copyInEdge(const Node &destination, Edge &edge, const Node *tail=NULL)
virtual void addNode(Node &node)
virtual void moveOutEdge(const Node &source, const Node &destination, Edge &edge, const Node *head=NULL, bool childs=false)
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.
virtual int inDegree(const Node &node) const
std::set< ProgramDependenceNode *, typename GraphNode::Comparator > NodeSet
virtual void moveInEdge(const Node &source, const Node &destination, Edge &edge, const Node *tail=NULL, bool childs=false)
virtual NodeSet predecessors(const Node &node, bool ignoreBackEdges=false, bool ignoreForwardEdges=false) const
virtual int outDegree(const Node &node) const
ProgramDependenceNode Node
The (base) node type managed by this graph.
EdgeSet connectingEdges(const Node &nTail, const Node &nHead) const
virtual EdgeSet outEdges(const Node &node) const
virtual Node & tailNode(const Edge &edge) const
virtual Edge & edge(const int index) const
Graph graph_
The internal graph structure.
virtual EdgeSet inEdges(const Node &node) const
virtual void connectNodes(const Node &nTail, const Node &nHead, Edge &e)
void invertEdgePredicate()
int componentCount() const
TTAProgram::Program * program() const
const NodesInfo & region()
bool isLoopEntryNode() const
bool isPredicateNode() const
bool isRegionNode() const
const NodesInfo & pseudoPredicateEEC()
std::set< ControlDependenceNode * > NodesInfo
Storage type for other nodes of same graph needed to define some non graph relations....
bool isLoopCloseNode() const
BasicBlockNode * basicBlockNode() const
void copyToProcedure(TTAProgram::Procedure &proc, TTAProgram::InstructionReferenceManager *irm=NULL)
void addExit(NodeSet &retSourceNodes)
static std::string toString(const T &source)
DependenceType dependenceType() const
EdgeReason edgeReason() const
const BasicBlockNode & getBasicBlockNode(const MoveNode &mn) const
std::string errorMessageStack(bool messagesOnly=false) const
virtual void writeToDotFile(const TCEString &fileName) const
std::set< GraphEdge *, typename GraphEdge::Comparator > EdgeSet
virtual std::string toString() const
std::shared_ptr< TTAProgram::Move > movePtr()
TTAProgram::Move & move()
static std::string disassemble(const TTAProgram::Move &move)
DataDependenceEdge & dataDependenceEdge()
@ PDG_EDGE_LOOP_CLOSE
Indicates Data Dependence Edge from DDG.
void moveDDGedges(Node &root, NodeSet &subgraphNodes, FilteredCDG &filteredCDG)
boost::graph_traits< FilteredCDG >::in_edge_iterator FilteredInEdgeIter
Few types to work with filtered graph.
Node * ddgEntryNode_
Stored reference to PDG equivalent of DDG ENTRYNODE.
void removeGuardedJump(ControlToProgram &, ProgramDependenceNode &, ControlDependenceNode &)
void computeEECInfo(const PDGOrderMap &orderMap, FilteredCDG &filteredCDG)
Node * entryNode_
Stores pointer to entry node of the PDG graph.
int detectStrongComponents(PDGOrderMap &components, DescriptorMap &roots, FilteredCDG &filteredCDG)
ProgramDependenceGraph(ControlDependenceGraph &cdg, DataDependenceGraph &ddg)
std::vector< std::set< Node * > > strongComponents_
stores nodes present in each of the found components
boost::graph_traits< FilteredCDG >::vertex_descriptor FilteredVertexDescriptor
void computeRegionInfo(const PDGOrderMap &orderMap, FilteredCDG &filteredCDG)
void processEntry(BasicBlockNode *firstBB)
void addLeafEdges(std::vector< BasicBlockNode * > leafs, BasicBlockNode *bb)
int insCount_
Counts new instructions when creating basic blocks.
void copyRegionEECComponent(ControlToProgram &, BBToCD &, MoveNodeToPDGNode &, MovesInCD &)
void processRegion(Node *region, FilteredCDG &filteredCDG)
std::map< const MoveNode *, ProgramDependenceNode *, MoveNode::Comparator > MoveNodeToPDGNode
void processLoopClose(Node *node)
std::map< const BasicBlockNode *, ControlDependenceNode *, BasicBlockNode::Comparator > BBToCD
std::map< NodeDescriptor, int > PDGOrderMap
Stores data to compute post order relation on CDG and strong components.
std::map< const ControlDependenceNode *, std::vector< Node * > > MovesInCD
void computeRelations(const PDGOrderMap &orderMap, FilteredCDG &filteredCDG)
std::map< NodeDescriptor, NodeDescriptor > DescriptorMap
Storage for relations between nodes.
boost::associative_property_map< ColorMap > Color
virtual ~ProgramDependenceGraph()
ControlFlowGraph * newCFG_
Newly created control flow graph.
std::pair< FilteredInEdgeIter, FilteredInEdgeIter > FilteredInEdgePair
const ControlDependenceGraph * cdg_
Stores original control dependence graph.
boost::filtered_graph< Graph, BackCFGFilter< Graph > > CFGSubgraph
TTAProgram::Program * program_
Original Program object, to get instruction reference manager.
boost::filtered_graph< Graph, CDGFilter< Graph > > FilteredCDG
Type of filtered graph with CD edges only.
boost::graph_traits< FilteredCDG >::out_edge_iterator FilteredOutEdgeIter
std::pair< FilteredOutEdgeIter, FilteredOutEdgeIter > FilteredOutEdgePair
ProgramDependenceNode & entryNode() const
const DataDependenceGraph * ddg_
Stores original data dependence graph.
CompareResult compareSiblings(Node *a, Node *b)
void processLoopEntry(Node *node, BasicBlockNode *bb)
boost::associative_property_map< PDGOrderMap > PDGOrder
void regionHelper(Node *node, FilteredCDG &filteredCDG, Node::NodesInfo &finalNodesInfo)
std::map< const ControlDependenceNode *, ProgramDependenceNode *, ControlDependenceNode::Comparator > ControlToProgram
void processPredicate(Node *predicate, FilteredCDG &filteredCDG)
void createJump(BasicBlockNode *from, BasicBlockNode *to, TTAProgram::Terminal *guardReg=NULL, ControlFlowEdge::CFGEdgePredicate predicate=ControlFlowEdge::CFLOW_EDGE_NORMAL)
boost::filtered_graph< Graph, BackFilter< Graph >, SubgraphTypeTest< NodeSet, Graph > > Subgraph
std::map< NodeDescriptor, boost::default_color_type > ColorMap
Storage for color property used by dfs.
boost::associative_property_map< DescriptorMap > Descriptors
void setNewFirstBB(BasicBlockNode *newBB)
void printRelations() const
void addLeafBlock(BasicBlockNode *newLeaf)
void addToEEC(ProgramDependenceNode &node)
void setComponent(int component)
bool isLoopCloseNode() const
BasicBlockNode * newFirstBB()
void addToRegion(ProgramDependenceNode &node)
bool isLoopEntryNode() const
void addLeafBlocks(std::vector< BasicBlockNode * > newLeafs)
void setPredicateMoveNode()
std::vector< BasicBlockNode * > leafBlocks()
std::set< ProgramDependenceNode * > NodesInfo
const NodesInfo & region()
bool isRegionNode() const
void setLoopEntryNode(int component)
std::string toString() const
bool isPredicateMoveNode() const
Guard * guard(int index) const
virtual HWOperation * operation(const std::string &name) const
virtual bool isInverted() const
ComponentType * item(int index) const
virtual BusNavigator busNavigator() const
virtual ControlUnit * controlUnit() const
int registerIndex() const
const RegisterFile * registerFile() const
InstructionAddress location() const
virtual Address endAddress() const
virtual Instruction & firstInstruction() const
virtual bool isInProgram() const
virtual void add(Instruction *ins)
virtual int instructionCount() const
virtual Address startAddress() const
virtual Instruction & lastInstruction() const
virtual Instruction & instructionAtIndex(int index) const
InstructionReference createReference(Instruction &ins)
std::string toString() const
bool hasControlFlowMove() const
void addMove(std::shared_ptr< Move > move)
MoveGuard & guard() const
Terminal & destination() const
void removeProcedure(Procedure &proc)
void addProcedure(Procedure *proc)
InstructionReferenceManager & instructionReferenceManager() const
UniversalMachine & universalMachine() const
virtual int index() const
virtual const TTAMachine::RegisterFile & registerFile() const
TTAMachine::AddressSpace & instructionAddressSpace() const
TTAMachine::Bus & universalBus() const
Filter control dependence edges only.
Filter nodes of subgraph only.