[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/DataStructure.cpp
Chris Lattner
lattner at cs.uiuc.edu
Wed Mar 3 22:01:01 PST 2004
Changes in directory llvm/lib/Analysis/DataStructure:
DataStructure.cpp updated: 1.166 -> 1.167
---
Log message:
Only clone nodes that are needed in the caller, don't clone ALL aux calls. This improves
povray from having ~600K nodes and 300K call nodes to 65K nodes and 25K call nodes.
---
Diffs of the changes: (+48 -20)
Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp
diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.166 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.167
--- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.166 Wed Mar 3 16:01:09 2004
+++ llvm/lib/Analysis/DataStructure/DataStructure.cpp Wed Mar 3 21:57:53 2004
@@ -1183,12 +1183,22 @@
}
static bool PathExistsToClonedNode(const DSNode *N, ReachabilityCloner &RC) {
- for (df_iterator<const DSNode*> I = df_begin(N), E = df_end(N); I != E; ++I)
- if (RC.hasClonedNode(*I))
- return true;
+ if (N)
+ for (df_iterator<const DSNode*> I = df_begin(N), E = df_end(N); I != E; ++I)
+ if (RC.hasClonedNode(*I))
+ return true;
return false;
}
+static bool PathExistsToClonedNode(const DSCallSite &CS,
+ ReachabilityCloner &RC) {
+ if (PathExistsToClonedNode(CS.getRetVal().getNode(), RC))
+ return true;
+ for (unsigned i = 0, e = CS.getNumPtrArgs(); i != e; ++i)
+ if (PathExistsToClonedNode(CS.getPtrArg(i).getNode(), RC))
+ return true;
+ return false;
+}
/// mergeInGraph - The method is used for merging graphs together. If the
/// argument graph is not *this, it makes a clone of the specified graph, then
@@ -1231,20 +1241,21 @@
if (!CS.getRetVal().isNull())
RC.merge(CS.getRetVal(), Graph.getReturnNodeFor(F));
- // If requested, copy the calls or aux-calls lists.
+ // If requested, copy all of the calls.
if (!(CloneFlags & DontCloneCallNodes)) {
// Copy the function calls list...
FunctionCalls.reserve(FunctionCalls.size()+Graph.FunctionCalls.size());
for (unsigned i = 0, ei = Graph.FunctionCalls.size(); i != ei; ++i)
FunctionCalls.push_back(DSCallSite(Graph.FunctionCalls[i], RC));
}
-
+
+ // If the user has us copying aux calls (the normal case), set up a data
+ // structure to keep track of which ones we've copied over.
+ std::vector<bool> CopiedAuxCall;
if (!(CloneFlags & DontCloneAuxCallNodes)) {
- // Copy the auxiliary function calls list...
AuxFunctionCalls.reserve(AuxFunctionCalls.size()+
Graph.AuxFunctionCalls.size());
- for (unsigned i = 0, ei = Graph.AuxFunctionCalls.size(); i != ei; ++i)
- AuxFunctionCalls.push_back(DSCallSite(Graph.AuxFunctionCalls[i], RC));
+ CopiedAuxCall.resize(Graph.AuxFunctionCalls.size());
}
// Clone over all globals that appear in the caller and callee graphs.
@@ -1263,18 +1274,35 @@
// maintain the connection information. Every time we decide to include a
// new global, this might make other globals live, so we must iterate
// unfortunately.
- bool MadeChange = false;
- for (hash_set<GlobalVariable*>::iterator I = NonCopiedGlobals.begin();
- I != NonCopiedGlobals.end();) {
- DSNode *GlobalNode = Graph.getNodeForValue(*I).getNode();
- if (RC.hasClonedNode(GlobalNode)) {
- // Already cloned it, remove from set.
- NonCopiedGlobals.erase(I++);
- } else if (PathExistsToClonedNode(GlobalNode, RC)) {
- RC.getClonedNH(Graph.getNodeForValue(*I));
- NonCopiedGlobals.erase(I++);
- } else {
- ++I;
+ bool MadeChange = true;
+ while (MadeChange) {
+ MadeChange = false;
+ for (hash_set<GlobalVariable*>::iterator I = NonCopiedGlobals.begin();
+ I != NonCopiedGlobals.end();) {
+ DSNode *GlobalNode = Graph.getNodeForValue(*I).getNode();
+ if (RC.hasClonedNode(GlobalNode)) {
+ // Already cloned it, remove from set.
+ NonCopiedGlobals.erase(I++);
+ MadeChange = true;
+ } else if (PathExistsToClonedNode(GlobalNode, RC)) {
+ RC.getClonedNH(Graph.getNodeForValue(*I));
+ NonCopiedGlobals.erase(I++);
+ MadeChange = true;
+ } else {
+ ++I;
+ }
+ }
+
+ // If requested, copy any aux calls that can reach copied nodes.
+ if (!(CloneFlags & DontCloneAuxCallNodes)) {
+ for (unsigned i = 0, ei = Graph.AuxFunctionCalls.size(); i != ei; ++i)
+ if (!CopiedAuxCall[i] &&
+ PathExistsToClonedNode(Graph.AuxFunctionCalls[i], RC)) {
+ AuxFunctionCalls.push_back(DSCallSite(Graph.AuxFunctionCalls[i],
+ RC));
+ CopiedAuxCall[i] = true;
+ MadeChange = true;
+ }
}
}
More information about the llvm-commits
mailing list