@@ -24084,13 +24084,9 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
2408424084 if (!CmpVT.isScalarInteger() || !VT.isScalarInteger())
2408524085 return SDValue();
2408624086
24087- // Convert 'identity' patterns (iff X is 0 or 1):
24088- // SELECT (X != 0), Y, (OR Y, Z) -> (OR Y, (AND (0 - X), Z))
24089- // SELECT (X != 0), Y, (XOR Y, Z) -> (XOR Y, (AND (0 - X), Z))
24090- // SELECT (X != 0), Y, (ADD Y, Z) -> (ADD Y, (AND (0 - X), Z))
24091- // SELECT (X != 0), Y, (SUB Y, Z) -> (SUB Y, (AND (0 - X), Z))
24092- if (!Subtarget.canUseCMOV() && X86CC == X86::COND_E &&
24093- CmpVal.getOpcode() == ISD::AND && isOneConstant(CmpVal.getOperand(1))) {
24087+ if (X86CC == X86::COND_E && CmpVal.getOpcode() == ISD::AND &&
24088+ isOneConstant(CmpVal.getOperand(1))) {
24089+
2409424090 SDValue Src1, Src2;
2409524091 auto isIdentityPattern = [&]() {
2409624092 switch (RHS.getOpcode()) {
@@ -24114,7 +24110,12 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
2411424110 return false;
2411524111 };
2411624112
24117- if (isIdentityPattern()) {
24113+ // Convert 'identity' patterns (iff X is 0 or 1):
24114+ // SELECT (AND(X,1) == 0), Y, (OR Y, Z) -> (OR Y, (AND NEG(AND(X,1)), Z))
24115+ // SELECT (AND(X,1) == 0), Y, (XOR Y, Z) -> (XOR Y, (AND NEG(AND(X,1)), Z))
24116+ // SELECT (AND(X,1) == 0), Y, (ADD Y, Z) -> (ADD Y, (AND NEG(AND(X,1)), Z))
24117+ // SELECT (AND(X,1) == 0), Y, (SUB Y, Z) -> (SUB Y, (AND NEG(AND(X,1)), Z))
24118+ if (!Subtarget.canUseCMOV() && isIdentityPattern()) {
2411824119 // we need mask of all zeros or ones with same size of the other
2411924120 // operands.
2412024121 SDValue Neg = CmpVal;
0 commit comments