Index: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -129,6 +129,9 @@ /// 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 @@ 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); } } Index: llvm/trunk/test/CodeGen/X86/pr32108.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/pr32108.ll +++ llvm/trunk/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 +}