@@ -24086,6 +24086,23 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
24086
24086
24087
24087
if (X86CC == X86::COND_E && CmpVal.getOpcode() == ISD::AND &&
24088
24088
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();
24089
24106
24090
24107
SDValue Src1, Src2;
24091
24108
auto isIdentityPattern = [&]() {
@@ -24116,17 +24133,7 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
24116
24133
// SELECT (AND(X,1) == 0), Y, (ADD Y, Z) -> (ADD Y, (AND NEG(AND(X,1)), Z))
24117
24134
// SELECT (AND(X,1) == 0), Y, (SUB Y, Z) -> (SUB Y, (AND NEG(AND(X,1)), Z))
24118
24135
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();
24130
24137
SDValue And = DAG.getNode(ISD::AND, DL, VT, Mask, Src1); // Mask & z
24131
24138
return DAG.getNode(RHS.getOpcode(), DL, VT, Src2, And); // y Op And
24132
24139
}
0 commit comments