Fix a bug in which a node could be added to the
authorDuncan Sands <baldrick@free.fr>
Mon, 27 Oct 2008 13:18:32 +0000 (13:18 +0000)
committerDuncan Sands <baldrick@free.fr>
Mon, 27 Oct 2008 13:18:32 +0000 (13:18 +0000)
worklist twice: UpdateNodeOperands could morph
a new node into a node already on the worklist.
We would then recalculate the NodeId for this
existing node and add it to the worklist.  The
testcase is ARM/cse-libcalls.ll, the problem
showing up once UpdateNodeOperands is taught to
do CSE for calls.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58246 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeTypes.cpp

index 55acc82211442ecffeced9760d1a25e5cb1c9796..b2365588671d59d95734dd0a84f77ddde7d485d1 100644 (file)
@@ -272,9 +272,14 @@ SDNode *DAGTypeLegalizer::AnalyzeNewNode(SDNode *N) {
                                &NewOps[0],
                                NewOps.size()).getNode();
 
-  N->setNodeId(N->getNumOperands()-NumProcessed);
-  if (N->getNodeId() == ReadyToProcess)
-    Worklist.push_back(N);
+  // Calculate the NodeId if we haven't morphed into an existing node for
+  // which it is already known.
+  if (N->getNodeId() == NewNode) {
+    N->setNodeId(N->getNumOperands()-NumProcessed);
+    if (N->getNodeId() == ReadyToProcess)
+      Worklist.push_back(N);
+  }
+
   return N;
 }