Skip to content

Commit 3d00e1e

Browse files
committed
[X86] LowerSELECTWithCmpZero - fold "SELECT (AND(X,1) == 0), 0, -1 -> NEG(AND(X,1))"
1 parent 1ab649c commit 3d00e1e

8 files changed

+153
-174
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

+18-11
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)