summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-01-28 03:01:22 +0000
committerChris Lattner <sabre@nondot.org>2004-01-28 03:01:22 +0000
commit14c67ccf02ab1de28c7e726493619881a41c4438 (patch)
tree797e1e5a348798fad74997231cb78ba08b1a5fed /include
parent18348fe20155cbfd461bfc3a2a9d4b29d6be3ec2 (diff)
downloadllvm-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.h30
-rw-r--r--include/llvm/Analysis/DataStructure/DSGraph.h30
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(); }
};