From 75cf2e03abd2ee44bc44decdcb302dbd1faba221 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Mon, 27 Oct 2008 13:18:32 +0000 Subject: [PATCH] Fix a bug in which a node could be added to the 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. llvm-svn: 58246 --- llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp index 55acc8221144..b2365588671d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp @@ -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; }