[llvm] [SDAG] (abs (add nsw a, -b)) -> (abds a, b) (PR #175801)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 2 04:32:19 PST 2026
================
@@ -11754,22 +11773,36 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
(Opc0 != ISD::ZERO_EXTEND && Opc0 != ISD::SIGN_EXTEND &&
Opc0 != ISD::SIGN_EXTEND_INREG)) {
// fold (abs (sub nsw x, y)) -> abds(x, y)
+ // fold (abs (add nsw x, -y)) -> abds(x, y)
+ bool AbsOpWillNSW =
+ AbsOp0->getFlags().hasNoSignedWrap() ||
+ (IsAdd ? DAG.willNotOverflowAdd(/*IsSigned=*/true, Op0, Op1)
+ : DAG.willNotOverflowSub(/*IsSigned=*/true, Op0, Op1));
+
// Don't fold this for unsupported types as we lose the NSW handling.
if (hasOperation(ISD::ABDS, VT) && TLI.preferABDSToABSWithNSW(VT) &&
- (AbsOp0->getFlags().hasNoSignedWrap() ||
- DAG.willNotOverflowSub(/*IsSigned=*/true, Op0, Op1))) {
+ AbsOpWillNSW) {
+ if (IsAdd)
+ Op1 = DAG.getNegative(Op1, SDLoc(Op1), VT);
SDValue ABD = DAG.getNode(ISD::ABDS, DL, VT, Op0, Op1);
return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
}
// fold (abs (sub x, y)) -> abdu(x, y)
if (hasOperation(ISD::ABDU, VT) && DAG.SignBitIsZero(Op0) &&
DAG.SignBitIsZero(Op1)) {
+ if (IsAdd)
+ Op1 = DAG.getNegative(Op1, SDLoc(Op1), VT);
SDValue ABD = DAG.getNode(ISD::ABDU, DL, VT, Op0, Op1);
return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
}
return SDValue();
}
+ // The IsAdd case explicitly checks for const/bv-of-const. This implies eihter
----------------
DaKnig wrote:
done
https://github.com/llvm/llvm-project/pull/175801
More information about the llvm-commits
mailing list