9 #include <boost/foreach.hpp>
10 #include <boost/graph/adjacency_list.hpp>
11 #include <boost/graph/topological_sort.hpp>
16 using namespace boost;
20 template<
class CfgNodeT>
22 const vector<CfgNodeT>& startNodes)
25 set<CfgNodeT> visitedNodes;
26 vector<CfgNodeT> worklist;
28 worklist.insert(worklist.end(), startNodes.begin(), startNodes.end());
30 while (!worklist.empty())
32 CfgNodeT currentNode = worklist.back();
34 visitedNodes.insert(currentNode);
37 ROSE_ASSERT(dominanceFrontiers.count(currentNode) != 0);
38 const set<CfgNodeT>& dominanceFrontier = dominanceFrontiers.find(currentNode)->second;
42 BOOST_FOREACH(CfgNodeT dfNode, dominanceFrontier)
44 if (visitedNodes.count(dfNode) > 0)
47 result.insert(dfNode);
48 worklist.push_back(dfNode);
58 template<
class CfgNodeT,
class CfgEdgeT>
60 map<CfgNodeT, CfgNodeT>* iPostDominatorMap)
65 ControlFlowGraph functionCfg(func);
68 typename ControlFlowGraph::VertexVertexMap dominatorTreeMap = functionCfg.getDominatorTree();
71 typedef adjacency_list<vecS, vecS, bidirectionalS, CfgNodeT> TreeType;
73 typedef typename graph_traits<TreeType>::vertex_descriptor TreeVertex;
75 set<CfgNodeT> addedNodes;
76 map<CfgNodeT, TreeVertex> cfgNodeToVertex;
78 BOOST_FOREACH(
typename ControlFlowGraph::VertexVertexMap::value_type& nodeDominatorPair, dominatorTreeMap)
80 CfgNodeT node = *functionCfg[nodeDominatorPair.first];
81 CfgNodeT dominator = *functionCfg[nodeDominatorPair.second];
83 if (addedNodes.count(dominator) == 0)
85 TreeVertex newVertex = add_vertex(domTree);
86 cfgNodeToVertex[dominator] = newVertex;
87 domTree[newVertex] = dominator;
88 addedNodes.insert(dominator);
91 if (addedNodes.count(node) == 0)
93 TreeVertex newVertex = add_vertex(domTree);
94 cfgNodeToVertex[node] = newVertex;
95 domTree[newVertex] = node;
96 addedNodes.insert(node);
100 add_edge(cfgNodeToVertex[dominator], cfgNodeToVertex[node], domTree);
102 if (iDominatorMap != NULL)
104 ROSE_ASSERT(iDominatorMap->count(node) == 0);
105 iDominatorMap->insert(make_pair(node, dominator));
110 vector<TreeVertex> reverseTopological;
111 topological_sort(domTree, back_inserter(reverseTopological));
114 map<CfgNodeT, set<CfgNodeT> > dominanceFrontiers;
116 BOOST_FOREACH(TreeVertex v, reverseTopological)
118 CfgNodeT currentNode = domTree[v];
119 set<CfgNodeT>& currentDominanceFrontier = dominanceFrontiers[currentNode];
123 BOOST_FOREACH(CfgEdgeT outEdge, currentNode.outEdges())
125 CfgNodeT successor = outEdge.target();
128 typename ControlFlowGraph::Vertex successorVertex = functionCfg.getVertexForNode(successor);
133 ROSE_ASSERT(successorVertex != ControlFlowGraph::GraphTraits::null_vertex());
135 ROSE_ASSERT(dominatorTreeMap.count(successorVertex) == 1);
136 typename ControlFlowGraph::Vertex iDominatorVertex = dominatorTreeMap[successorVertex];
137 CfgNodeT iDominator = *functionCfg[iDominatorVertex];
140 if (iDominator != currentNode)
142 currentDominanceFrontier.insert(successor);
147 typename graph_traits<TreeType>::adjacency_iterator currentIter, lastIter;
148 for (tie(currentIter, lastIter) = adjacent_vertices(v, domTree); currentIter != lastIter; currentIter++)
150 CfgNodeT childNode = domTree[*currentIter];
151 const set<CfgNodeT>& childDominanceFrontier = dominanceFrontiers[childNode];
153 BOOST_FOREACH(CfgNodeT childDFNode, childDominanceFrontier)
156 typename ControlFlowGraph::Vertex childDFVertex = functionCfg.getVertexForNode(childDFNode);
161 ROSE_ASSERT(childDFVertex != ControlFlowGraph::GraphTraits::null_vertex());
163 ROSE_ASSERT(dominatorTreeMap.count(childDFVertex) == 1);
164 typename ControlFlowGraph::Vertex iDominatorVertex = dominatorTreeMap[childDFVertex];
165 CfgNodeT iDominator = *functionCfg[iDominatorVertex];
167 if (iDominator != currentNode)
169 currentDominanceFrontier.insert(childDFNode);
176 if (iPostDominatorMap != NULL)
178 typename ControlFlowGraph::VertexVertexMap postDominatorTreeMap = functionCfg.getPostdominatorTree();
180 BOOST_FOREACH(
typename ControlFlowGraph::VertexVertexMap::value_type& nodePostDominatorPair, postDominatorTreeMap)
182 CfgNodeT node = *functionCfg[nodePostDominatorPair.first];
183 CfgNodeT postDominator = *functionCfg[nodePostDominatorPair.second];
185 ROSE_ASSERT(iPostDominatorMap->count(node) == 0);
186 iPostDominatorMap->insert(make_pair(node, postDominator));
190 return dominanceFrontiers;