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

Chris Lattner lattner at cs.uiuc.edu
Mon Nov 11 15:36:02 PST 2002


Changes in directory llvm/lib/Analysis/DataStructure:

DataStructure.cpp updated: 1.65 -> 1.66

---
Log message:

Elimiante calls to a node with nothing in it.


---
Diffs of the changes:

Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp
diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.65 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.66
--- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.65	Sun Nov 10 21:36:55 2002
+++ llvm/lib/Analysis/DataStructure/DataStructure.cpp	Mon Nov 11 15:35:38 2002
@@ -808,45 +808,54 @@
   DSNode *LastCalleeNode = 0;
   unsigned NumDuplicateCalls = 0;
   bool LastCalleeContainsExternalFunction = false;
-  for (unsigned i = 0, e = Calls.size(); i != e; ++i) {
+  for (unsigned i = 0; i != Calls.size(); ++i) {
     DSCallSite &CS = Calls[i];
 
-    // If the return value or any arguments point to a void node with no
-    // information at all in it, and the call node is the only node to point
-    // to it, remove the edge to the node (killing the node).
-    //
-    killIfUselessEdge(CS.getRetVal());
-    for (unsigned a = 0, e = CS.getNumPtrArgs(); a != e; ++a)
-      killIfUselessEdge(CS.getPtrArg(a));
-
-    // If this call site calls the same function as the last call site, and if
-    // the function pointer contains an external function, this node will never
-    // be resolved.  Merge the arguments of the call node because no information
-    // will be lost.
-    //
-    if (CS.getCallee().getNode() == LastCalleeNode) {
-      ++NumDuplicateCalls;
-      if (NumDuplicateCalls == 1) {
-        LastCalleeContainsExternalFunction =
-          nodeContainsExternalFunction(LastCalleeNode);
-      }
-
-      if (LastCalleeContainsExternalFunction ||
-          // This should be more than enough context sensitivity!
-          // FIXME: Evaluate how many times this is tripped!
-          NumDuplicateCalls > 20) {
-        DSCallSite &OCS = Calls[i-1];
-        OCS.mergeWith(CS);
-
-        // The node will now be eliminated as a duplicate!
-        if (CS.getNumPtrArgs() < OCS.getNumPtrArgs())
-          CS = OCS;
-        else if (CS.getNumPtrArgs() > OCS.getNumPtrArgs())
-          OCS = CS;
-      }
+    // If the Callee is a useless edge, this must be an unreachable call site,
+    // eliminate it.
+    killIfUselessEdge(CS.getCallee());
+    if (CS.getCallee().getNode() == 0) {
+      CS.swap(Calls.back());
+      Calls.pop_back();
+      --i;
     } else {
-      LastCalleeNode = CS.getCallee().getNode();
-      NumDuplicateCalls = 0;
+      // If the return value or any arguments point to a void node with no
+      // information at all in it, and the call node is the only node to point
+      // to it, remove the edge to the node (killing the node).
+      //
+      killIfUselessEdge(CS.getRetVal());
+      for (unsigned a = 0, e = CS.getNumPtrArgs(); a != e; ++a)
+        killIfUselessEdge(CS.getPtrArg(a));
+      
+      // If this call site calls the same function as the last call site, and if
+      // the function pointer contains an external function, this node will
+      // never be resolved.  Merge the arguments of the call node because no
+      // information will be lost.
+      //
+      if (CS.getCallee().getNode() == LastCalleeNode) {
+        ++NumDuplicateCalls;
+        if (NumDuplicateCalls == 1) {
+          LastCalleeContainsExternalFunction =
+            nodeContainsExternalFunction(LastCalleeNode);
+        }
+        
+        if (LastCalleeContainsExternalFunction ||
+            // This should be more than enough context sensitivity!
+            // FIXME: Evaluate how many times this is tripped!
+            NumDuplicateCalls > 20) {
+          DSCallSite &OCS = Calls[i-1];
+          OCS.mergeWith(CS);
+          
+          // The node will now be eliminated as a duplicate!
+          if (CS.getNumPtrArgs() < OCS.getNumPtrArgs())
+            CS = OCS;
+          else if (CS.getNumPtrArgs() > OCS.getNumPtrArgs())
+            OCS = CS;
+        }
+      } else {
+        LastCalleeNode = CS.getCallee().getNode();
+        NumDuplicateCalls = 0;
+      }
     }
   }
 





More information about the llvm-commits mailing list