diff options
author | Chris Lattner <sabre@nondot.org> | 2004-01-28 03:01:22 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-01-28 03:01:22 +0000 |
commit | 14c67ccf02ab1de28c7e726493619881a41c4438 (patch) | |
tree | 797e1e5a348798fad74997231cb78ba08b1a5fed /include | |
parent | 18348fe20155cbfd461bfc3a2a9d4b29d6be3ec2 (diff) | |
download | llvm-14c67ccf02ab1de28c7e726493619881a41c4438.tar.gz llvm-14c67ccf02ab1de28c7e726493619881a41c4438.tar.bz2 llvm-14c67ccf02ab1de28c7e726493619881a41c4438.tar.xz |
Keep track of all of the globals inserted into the scalar map
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10995 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Analysis/DSGraph.h | 30 | ||||
-rw-r--r-- | include/llvm/Analysis/DataStructure/DSGraph.h | 30 |
2 files changed, 52 insertions, 8 deletions
diff --git a/include/llvm/Analysis/DSGraph.h b/include/llvm/Analysis/DSGraph.h index e81f139fb5..a86f5218eb 100644 --- a/include/llvm/Analysis/DSGraph.h +++ b/include/llvm/Analysis/DSGraph.h @@ -32,10 +32,12 @@ class GlobalValue; /// 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<Value*, DSNodeHandle> ValueMapTy; ValueMapTy ValueMap; + + typedef hash_set<GlobalValue*> GlobalSetTy; + GlobalSetTy GlobalSet; public: // Compatibility methods: provide an interface compatible with a map of @@ -50,15 +52,35 @@ public: 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); } + void erase(Value *V) { erase(find(V)); } - DSNodeHandle &operator[](Value *V) { return ValueMap[V]; } + DSNodeHandle &operator[](Value *V) { + std::pair<iterator,bool> IP = + ValueMap.insert(std::make_pair(V, DSNodeHandle())); + if (IP.second) { // Inserted the new entry into the map. + if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) + GlobalSet.insert(GV); + } + return IP.first->second; + } + + void erase(iterator I) { + assert(I != ValueMap.end() && "Cannot erase end!"); + if (GlobalValue *GV = dyn_cast<GlobalValue>(I->first)) + GlobalSet.erase(GV); + ValueMap.erase(I); + } void clear() { ValueMap.clear(); + GlobalSet.clear(); } + // Access to the global set: the set of all globals currently in the + // scalar map. + typedef GlobalSetTy::const_iterator global_iterator; + global_iterator global_begin() const { return GlobalSet.begin(); } + global_iterator global_end() const { return GlobalSet.end(); } }; diff --git a/include/llvm/Analysis/DataStructure/DSGraph.h b/include/llvm/Analysis/DataStructure/DSGraph.h index e81f139fb5..a86f5218eb 100644 --- a/include/llvm/Analysis/DataStructure/DSGraph.h +++ b/include/llvm/Analysis/DataStructure/DSGraph.h @@ -32,10 +32,12 @@ class GlobalValue; /// 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<Value*, DSNodeHandle> ValueMapTy; ValueMapTy ValueMap; + + typedef hash_set<GlobalValue*> GlobalSetTy; + GlobalSetTy GlobalSet; public: // Compatibility methods: provide an interface compatible with a map of @@ -50,15 +52,35 @@ public: 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); } + void erase(Value *V) { erase(find(V)); } - DSNodeHandle &operator[](Value *V) { return ValueMap[V]; } + DSNodeHandle &operator[](Value *V) { + std::pair<iterator,bool> IP = + ValueMap.insert(std::make_pair(V, DSNodeHandle())); + if (IP.second) { // Inserted the new entry into the map. + if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) + GlobalSet.insert(GV); + } + return IP.first->second; + } + + void erase(iterator I) { + assert(I != ValueMap.end() && "Cannot erase end!"); + if (GlobalValue *GV = dyn_cast<GlobalValue>(I->first)) + GlobalSet.erase(GV); + ValueMap.erase(I); + } void clear() { ValueMap.clear(); + GlobalSet.clear(); } + // Access to the global set: the set of all globals currently in the + // scalar map. + typedef GlobalSetTy::const_iterator global_iterator; + global_iterator global_begin() const { return GlobalSet.begin(); } + global_iterator global_end() const { return GlobalSet.end(); } }; |