From: Vikram S. Adve Date: Wed, 16 Jul 2003 21:45:15 +0000 (+0000) Subject: (1) Added DSGraph::cloneReachableSubgraph and DSGraph::cloneReachableNodes X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a53e3da92c6dea476c58f99da6d3c5f75be38adc;p=oota-llvm.git (1) Added DSGraph::cloneReachableSubgraph and DSGraph::cloneReachableNodes to clone the subgraph reachable from a set of root nodes, into the current graph, merging the global nodes into those in the current graph. (2) Added DSGraph::updateFromGlobalGraph() to rematerialize nodes from the globals graph into the current graph in both BU and TD passes. (3) Added hash_set InlinedGlobals: a set of globals to track which globals have been inlined into the current graph from callers or callees. In the TD pass, such globals are up-to-date and do not need to be rematerialized from the GlobalsGraph. (4) Added StripIncompleteBit/KeepIncompleteBit to remove incomplete bit when cloning nodes into the globals graph. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7190 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/DSGraph.h b/include/llvm/Analysis/DSGraph.h index 06b694220db..4df269c12d1 100644 --- a/include/llvm/Analysis/DSGraph.h +++ b/include/llvm/Analysis/DSGraph.h @@ -8,6 +8,7 @@ #define LLVM_ANALYSIS_DSGRAPH_H #include "llvm/Analysis/DSNode.h" +class GlobalValue; //===----------------------------------------------------------------------===// /// DSGraph - The graph that represents a function. @@ -16,6 +17,7 @@ struct DSGraph { // Public data-type declarations... typedef hash_map ScalarMapTy; typedef hash_map ReturnNodesTy; + typedef hash_set GlobalSetTy; /// NodeMapTy - This data type is used when cloning one graph into another to /// keep track of the correspondence between the nodes in the old and new @@ -48,7 +50,13 @@ private: // std::vector AuxFunctionCalls; + // InlinedGlobals - This set records which globals have been inlined from + // other graphs (callers or callees, depending on the pass) into this one. + // + GlobalSetTy InlinedGlobals; + void operator=(const DSGraph &); // DO NOT IMPLEMENT + public: // Create a new, empty, DSGraph. DSGraph() : GlobalsGraph(0), PrintAuxCalls(false) {} @@ -111,6 +119,13 @@ public: return AuxFunctionCalls; } + /// getInlinedGlobals - Get the set of globals that are have been inlined + /// (from callees in BU or from callers in TD) into the current graph. + /// + GlobalSetTy& getInlinedGlobals() { + return InlinedGlobals; + } + /// getNodeForValue - Given a value that is used or defined in the body of the /// current function, return the DSNode that it points to. /// @@ -199,12 +214,28 @@ public: /// CloneFlags enum - Bits that may be passed into the cloneInto method to /// specify how to clone the function graph. enum CloneFlags { - StripAllocaBit = 1 << 0, KeepAllocaBit = 0 << 0, - DontCloneCallNodes = 1 << 1, CloneCallNodes = 0 << 0, - DontCloneAuxCallNodes = 1 << 2, CloneAuxCallNodes = 0 << 0, - StripModRefBits = 1 << 3, KeepModRefBits = 0 << 0, + StripAllocaBit = 1 << 0, KeepAllocaBit = 0, + DontCloneCallNodes = 1 << 1, CloneCallNodes = 0, + DontCloneAuxCallNodes = 1 << 2, CloneAuxCallNodes = 0, + StripModRefBits = 1 << 3, KeepModRefBits = 0, + StripIncompleteBit = 1 << 4, KeepIncompleteBit = 0, }; +private: + void cloneReachableNodes(const DSNode* Node, + unsigned BitsToClear, + NodeMapTy& OldNodeMap, + NodeMapTy& CompletedNodeMap); + +public: + void updateFromGlobalGraph(); + + void cloneReachableSubgraph(const DSGraph& G, + const hash_set& RootNodes, + NodeMapTy& OldNodeMap, + NodeMapTy& CompletedNodeMap, + unsigned CloneFlags = 0); + /// cloneInto - Clone the specified DSGraph into the current graph. The /// translated ScalarMap for the old function is filled into the OldValMap /// member, and the translated ReturnNodes map is returned into ReturnNodes. diff --git a/include/llvm/Analysis/DataStructure/DSGraph.h b/include/llvm/Analysis/DataStructure/DSGraph.h index 06b694220db..4df269c12d1 100644 --- a/include/llvm/Analysis/DataStructure/DSGraph.h +++ b/include/llvm/Analysis/DataStructure/DSGraph.h @@ -8,6 +8,7 @@ #define LLVM_ANALYSIS_DSGRAPH_H #include "llvm/Analysis/DSNode.h" +class GlobalValue; //===----------------------------------------------------------------------===// /// DSGraph - The graph that represents a function. @@ -16,6 +17,7 @@ struct DSGraph { // Public data-type declarations... typedef hash_map ScalarMapTy; typedef hash_map ReturnNodesTy; + typedef hash_set GlobalSetTy; /// NodeMapTy - This data type is used when cloning one graph into another to /// keep track of the correspondence between the nodes in the old and new @@ -48,7 +50,13 @@ private: // std::vector AuxFunctionCalls; + // InlinedGlobals - This set records which globals have been inlined from + // other graphs (callers or callees, depending on the pass) into this one. + // + GlobalSetTy InlinedGlobals; + void operator=(const DSGraph &); // DO NOT IMPLEMENT + public: // Create a new, empty, DSGraph. DSGraph() : GlobalsGraph(0), PrintAuxCalls(false) {} @@ -111,6 +119,13 @@ public: return AuxFunctionCalls; } + /// getInlinedGlobals - Get the set of globals that are have been inlined + /// (from callees in BU or from callers in TD) into the current graph. + /// + GlobalSetTy& getInlinedGlobals() { + return InlinedGlobals; + } + /// getNodeForValue - Given a value that is used or defined in the body of the /// current function, return the DSNode that it points to. /// @@ -199,12 +214,28 @@ public: /// CloneFlags enum - Bits that may be passed into the cloneInto method to /// specify how to clone the function graph. enum CloneFlags { - StripAllocaBit = 1 << 0, KeepAllocaBit = 0 << 0, - DontCloneCallNodes = 1 << 1, CloneCallNodes = 0 << 0, - DontCloneAuxCallNodes = 1 << 2, CloneAuxCallNodes = 0 << 0, - StripModRefBits = 1 << 3, KeepModRefBits = 0 << 0, + StripAllocaBit = 1 << 0, KeepAllocaBit = 0, + DontCloneCallNodes = 1 << 1, CloneCallNodes = 0, + DontCloneAuxCallNodes = 1 << 2, CloneAuxCallNodes = 0, + StripModRefBits = 1 << 3, KeepModRefBits = 0, + StripIncompleteBit = 1 << 4, KeepIncompleteBit = 0, }; +private: + void cloneReachableNodes(const DSNode* Node, + unsigned BitsToClear, + NodeMapTy& OldNodeMap, + NodeMapTy& CompletedNodeMap); + +public: + void updateFromGlobalGraph(); + + void cloneReachableSubgraph(const DSGraph& G, + const hash_set& RootNodes, + NodeMapTy& OldNodeMap, + NodeMapTy& CompletedNodeMap, + unsigned CloneFlags = 0); + /// cloneInto - Clone the specified DSGraph into the current graph. The /// translated ScalarMap for the old function is filled into the OldValMap /// member, and the translated ReturnNodes map is returned into ReturnNodes.