[llvm] [X86] Transform `(xor x, SIGN_BIT)` -> `(add x, SIGN_BIT)` 32 bit and smaller scalars (PR #83659)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 2 05:31:36 PST 2024
================
@@ -52128,7 +52128,19 @@ static SDValue combineXor(SDNode *N, SelectionDAG &DAG,
if (SDValue R = combineBMILogicOp(N, DAG, Subtarget))
return R;
- return combineFneg(N, DAG, DCI, Subtarget);
+ if (SDValue R = combineFneg(N, DAG, DCI, Subtarget))
+ return R;
+
+ // (xor x, SIGN_BIT) == (add x, SIGN_BIT), since we can lower `add` with `lea`
+ // which can be fused with shift/eliminate register moves, its preferable.
+ if (VT.isScalarInteger() && VT.getScalarSizeInBits() <= 32) {
+ if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
+ if (C->getAPIntValue().isSignMask())
+ return DAG.getNode(ISD::ADD, SDLoc(N), VT, N0, N1);
+ }
+ }
----------------
RKSimon wrote:
Use DAG.isADDLike ?
https://github.com/llvm/llvm-project/pull/83659
More information about the llvm-commits
mailing list