Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -8609,6 +8609,10 @@ // if this is the case. EVT SVT = getSetCCResultType(N00VT); + // If we already have the desired type, don't change it. + if (SVT == N0.getValueType()) + return SDValue(); + // We know that the # elements of the results is the same as the // # elements of the compare (and the # elements of the compare result // for that matter). Check to see that they are the same size. If so, Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -39130,6 +39130,14 @@ EVT InVT = N0.getValueType(); EVT InSVT = InVT.getScalarType(); + // Generic DAGCombiner previously had a bug that would cause a sign_extend of + // setcc to sometimes return the original node and tricked it into thinking + // CombineTo was used which prevented the target combines from running. + // Earlying out here to avoid regressions. + // FIXME: Can we remove this? + if (N0.getOpcode() == ISD::SETCC) + return SDValue(); + // Input type must be a vector and we must be extending legal integer types. if (!VT.isVector() || VT.getVectorNumElements() < 2) return SDValue();