@@ -55692,14 +55692,43 @@ static SDValue combineSub(SDNode *N, SelectionDAG &DAG,
55692
55692
55693
55693
static SDValue combineVectorCompare(SDNode *N, SelectionDAG &DAG,
55694
55694
const X86Subtarget &Subtarget) {
55695
+ unsigned Opcode = N->getOpcode();
55696
+ assert((Opcode == X86ISD::PCMPEQ || Opcode == X86ISD::PCMPGT) &&
55697
+ "Unknown PCMP opcode");
55698
+
55699
+ SDValue LHS = N->getOperand(0);
55700
+ SDValue RHS = N->getOperand(1);
55695
55701
MVT VT = N->getSimpleValueType(0);
55702
+ unsigned EltBits = VT.getScalarSizeInBits();
55703
+ unsigned NumElts = VT.getVectorNumElements();
55696
55704
SDLoc DL(N);
55697
55705
55698
- if (N->getOperand(0) == N->getOperand(1)) {
55699
- if (N->getOpcode() == X86ISD::PCMPEQ)
55700
- return DAG.getConstant(-1, DL, VT);
55701
- if (N->getOpcode() == X86ISD::PCMPGT)
55702
- return DAG.getConstant(0, DL, VT);
55706
+ if (LHS == RHS)
55707
+ return (Opcode == X86ISD::PCMPEQ) ? DAG.getAllOnesConstant(DL, VT)
55708
+ : DAG.getConstant(0, DL, VT);
55709
+
55710
+ // Constant Folding.
55711
+ // PCMPEQ(X,UNDEF) -> UNDEF
55712
+ // PCMPGT(X,UNDEF) -> 0
55713
+ // PCMPGT(UNDEF,X) -> 0
55714
+ APInt LHSUndefs, RHSUndefs;
55715
+ SmallVector<APInt> LHSBits, RHSBits;
55716
+ if (getTargetConstantBitsFromNode(LHS, EltBits, LHSUndefs, LHSBits) &&
55717
+ getTargetConstantBitsFromNode(RHS, EltBits, RHSUndefs, RHSBits)) {
55718
+ APInt Ones = APInt::getAllOnes(EltBits);
55719
+ APInt Zero = APInt::getZero(EltBits);
55720
+ SmallVector<APInt> Results(NumElts);
55721
+ for (unsigned I = 0; I != NumElts; ++I) {
55722
+ if (Opcode == X86ISD::PCMPEQ) {
55723
+ Results[I] = (LHSBits[I] == RHSBits[I]) ? Ones : Zero;
55724
+ } else {
55725
+ bool AnyUndef = LHSUndefs[I] || RHSUndefs[I];
55726
+ Results[I] = (!AnyUndef && LHSBits[I].sgt(RHSBits[I])) ? Ones : Zero;
55727
+ }
55728
+ }
55729
+ if (Opcode == X86ISD::PCMPEQ)
55730
+ return getConstVector(Results, LHSUndefs | RHSUndefs, VT, DAG, DL);
55731
+ return getConstVector(Results, VT, DAG, DL);
55703
55732
}
55704
55733
55705
55734
return SDValue();
0 commit comments