[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/DataStructure.cpp

Chris Lattner lattner at cs.uiuc.edu
Fri Feb 14 00:29:01 PST 2003


Changes in directory llvm/lib/Analysis/DataStructure:

DataStructure.cpp updated: 1.94 -> 1.95

---
Log message:

- Eliminate provably non-pointer nodes from graphs.

This helps a lot of testcases, for example:
            New Time  New #Nodes     Old Time    Old #Nodes
254.gap:    91.1024     21605        91.1397     22657
povray31:    2.7807      8613         3.0152     10338
255.vortex:  1.2034      8153         1.2172     8822
moria:        .6756      3150          .7054     3877
300.twolf:    .1652      2010          .1851     3270

Typically, testcases which use long and ulong integers a lot get better, f.e. povray above.



---
Diffs of the changes:

Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp
diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.94 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.95
--- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.94	Thu Feb 13 13:09:00 2003
+++ llvm/lib/Analysis/DataStructure/DataStructure.cpp	Fri Feb 14 00:28:00 2003
@@ -1039,12 +1039,29 @@
 
   // Mark all nodes reachable by (non-global) scalar nodes as alive...
   for (hash_map<Value*, DSNodeHandle>::iterator I = ScalarMap.begin(),
-         E = ScalarMap.end(); I != E; ++I)
-    if (!isa<GlobalValue>(I->first))
-      I->second.getNode()->markReachableNodes(Alive);
-    else {                   // Keep track of global nodes
-      GlobalNodes.push_back(std::make_pair(I->first, I->second.getNode()));
+         E = ScalarMap.end(); I != E; )
+    if (isa<GlobalValue>(I->first)) {             // Keep track of global nodes
       assert(I->second.getNode() && "Null global node?");
+      GlobalNodes.push_back(std::make_pair(I->first, I->second.getNode()));
+      ++I;
+    } else {
+      // Check to see if this is a worthless node generated for non-pointer
+      // values, such as integers.  Consider an addition of long types: A+B.
+      // Assuming we can track all uses of the value in this context, and it is
+      // NOT used as a pointer, we can delete the node.  We will be able to
+      // detect this situation if the node pointed to ONLY has Unknown bit set
+      // in the node.  In this case, the node is not incomplete, does not point
+      // to any other nodes (no mod/ref bits set), and is therefore
+      // uninteresting for data structure analysis.  If we run across one of
+      // these, prune the scalar pointing to it.
+      //
+      DSNode *N = I->second.getNode();
+      if (N->NodeType == DSNode::UnknownNode && !isa<Argument>(I->first)) {
+        ScalarMap.erase(I++);
+      } else {
+        I->second.getNode()->markReachableNodes(Alive);
+        ++I;
+      }
     }
 
   // The return value is alive as well...





More information about the llvm-commits mailing list