@@ -24086,6 +24086,23 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
2408624086
2408724087 if (X86CC == X86::COND_E && CmpVal.getOpcode() == ISD::AND &&
2408824088 isOneConstant(CmpVal.getOperand(1))) {
24089+ auto SplatLSB = [&]() {
24090+ // we need mask of all zeros or ones with same size of the other
24091+ // operands.
24092+ SDValue Neg = CmpVal;
24093+ if (CmpVT.bitsGT(VT))
24094+ Neg = DAG.getNode(ISD::TRUNCATE, DL, VT, CmpVal);
24095+ else if (CmpVT.bitsLT(VT))
24096+ Neg = DAG.getNode(
24097+ ISD::AND, DL, VT,
24098+ DAG.getNode(ISD::ANY_EXTEND, DL, VT, CmpVal.getOperand(0)),
24099+ DAG.getConstant(1, DL, VT));
24100+ return DAG.getNegative(Neg, DL, VT); // -(and (x, 0x1))
24101+ };
24102+
24103+ // SELECT (AND(X,1) == 0), 0, -1 -> NEG(AND(X,1))
24104+ if (isNullConstant(LHS) && isAllOnesConstant(RHS))
24105+ return SplatLSB();
2408924106
2409024107 SDValue Src1, Src2;
2409124108 auto isIdentityPattern = [&]() {
@@ -24116,17 +24133,7 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
2411624133 // SELECT (AND(X,1) == 0), Y, (ADD Y, Z) -> (ADD Y, (AND NEG(AND(X,1)), Z))
2411724134 // SELECT (AND(X,1) == 0), Y, (SUB Y, Z) -> (SUB Y, (AND NEG(AND(X,1)), Z))
2411824135 if (!Subtarget.canUseCMOV() && isIdentityPattern()) {
24119- // we need mask of all zeros or ones with same size of the other
24120- // operands.
24121- SDValue Neg = CmpVal;
24122- if (CmpVT.bitsGT(VT))
24123- Neg = DAG.getNode(ISD::TRUNCATE, DL, VT, CmpVal);
24124- else if (CmpVT.bitsLT(VT))
24125- Neg = DAG.getNode(
24126- ISD::AND, DL, VT,
24127- DAG.getNode(ISD::ANY_EXTEND, DL, VT, CmpVal.getOperand(0)),
24128- DAG.getConstant(1, DL, VT));
24129- SDValue Mask = DAG.getNegative(Neg, DL, VT); // -(and (x, 0x1))
24136+ SDValue Mask = SplatLSB();
2413024137 SDValue And = DAG.getNode(ISD::AND, DL, VT, Mask, Src1); // Mask & z
2413124138 return DAG.getNode(RHS.getOpcode(), DL, VT, Src2, And); // y Op And
2413224139 }
0 commit comments