[llvm] [X86] Truncate i64 add to i32 when upper 33 bits are zeros (PR #144066)
Omkar Mohanty via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 21 04:49:46 PDT 2025
================
@@ -58082,8 +58082,28 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
EVT VT = N->getValueType(0);
SDValue Op0 = N->getOperand(0);
SDValue Op1 = N->getOperand(1);
+ unsigned int Opcode = N->getOpcode();
SDLoc DL(N);
+ // Use a 32-bit add+zext if upper 33 bits known zero.
+ if (VT == MVT::i64 && Subtarget.is64Bit()) {
+ APInt HiMask = APInt::getHighBitsSet(64, 33);
+ if (DAG.MaskedValueIsZero(Op0, HiMask) &&
+ DAG.MaskedValueIsZero(Op1, HiMask)) {
+ SDValue LHS = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Op0);
+ SDValue RHS = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Op1);
+ bool NSW = Op0->getFlags().hasNoSignedWrap();
+ bool NUW = Op0->getFlags().hasNoUnsignedWrap();
+ NSW = NSW & DAG.willNotOverflowAdd(true, LHS, RHS);
+ NUW = NUW & DAG.willNotOverflowAdd(false, LHS, RHS);
+ SDNodeFlags Flags;
+ Flags.setNoUnsignedWrap(NUW);
+ Flags.setNoSignedWrap(NSW);
----------------
omkar-mohanty wrote:
Thanks! My intent here was to preserve the `NUW` and `NSW` guarantees of the original node without introducing any new assumptions. But you are right we can set this to always `true` in this case.
https://github.com/llvm/llvm-project/pull/144066
More information about the llvm-commits
mailing list