[llvm-commits] CVS: llvm/include/llvm/Analysis/DataStructure/DSGraph.h
Chris Lattner
lattner at cs.uiuc.edu
Sat Mar 19 14:13:26 PST 2005
Changes in directory llvm/include/llvm/Analysis/DataStructure:
DSGraph.h updated: 1.94 -> 1.95
---
Log message:
Make each scalar map contain a reference to an equivalence class of global
variables. Do not insert a global into the scalar map unless it is the
leader of its equivalence class.
---
Diffs of the changes: (+79 -16)
DSGraph.h | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 79 insertions(+), 16 deletions(-)
Index: llvm/include/llvm/Analysis/DataStructure/DSGraph.h
diff -u llvm/include/llvm/Analysis/DataStructure/DSGraph.h:1.94 llvm/include/llvm/Analysis/DataStructure/DSGraph.h:1.95
--- llvm/include/llvm/Analysis/DataStructure/DSGraph.h:1.94 Thu Mar 17 17:45:35 2005
+++ llvm/include/llvm/Analysis/DataStructure/DSGraph.h Sat Mar 19 16:13:13 2005
@@ -17,6 +17,7 @@
#include "llvm/Analysis/DataStructure/DSNode.h"
#include "llvm/ADT/hash_map"
+#include "llvm/ADT/EquivalenceClasses.h"
#include <list>
namespace llvm {
@@ -40,7 +41,12 @@
typedef hash_set<GlobalValue*> GlobalSetTy;
GlobalSetTy GlobalSet;
+
+ EquivalenceClasses<GlobalValue*> &GlobalECs;
public:
+ DSScalarMap(EquivalenceClasses<GlobalValue*> &ECs) : GlobalECs(ECs) {}
+
+ EquivalenceClasses<GlobalValue*> &getGlobalECs() const { return GlobalECs; }
// Compatibility methods: provide an interface compatible with a map of
// Value* to DSNodeHandle's.
@@ -50,11 +56,44 @@
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(Value *V) { erase(find(V)); }
+ GlobalValue *getLeaderForGlobal(GlobalValue *GV) const {
+ EquivalenceClasses<GlobalValue*>::iterator ECI = GlobalECs.findValue(GV);
+ if (ECI == GlobalECs.end()) return GV;
+ return *GlobalECs.findLeader(ECI);
+ }
+
+
+ iterator find(Value *V) {
+ iterator I = ValueMap.find(V);
+ if (I != ValueMap.end()) return I;
+
+ if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
+ // If this is a global, check to see if it is equivalenced to something
+ // in the map.
+ GlobalValue *Leader = getLeaderForGlobal(GV);
+ if (Leader != GV)
+ I = ValueMap.find((Value*)Leader);
+ }
+ return I;
+ }
+ const_iterator find(Value *V) const {
+ const_iterator I = ValueMap.find(V);
+ if (I != ValueMap.end()) return I;
+
+ if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
+ // If this is a global, check to see if it is equivalenced to something
+ // in the map.
+ GlobalValue *Leader = getLeaderForGlobal(GV);
+ if (Leader != GV)
+ I = ValueMap.find((Value*)Leader);
+ }
+ return I;
+ }
+
+ unsigned count(Value *V) const { return ValueMap.find(V) != ValueMap.end(); }
+
+ void erase(Value *V) { erase(ValueMap.find(V)); }
void eraseIfExists(Value *V) {
iterator I = find(V);
@@ -79,14 +118,30 @@
ValueMap.insert(std::make_pair(New, I->second));
}
+
+ /// operator[] - Return the DSNodeHandle for the specified value, creating a
+ /// new null handle if there is no entry yet.
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);
+ iterator I = ValueMap.find(V);
+ if (I != ValueMap.end())
+ return I->second; // Return value if already exists.
+
+ if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
+ // If the node doesn't exist, check to see if it's a global that is
+ // equated to another global in the program.
+ EquivalenceClasses<GlobalValue*>::iterator ECI = GlobalECs.findValue(GV);
+ if (ECI != GlobalECs.end()) {
+ GlobalValue *Leader = *GlobalECs.findLeader(ECI);
+ if (Leader != GV)
+ return operator[]((Value*)Leader);
+ }
+
+ // Okay, this is either not an equivalenced global or it is the leader, it
+ // will be inserted into the scalar map now.
+ GlobalSet.insert(GV);
}
- return IP.first->second;
+
+ return ValueMap.insert(std::make_pair(V, DSNodeHandle())).first->second;
}
void erase(iterator I) {
@@ -167,14 +222,15 @@
const TargetData &TD;
void operator=(const DSGraph &); // DO NOT IMPLEMENT
-
+ DSGraph(const DSGraph&); // DO NOT IMPLEMENT
public:
// Create a new, empty, DSGraph.
- DSGraph(const TargetData &td)
- : GlobalsGraph(0), PrintAuxCalls(false), TD(td) {}
+ DSGraph(EquivalenceClasses<GlobalValue*> &ECs, const TargetData &td)
+ : GlobalsGraph(0), PrintAuxCalls(false), ScalarMap(ECs), TD(td) {}
// Compute the local DSGraph
- DSGraph(const TargetData &td, Function &F, DSGraph *GlobalsGraph);
+ DSGraph(EquivalenceClasses<GlobalValue*> &ECs, const TargetData &TD,
+ Function &F, DSGraph *GlobalsGraph);
// Copy ctor - If you want to capture the node mapping between the source and
// destination graph, you may optionally do this by specifying a map to record
@@ -184,13 +240,20 @@
// source. You need to set a new GlobalsGraph with the setGlobalsGraph
// method.
//
- DSGraph(const DSGraph &DSG);
- DSGraph(const DSGraph &DSG, NodeMapTy &NodeMap);
+ DSGraph(const DSGraph &DSG, EquivalenceClasses<GlobalValue*> &ECs);
+ DSGraph(const DSGraph &DSG, NodeMapTy &NodeMap,
+ EquivalenceClasses<GlobalValue*> &ECs);
~DSGraph();
DSGraph *getGlobalsGraph() const { return GlobalsGraph; }
void setGlobalsGraph(DSGraph *G) { GlobalsGraph = G; }
+ /// getGlobalECs - Return the set of equivalence classes that the global
+ /// variables in the program form.
+ EquivalenceClasses<GlobalValue*> &getGlobalECs() const {
+ return ScalarMap.getGlobalECs();
+ }
+
/// getTargetData - Return the TargetData object for the current target.
///
const TargetData &getTargetData() const { return TD; }
More information about the llvm-commits
mailing list