Fix a bug that could trigger when varargs call sites had non-matching number of arguments
authorChris Lattner <sabre@nondot.org>
Sun, 10 Nov 2002 07:46:08 +0000 (07:46 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 10 Nov 2002 07:46:08 +0000 (07:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4683 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructure.cpp

index 175cc8a3f7df4bdf8c27fad5698d5fc8d161ca3f..67778181ef18f273b382f8a95aeef0d3b8b78604 100644 (file)
@@ -773,7 +773,7 @@ static void removeRefsToGlobal(DSNode* N,
 //
 bool DSGraph::isNodeDead(DSNode *N) {
   // Is it a trivially dead shadow node?
-  return N->getReferrers().empty() && (N->NodeType & ~DSNode::DEAD) == 0
+  return N->getReferrers().empty() && (N->NodeType & ~DSNode::DEAD) == 0;
 }
 
 static inline void killIfUselessEdge(DSNodeHandle &Edge) {
@@ -831,9 +831,16 @@ static void removeIdenticalCalls(vector<DSCallSite> &Calls,
           NumDuplicateCalls > 20) {
         DSCallSite &OCS = Calls[i-1];
         OCS.getRetVal().mergeWith(CS.getRetVal());
-        for (unsigned a = 0, e = CS.getNumPtrArgs(); a != e; ++a)
+
+        for (unsigned a = 0,
+               e = std::min(CS.getNumPtrArgs(), OCS.getNumPtrArgs());
+             a != e; ++a)
           OCS.getPtrArg(a).mergeWith(CS.getPtrArg(a));
         // 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();