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;
|
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.
|
/// DSGraph - The graph that represents a function.
|
||||||
///
|
///
|
||||||
struct DSGraph {
|
struct DSGraph {
|
||||||
// Public data-type declarations...
|
// Public data-type declarations...
|
||||||
typedef hash_map<Value*, DSNodeHandle> ScalarMapTy;
|
typedef DSScalarMap ScalarMapTy;
|
||||||
typedef hash_map<Function*, DSNodeHandle> ReturnNodesTy;
|
typedef hash_map<Function*, DSNodeHandle> ReturnNodesTy;
|
||||||
typedef hash_set<GlobalValue*> GlobalSetTy;
|
typedef hash_set<GlobalValue*> GlobalSetTy;
|
||||||
|
|
||||||
|
@ -21,12 +21,53 @@ namespace llvm {
|
|||||||
|
|
||||||
class GlobalValue;
|
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.
|
/// DSGraph - The graph that represents a function.
|
||||||
///
|
///
|
||||||
struct DSGraph {
|
struct DSGraph {
|
||||||
// Public data-type declarations...
|
// Public data-type declarations...
|
||||||
typedef hash_map<Value*, DSNodeHandle> ScalarMapTy;
|
typedef DSScalarMap ScalarMapTy;
|
||||||
typedef hash_map<Function*, DSNodeHandle> ReturnNodesTy;
|
typedef hash_map<Function*, DSNodeHandle> ReturnNodesTy;
|
||||||
typedef hash_set<GlobalValue*> GlobalSetTy;
|
typedef hash_set<GlobalValue*> GlobalSetTy;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user