mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-14 07:31:47 +00:00
Pull the ScalarMap out into something that is more structured than what we had
before. This allows us to have a place to implement optimizations in a structured way. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10994 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a88a55cf10
commit
18348fe201
@ -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<Value*, DSNodeHandle> 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<Value*, DSNodeHandle> ScalarMapTy;
|
||||
typedef DSScalarMap ScalarMapTy;
|
||||
typedef hash_map<Function*, DSNodeHandle> ReturnNodesTy;
|
||||
typedef hash_set<GlobalValue*> GlobalSetTy;
|
||||
|
||||
|
@ -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<Value*, DSNodeHandle> 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<Value*, DSNodeHandle> ScalarMapTy;
|
||||
typedef DSScalarMap ScalarMapTy;
|
||||
typedef hash_map<Function*, DSNodeHandle> ReturnNodesTy;
|
||||
typedef hash_set<GlobalValue*> GlobalSetTy;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user