From: Nirav Dave Date: Wed, 1 Mar 2017 20:19:38 +0000 (+0000) Subject: [DAG] Prevent Stale nodes from entering worklist X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e4dc80fc4b01dfc42a2a4ed0b4f1965bdd69248c;p=llvm [DAG] Prevent Stale nodes from entering worklist Add check that deleted nodes do not get added to worklist. This can occur when a node's operand is simplified to an existing node. This fixes PR32108. Reviewers: jyknight, hfinkel, chandlerc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D30506 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296668 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 547655f9f7b..9b467d20e55 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -129,6 +129,9 @@ namespace { /// Add to the worklist making sure its instance is at the back (next to be /// processed.) void AddToWorklist(SDNode *N) { + assert(N->getOpcode() != ISD::DELETED_NODE && + "Deleted Node added to Worklist"); + // Skip handle nodes as they can't usefully be combined and confuse the // zero-use deletion strategy. if (N->getOpcode() == ISD::HANDLENODE) @@ -12619,10 +12622,13 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) { Value, APInt::getLowBitsSet(Value.getScalarValueSizeInBits(), ST->getMemoryVT().getScalarSizeInBits()))) { - // Re-visit the store if anything changed; SimplifyDemandedBits - // will add Value's node back to the worklist if necessary, but - // we also need to re-visit the Store node itself. - AddToWorklist(N); + // Re-visit the store if anything changed and the store hasn't + // been merged with another node (N is deleted); + // SimplifyDemandedBits will add Value's node back to the + // worklist if necessary, but we also need to re-visit the Store + // node itself. + if (N->getOpcode() != ISD::DELETED_NODE) + AddToWorklist(N); return SDValue(N, 0); } } diff --git a/test/CodeGen/X86/pr32108.ll b/test/CodeGen/X86/pr32108.ll new file mode 100644 index 00000000000..cb7311c0927 --- /dev/null +++ b/test/CodeGen/X86/pr32108.ll @@ -0,0 +1,20 @@ +; RUN: llc -march=x86-64 %s -o - + +target triple = "x86_64-unknown-linux-gnu" + +define void @autogen_SD1794() { +BB: + %Cmp45 = icmp slt <4 x i32> undef, undef + br label %CF243 + +CF243: ; preds = %CF243, %BB + br i1 undef, label %CF243, label %CF257 + +CF257: ; preds = %CF243 + %Shuff144 = shufflevector <4 x i1> undef, <4 x i1> %Cmp45, <4 x i32> + br label %CF244 + +CF244: ; preds = %CF244, %CF257 + %Shuff182 = shufflevector <4 x i1> %Shuff144, <4 x i1> zeroinitializer, <4 x i32> + br label %CF244 +}