Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -18675,12 +18675,17 @@ // Determine if the condition we're dealing with is constant. SDValue SCC = SimplifySetCC(getSetCCResultType(CmpOpVT), N0, N1, CC, DL, false); - if (SCC.getNode()) AddToWorklist(SCC.getNode()); - - if (auto *SCCC = dyn_cast_or_null(SCC.getNode())) { - // fold select_cc true, x, y -> x - // fold select_cc false, x, y -> y - return !SCCC->isNullValue() ? N2 : N3; + if (SCC.getNode()) { + if (auto *SCCC = dyn_cast(SCC.getNode())) { + // fold select_cc true, x, y -> x + // fold select_cc false, x, y -> y + bool isNull = SCCC->isNullValue(); + SDValue RV = isNull ? N3 : N2; + return RV; + } + // Don't combine. Cleanup SCC. Don't remove input values. + HandleSDNode HN0(N0), HN1(N1), HN2(N2), HN3(N3); + recursivelyDeleteUnusedNodes(SCC.getNode()); } if (SDValue V = Index: llvm/test/CodeGen/X86/xor.ll =================================================================== --- llvm/test/CodeGen/X86/xor.ll +++ llvm/test/CodeGen/X86/xor.ll @@ -419,15 +419,14 @@ ; ; X64-LIN-LABEL: PR17487: ; X64-LIN: # %bb.0: -; X64-LIN-NEXT: movd %edi, %xmm0 -; X64-LIN-NEXT: pextrw $0, %xmm0, %eax +; X64-LIN-NEXT: movl %edi, %eax ; X64-LIN-NEXT: andl $1, %eax ; X64-LIN-NEXT: retq ; ; X64-WIN-LABEL: PR17487: ; X64-WIN: # %bb.0: -; X64-WIN-NEXT: andb $1, %cl ; X64-WIN-NEXT: movzbl %cl, %eax +; X64-WIN-NEXT: andl $1, %eax ; X64-WIN-NEXT: retq %tmp = insertelement <2 x i1> undef, i1 %tobool, i32 1 %tmp1 = zext <2 x i1> %tmp to <2 x i64>