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
This commit is contained in:
Duncan Sands 2008-10-27 13:18:32 +00:00
parent 7b700575dd
commit 75cf2e03ab
1 changed files with 8 additions and 3 deletions

View 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;
}