@@ -55692,14 +55692,43 @@ static SDValue combineSub(SDNode *N, SelectionDAG &DAG,
5569255692
5569355693static SDValue combineVectorCompare(SDNode *N, SelectionDAG &DAG,
5569455694 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);
5569555701 MVT VT = N->getSimpleValueType(0);
55702+ unsigned EltBits = VT.getScalarSizeInBits();
55703+ unsigned NumElts = VT.getVectorNumElements();
5569655704 SDLoc DL(N);
5569755705
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);
5570355732 }
5570455733
5570555734 return SDValue();
0 commit comments