[llvm] 75aa83c - [SDAG] foldSelectToABD - canonicalize compare of abd (#180952)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 17 06:02:59 PST 2026
Author: DaKnig
Date: 2026-02-17T14:02:53Z
New Revision: 75aa83c0c035a7a10f0f48355c93858f003b8e4e
URL: https://github.com/llvm/llvm-project/commit/75aa83c0c035a7a10f0f48355c93858f003b8e4e
DIFF: https://github.com/llvm/llvm-project/commit/75aa83c0c035a7a10f0f48355c93858f003b8e4e.diff
LOG: [SDAG] foldSelectToABD - canonicalize compare of abd (#180952)
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/AArch64/arm64-vabs.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index adc197069f7c3..51fbe62b4aff0 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -12581,6 +12581,21 @@ SDValue DAGCombiner::foldSelectToABD(SDValue LHS, SDValue RHS, SDValue True,
if (LegalOperations && !hasOperation(ABDOpc, VT))
return SDValue();
+ // (setcc 0, b set???) --> (setcc b, 0, set???)
+ if (isZeroOrZeroSplat(LHS)) {
+ std::swap(LHS, RHS);
+ CC = ISD::getSetCCSwappedOperands(CC);
+ }
+
+ // (setcc (add nsw A, Const), 0, sets??) --> (setcc A, -Const, sets??)
+ SDValue A, B;
+ if (ISD::isSignedIntSetCC(CC) && LHS->getFlags().hasNoSignedWrap() &&
+ isZeroOrZeroSplat(RHS) && sd_match(LHS, m_Add(m_Value(A), m_Value(B))) &&
+ DAG.isConstantIntBuildVectorOrConstantInt(B)) {
+ RHS = DAG.getNegative(B, LHS, B.getValueType());
+ LHS = A;
+ }
+
switch (CC) {
case ISD::SETGT:
case ISD::SETGE:
diff --git a/llvm/test/CodeGen/AArch64/arm64-vabs.ll b/llvm/test/CodeGen/AArch64/arm64-vabs.ll
index 4ceba23df55a8..d175247cca3d9 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vabs.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vabs.ll
@@ -2165,3 +2165,51 @@ define <16 x i16> @uabd16b_i16_ext(<16 x i16> %aext, <16 x i8> %b) {
%reduced_v = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %absel)
ret <16 x i16> %absel
}
+
+
+define <4 x i32> @uabd_i32_select_const_lhs_add(<4 x i32> %a) {
+; CHECK-SD-LABEL: uabd_i32_select_const_lhs_add:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: mvni.4s v1, #102
+; CHECK-SD-NEXT: sabd.4s v0, v0, v1
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: uabd_i32_select_const_lhs_add:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: movi.4s v1, #103
+; CHECK-GI-NEXT: mvni.4s v2, #102
+; CHECK-GI-NEXT: add.4s v1, v0, v1
+; CHECK-GI-NEXT: sub.4s v0, v2, v0
+; CHECK-GI-NEXT: cmlt.4s v3, v1, #0
+; CHECK-GI-NEXT: bif.16b v0, v1, v3
+; CHECK-GI-NEXT: ret
+ %add = add nsw <4 x i32> %a, splat(i32 103)
+ %cmp.i = icmp slt <4 x i32> %add, zeroinitializer
+ %sub.i = sub <4 x i32> splat(i32 -103), %a
+ %cond.i = select <4 x i1> %cmp.i, <4 x i32> %sub.i, <4 x i32> %add
+ ret <4 x i32> %cond.i
+}
+
+define <4 x i32> @uabd_i32_select_const_rhs_add(<4 x i32> %b) {
+; CHECK-SD-LABEL: uabd_i32_select_const_rhs_add:
+; CHECK-SD: // %bb.0:
+; CHECK-SD-NEXT: mvni.4s v1, #102
+; CHECK-SD-NEXT: sabd.4s v0, v0, v1
+; CHECK-SD-NEXT: neg.4s v0, v0
+; CHECK-SD-NEXT: ret
+;
+; CHECK-GI-LABEL: uabd_i32_select_const_rhs_add:
+; CHECK-GI: // %bb.0:
+; CHECK-GI-NEXT: movi.4s v1, #103
+; CHECK-GI-NEXT: mvni.4s v2, #102
+; CHECK-GI-NEXT: add.4s v1, v0, v1
+; CHECK-GI-NEXT: sub.4s v0, v2, v0
+; CHECK-GI-NEXT: cmgt.4s v3, v1, #0
+; CHECK-GI-NEXT: bif.16b v0, v1, v3
+; CHECK-GI-NEXT: ret
+ %add = add nsw <4 x i32> %b, splat(i32 103)
+ %cmp.i = icmp slt <4 x i32> zeroinitializer, %add
+ %sub.i = sub <4 x i32> splat(i32 -103), %b
+ %cond.i = select <4 x i1> %cmp.i, <4 x i32> %sub.i, <4 x i32> %add
+ ret <4 x i32> %cond.i
+}
More information about the llvm-commits
mailing list