diff --git a/include/llvm/Analysis/DSGraph.h b/include/llvm/Analysis/DSGraph.h index b4dcb51ec88..e81f139fb5f 100644 --- a/include/llvm/Analysis/DSGraph.h +++ b/include/llvm/Analysis/DSGraph.h @@ -21,12 +21,53 @@ namespace llvm { class GlobalValue; +//===----------------------------------------------------------------------===// +/// DSScalarMap - An instance of this class is used to keep track of all of +/// which DSNode each scalar in a function points to. This is specialized to +/// keep track of globals with nodes in the function, and to keep track of the +/// unique DSNodeHandle being used by the scalar map. +/// +/// This class is crucial to the efficiency of DSA with some large SCC's. In +/// these cases, the cost of iterating over the scalar map dominates the cost +/// of DSA. In all of these cases, the DSA phase is really trying to identify +/// globals or unique node handles active in the function. +/// + +class DSScalarMap { + typedef hash_map ValueMapTy; + ValueMapTy ValueMap; +public: + + // Compatibility methods: provide an interface compatible with a map of + // Value* to DSNodeHandle's. + typedef ValueMapTy::const_iterator const_iterator; + typedef ValueMapTy::iterator iterator; + iterator begin() { return ValueMap.begin(); } + iterator end() { return ValueMap.end(); } + const_iterator begin() const { return ValueMap.begin(); } + const_iterator end() const { return ValueMap.end(); } + iterator find(Value *V) { return ValueMap.find(V); } + const_iterator find(Value *V) const { return ValueMap.find(V); } + unsigned count(Value *V) const { return ValueMap.count(V); } + + void erase(iterator I) { ValueMap.erase(I); } + void erase(Value *V) { ValueMap.erase(V); } + + DSNodeHandle &operator[](Value *V) { return ValueMap[V]; } + + void clear() { + ValueMap.clear(); + } + +}; + + //===----------------------------------------------------------------------===// /// DSGraph - The graph that represents a function. /// struct DSGraph { // Public data-type declarations... - typedef hash_map ScalarMapTy; + typedef DSScalarMap ScalarMapTy; typedef hash_map ReturnNodesTy; typedef hash_set GlobalSetTy; diff --git a/include/llvm/Analysis/DataStructure/DSGraph.h b/include/llvm/Analysis/DataStructure/DSGraph.h index b4dcb51ec88..e81f139fb5f 100644 --- a/include/llvm/Analysis/DataStructure/DSGraph.h +++ b/include/llvm/Analysis/DataStructure/DSGraph.h @@ -21,12 +21,53 @@ namespace llvm { class GlobalValue; +//===----------------------------------------------------------------------===// +/// DSScalarMap - An instance of this class is used to keep track of all of +/// which DSNode each scalar in a function points to. This is specialized to +/// keep track of globals with nodes in the function, and to keep track of the +/// unique DSNodeHandle being used by the scalar map. +/// +/// This class is crucial to the efficiency of DSA with some large SCC's. In +/// these cases, the cost of iterating over the scalar map dominates the cost +/// of DSA. In all of these cases, the DSA phase is really trying to identify +/// globals or unique node handles active in the function. +/// + +class DSScalarMap { + typedef hash_map ValueMapTy; + ValueMapTy ValueMap; +public: + + // Compatibility methods: provide an interface compatible with a map of + // Value* to DSNodeHandle's. + typedef ValueMapTy::const_iterator const_iterator; + typedef ValueMapTy::iterator iterator; + iterator begin() { return ValueMap.begin(); } + iterator end() { return ValueMap.end(); } + const_iterator begin() const { return ValueMap.begin(); } + const_iterator end() const { return ValueMap.end(); } + iterator find(Value *V) { return ValueMap.find(V); } + const_iterator find(Value *V) const { return ValueMap.find(V); } + unsigned count(Value *V) const { return ValueMap.count(V); } + + void erase(iterator I) { ValueMap.erase(I); } + void erase(Value *V) { ValueMap.erase(V); } + + DSNodeHandle &operator[](Value *V) { return ValueMap[V]; } + + void clear() { + ValueMap.clear(); + } + +}; + + //===----------------------------------------------------------------------===// /// DSGraph - The graph that represents a function. /// struct DSGraph { // Public data-type declarations... - typedef hash_map ScalarMapTy; + typedef DSScalarMap ScalarMapTy; typedef hash_map ReturnNodesTy; typedef hash_set GlobalSetTy;