void RTAssociate::ProcessFunctionBody(Function &F, Function &NewF, DSGraph* G, DataStructures* DS) { if (G->node_begin() == G->node_end()) return; // Quick exit if nothing to do. FuncInfo &FI = *getFuncInfo(&F); // Calculate which DSNodes are reachable from globals. If a node is reachable // from a global, we will create a global pool for it, so no argument passage // is required. G->getGlobalsGraph(); // Map all node reachable from this global to the corresponding nodes in // the globals graph. DSGraph::NodeMapTy GlobalsGraphNodeMapping; G->computeGToGGMapping(GlobalsGraphNodeMapping); // Loop over all of the nodes which are non-escaping, adding pool-allocatable // ones to the NodesToPA vector. for (DSGraph::node_iterator I = G->node_begin(), E = G->node_end(); I != E; ++I) { DSNode *N = I; if (GlobalsGraphNodeMapping.count(N)) { // If it is a global pool, set up the pool descriptor appropriately. DSNode *GGN = GlobalsGraphNodeMapping[N].getNode(); assert(getFuncInfo(0)->PoolDescriptors[GGN] && "Should be in global mapping!"); FI.PoolDescriptors[N] = getFuncInfo(0)->PoolDescriptors[GGN]; } else if (!FI.PoolDescriptors[N]) { // Otherwise, if it was not passed in from outside the function, it must // be a local pool! assert(!N->isGlobalNode() && "Should be in global mapping!"); FI.PoolDescriptors[N] = CreateLocalPool(N, NewF); } } TransformBody(NewF, FI, DS); }
// // Method: getLocalPoolNodes() // // Description: // For a given function, determine which DSNodes for that function should have // local pools created for them. // void Heuristic::getLocalPoolNodes (const Function & F, DSNodeList_t & Nodes) { // // Get the DSGraph of the specified function. If the DSGraph has no nodes, // then there is nothing we need to do. // DSGraph* G = Graphs->getDSGraph(F); if (G->node_begin() == G->node_end()) return; // // Calculate which DSNodes are reachable from globals. If a node is reachable // from a global, we will create a global pool for it, so no argument passage // is required. Graphs->getGlobalsGraph(); // Map all node reachable from this global to the corresponding nodes in // the globals graph. DSGraph::NodeMapTy GlobalsGraphNodeMapping; G->computeGToGGMapping(GlobalsGraphNodeMapping); // // Loop over all of the nodes which are non-escaping, adding pool-allocatable // ones to the NodesToPA vector. In other words, scan over the DSGraph and // find nodes for which a new pool must be created within this function. // for (DSGraph::node_iterator I = G->node_begin(), E = G->node_end(); I != E; ++I){ // Get the DSNode and, if applicable, its mirror in the globals graph DSNode * N = I; DSNode * GGN = GlobalsGraphNodeMapping[N].getNode(); // // Only the following nodes are pool allocated: // 1) Local Heap nodes // 2) Nodes which are mirrored in the globals graph and, in the globals // graph, are heap nodes. // if ((N->isHeapNode()) || (GGN && GGN->isHeapNode())) { if (!(GlobalPoolNodes.count (N) || GlobalPoolNodes.count (GGN))) { // Otherwise, if it was not passed in from outside the function, it must // be a local pool! assert((!N->isGlobalNode() || N->isPtrToIntNode()) && "Should be in global mapping!"); if(!N->isPtrToIntNode()) { Nodes.push_back (N); } } } } return; }