[llvm] Retry "[SDAG] (abs (add nsw a, -b)) -> (abds a, b) (#175801)" (PR #186659)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 31 06:43:32 PDT 2026
https://github.com/DaKnig updated https://github.com/llvm/llvm-project/pull/186659
>From 42b51c6522bcbca29b7c6626497378af2e88c181 Mon Sep 17 00:00:00 2001
From: DaKnig <ZannyKnig at disroot.org>
Date: Thu, 26 Mar 2026 18:09:24 +0200
Subject: [PATCH 1/3] [SDAG] Add regression test
see https://github.com/llvm/llvm-project/issues/185467
---
llvm/test/CodeGen/X86/abds.ll | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/llvm/test/CodeGen/X86/abds.ll b/llvm/test/CodeGen/X86/abds.ll
index a1a4ba81ae493..c18de18c174a5 100644
--- a/llvm/test/CodeGen/X86/abds.ll
+++ b/llvm/test/CodeGen/X86/abds.ll
@@ -1364,6 +1364,31 @@ define i128 @abd_select_i128(i128 %a, i128 %b) nounwind {
ret i128 %sub
}
+; This used to be miscompiled into (abdu %v, i32:-1)
+; https://github.com/llvm/llvm-project/issues/185467
+define i32 @issue185467(i32 range(i32 0, 2147483647) %v) {
+; X86-LABEL: issue185467:
+; X86: # %bb.0:
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: incl %ecx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: negl %eax
+; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: retl
+;
+; X64-LABEL: issue185467:
+; X64: # %bb.0:
+; X64-NEXT: # kill: def $edi killed $edi def $rdi
+; X64-NEXT: leal 1(%rdi), %ecx
+; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: negl %eax
+; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: retq
+ %v1 = add i32 %v, 1
+ %absx = call i32 @llvm.abs.i32(i32 %v1, i1 false)
+ ret i32 %absx
+}
+
declare i8 @llvm.abs.i8(i8, i1)
declare i16 @llvm.abs.i16(i16, i1)
declare i32 @llvm.abs.i32(i32, i1)
>From 46523a7cb72b71a940fe518c24782d0198c95e98 Mon Sep 17 00:00:00 2001
From: DaKnig <ZannyKnig at disroot.org>
Date: Thu, 26 Mar 2026 18:09:32 +0200
Subject: [PATCH 2/3] [SDAG] (abs (add nsw a, -b)) -> (abds a, b) (#175801)
This is beneficial for bv of constants.
alive2: https://alive2.llvm.org/ce/z/e3GsWZ
---
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 61 +++++++++++++++----
llvm/test/CodeGen/AArch64/neon-abd.ll | 54 ++++++++++++++++
2 files changed, 104 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 6ad5df3d3272c..477bc702470f8 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -11857,10 +11857,29 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
EVT VT = N->getValueType(0);
SDValue Op0, Op1;
- if (!sd_match(N, m_Abs(m_Sub(m_Value(Op0), m_Value(Op1)))))
+ if (!sd_match(N, m_Abs(m_AnyOf(m_Sub(m_Value(Op0), m_Value(Op1)),
+ m_Add(m_Value(Op0), m_Value(Op1))))))
return SDValue();
SDValue AbsOp0 = N->getOperand(0);
+ bool IsAdd = AbsOp0.getOpcode() == ISD::ADD;
+ // Make sure (neg B) is positive.
+ if (IsAdd) {
+ // Elements of Op1 must be constant and != VT.minSignedValue() (or undef)
+ std::function<bool(ConstantSDNode *)> IsNotMinSignedInt =
+ [VT](ConstantSDNode *C) {
+ if (C == nullptr)
+ return true;
+ return !C->getAPIntValue()
+ .trunc(VT.getScalarSizeInBits())
+ .isMinSignedValue();
+ };
+
+ if (!ISD::matchUnaryPredicate(Op1, IsNotMinSignedInt, /*AllowUndefs=*/true,
+ /*AllowTruncation=*/true))
+ return SDValue();
+ }
+
unsigned Opc0 = Op0.getOpcode();
// Check if the operands of the sub are (zero|sign)-extended, otherwise
@@ -11868,23 +11887,43 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
if (Opc0 != Op1.getOpcode() ||
(Opc0 != ISD::ZERO_EXTEND && Opc0 != ISD::SIGN_EXTEND &&
Opc0 != ISD::SIGN_EXTEND_INREG)) {
+
+ auto CreateZextedAbd = [&](unsigned AbdOpc) {
+ if (IsAdd)
+ Op1 = DAG.getNegative(Op1, SDLoc(Op1), VT);
+ SDValue ABD = DAG.getNode(AbdOpc, DL, VT, Op0, Op1);
+ return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
+ };
+
// 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))) {
- SDValue ABD = DAG.getNode(ISD::ABDS, DL, VT, Op0, Op1);
- return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
- }
+ AbsOpWillNSW)
+ return CreateZextedAbd(ISD::ABDS);
+
// fold (abs (sub x, y)) -> abdu(x, y)
- if (hasOperation(ISD::ABDU, VT) && DAG.SignBitIsZero(Op0) &&
- DAG.SignBitIsZero(Op1)) {
- SDValue ABD = DAG.getNode(ISD::ABDU, DL, VT, Op0, Op1);
- return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
- }
+ // fold (abs (add x, -y)) -> abdu(x, y)
+ bool Op1SignBitIsOne = DAG.computeKnownBits(Op1).countMinLeadingOnes() > 0;
+ bool AbsOpWillNUW = DAG.SignBitIsZero(Op0) &&
+ (IsAdd ? DAG.SignBitIsZero(Op1) : Op1SignBitIsOne);
+
+ if (hasOperation(ISD::ABDU, VT) && AbsOpWillNUW)
+ return CreateZextedAbd(ISD::ABDU);
+
return SDValue();
}
+ // The IsAdd case explicitly checks for const/bv-of-const. This implies either
+ // (Opc0 != Op1.getOpcode() || Opc0 is not in {zext/sext/sign_ext_inreg}. This
+ // implies it was alrady handled by the above if statement.
+ assert(!IsAdd && "Unexpected abs(add(x,y)) pattern");
+
EVT VT0, VT1;
if (Opc0 == ISD::SIGN_EXTEND_INREG) {
VT0 = cast<VTSDNode>(Op0.getOperand(1))->getVT();
diff --git a/llvm/test/CodeGen/AArch64/neon-abd.ll b/llvm/test/CodeGen/AArch64/neon-abd.ll
index 98833d36dbb91..931963ee0e1e5 100644
--- a/llvm/test/CodeGen/AArch64/neon-abd.ll
+++ b/llvm/test/CodeGen/AArch64/neon-abd.ll
@@ -744,6 +744,60 @@ entry:
ret <8 x i32> %r
}
+define <4 x i32> @abs_sub(<4 x i32> %a, <4 x i32> %b) {
+; CHECK-LABEL: abs_sub:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: sabd v0.4s, v1.4s, v0.4s
+; CHECK-NEXT: ret
+entry:
+ %add = sub nsw <4 x i32> %b, %a
+ %cmp.i = icmp slt <4 x i32> %add, zeroinitializer
+ %sub.i = sub nsw <4 x i32> zeroinitializer, %add
+ %cond.i = select <4 x i1> %cmp.i, <4 x i32> %sub.i, <4 x i32> %add
+ ret <4 x i32> %cond.i
+}
+
+; short abs_diff_add_i16_rir(short a, short c) {
+; return abs(a - 0x492) + c;
+; }
+define <4 x i16> @abs_diff_add_v4i16(<4 x i16> %a, <4 x i16> %c) {
+; CHECK-LABEL: abs_diff_add_v4i16:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: mov w8, #1170 // =0x492
+; CHECK-NEXT: dup v2.4h, w8
+; CHECK-NEXT: saba v1.4h, v0.4h, v2.4h
+; CHECK-NEXT: fmov d0, d1
+; CHECK-NEXT: ret
+entry:
+ %conv = sext <4 x i16> %a to <4 x i32>
+ %sub = add nsw <4 x i32> %conv, splat(i32 -1170)
+ %0 = tail call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true)
+ %1 = trunc <4 x i32> %0 to <4 x i16>
+ %conv2 = add <4 x i16> %1, %c
+ ret <4 x i16> %conv2
+}
+
+; short abs_diff_add_<4 x i16>_rii(short a) {
+; return abs(a - 0x93) + 0x943;
+; }
+define <4 x i16> @abs_diff_add_v4i16_rii(<4 x i16> %a) {
+; CHECK-LABEL: abs_diff_add_v4i16_rii:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: mov w8, #2371 // =0x943
+; CHECK-NEXT: movi v2.4h, #147
+; CHECK-NEXT: dup v1.4h, w8
+; CHECK-NEXT: saba v1.4h, v0.4h, v2.4h
+; CHECK-NEXT: fmov d0, d1
+; CHECK-NEXT: ret
+entry:
+ %conv = sext <4 x i16> %a to <4 x i32>
+ %sub = add nsw <4 x i32> %conv, splat(i32 -147)
+ %0 = tail call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true)
+ %1 = trunc <4 x i32> %0 to <4 x i16>
+ %conv1 = add nuw <4 x i16> %1, splat(i16 2371)
+ ret <4 x i16> %conv1
+}
+
declare <8 x i8> @llvm.abs.v8i8(<8 x i8>, i1)
declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1)
>From 4ef9a6d79f154393598359d29f159ec49752589a Mon Sep 17 00:00:00 2001
From: DaKnig <ZannyKnig at disroot.org>
Date: Thu, 26 Mar 2026 18:09:39 +0200
Subject: [PATCH 3/3] style
---
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 17 ++++---
llvm/test/CodeGen/AArch64/neon-abd.ll | 45 +++++++------------
llvm/test/CodeGen/X86/abds.ll | 6 +--
3 files changed, 28 insertions(+), 40 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 477bc702470f8..fec05e9fea701 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -11863,17 +11863,16 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
SDValue AbsOp0 = N->getOperand(0);
bool IsAdd = AbsOp0.getOpcode() == ISD::ADD;
- // Make sure (neg B) is positive.
+ // Make sure (abs B) is positive.
if (IsAdd) {
// Elements of Op1 must be constant and != VT.minSignedValue() (or undef)
- std::function<bool(ConstantSDNode *)> IsNotMinSignedInt =
- [VT](ConstantSDNode *C) {
- if (C == nullptr)
- return true;
- return !C->getAPIntValue()
- .trunc(VT.getScalarSizeInBits())
- .isMinSignedValue();
- };
+ auto IsNotMinSignedInt = [VT](ConstantSDNode *C) {
+ if (C == nullptr)
+ return true;
+ return !C->getAPIntValue()
+ .trunc(VT.getScalarSizeInBits())
+ .isMinSignedValue();
+ };
if (!ISD::matchUnaryPredicate(Op1, IsNotMinSignedInt, /*AllowUndefs=*/true,
/*AllowTruncation=*/true))
diff --git a/llvm/test/CodeGen/AArch64/neon-abd.ll b/llvm/test/CodeGen/AArch64/neon-abd.ll
index 931963ee0e1e5..8c3dec85af8b3 100644
--- a/llvm/test/CodeGen/AArch64/neon-abd.ll
+++ b/llvm/test/CodeGen/AArch64/neon-abd.ll
@@ -557,13 +557,12 @@ define <2 x i32> @combine_sabd_2s_zerosign_negative(<2 x i32> %a, <2 x i32> %b)
; select pattern with constant and type shrinking
define <8 x i32> @sabd_8h_splat_imm(<8 x i16> %a) {
; CHECK-LABEL: sabd_8h_splat_imm:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: movi v2.4h, #89
; CHECK-NEXT: movi v1.8h, #89
; CHECK-NEXT: sabdl2 v1.4s, v0.8h, v1.8h
; CHECK-NEXT: sabdl v0.4s, v0.4h, v2.4h
; CHECK-NEXT: ret
-entry:
%conv = sext <8 x i16> %a to <8 x i32>
%sub = sub <8 x i32> %conv, splat(i32 89)
%cmp.i = icmp slt <8 x i32> %sub, splat(i32 0)
@@ -577,13 +576,12 @@ entry:
; ... with uabd
define <8 x i32> @uabd_8h_splat_imm(<8 x i16> %a) {
; CHECK-LABEL: uabd_8h_splat_imm:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: movi v2.4h, #89
; CHECK-NEXT: movi v1.8h, #89
; CHECK-NEXT: uabdl2 v1.4s, v0.8h, v1.8h
; CHECK-NEXT: uabdl v0.4s, v0.4h, v2.4h
; CHECK-NEXT: ret
-entry:
%conv = zext <8 x i16> %a to <8 x i32>
%sub = sub <8 x i32> %conv, splat(i32 89)
%cmp.i = icmp slt <8 x i32> %sub, splat(i32 0)
@@ -597,7 +595,7 @@ entry:
; And now it's buildvector of const
define <8 x i32> @sabd_8h_bv_imm(<8 x i16> %a) {
; CHECK-LABEL: sabd_8h_bv_imm:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: mov x9, #549747425280 // =0x7fff800000
; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
; CHECK-NEXT: adrp x8, .LCPI45_0
@@ -607,7 +605,6 @@ define <8 x i32> @sabd_8h_bv_imm(<8 x i16> %a) {
; CHECK-NEXT: sabdl v0.4s, v0.4h, v2.4h
; CHECK-NEXT: sabdl v1.4s, v1.4h, v3.4h
; CHECK-NEXT: ret
-entry:
%conv = sext <8 x i16> %a to <8 x i32>
%sub = sub <8 x i32> %conv, <i32 39, i32 42, i32 51, i32 51, i32 0, i32 -128, i32 127, i32 69>
%cmp.i = icmp slt <8 x i32> %sub, splat(i32 0)
@@ -621,7 +618,7 @@ entry:
; ... uabd version
define <8 x i32> @uabd_8h_bv_imm(<8 x i16> %a) {
; CHECK-LABEL: uabd_8h_bv_imm:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
; CHECK-NEXT: adrp x8, .LCPI46_0
; CHECK-NEXT: adrp x9, .LCPI46_1
@@ -630,7 +627,6 @@ define <8 x i32> @uabd_8h_bv_imm(<8 x i16> %a) {
; CHECK-NEXT: uabdl v0.4s, v0.4h, v3.4h
; CHECK-NEXT: uabdl v1.4s, v1.4h, v2.4h
; CHECK-NEXT: ret
-entry:
%conv = zext <8 x i16> %a to <8 x i32>
%sub = sub <8 x i32> %conv, <i32 39, i32 42, i32 51, i32 51, i32 0, i32 64000, i32 127, i32 69>
%cmp.i = icmp slt <8 x i32> %sub, splat(i32 0)
@@ -644,7 +640,7 @@ entry:
; And now it's buildvector with sext and constants
define <4 x i32> @sabd_4h_bv_non_imm(<4 x i16> %a, i16 %b) {
; CHECK-LABEL: sabd_4h_bv_non_imm:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: sxth w9, w0
; CHECK-NEXT: mov w8, #-128 // =0xffffff80
; CHECK-NEXT: sshll v0.4s, v0.4h, #0
@@ -656,7 +652,6 @@ define <4 x i32> @sabd_4h_bv_non_imm(<4 x i16> %a, i16 %b) {
; CHECK-NEXT: mov v1.s[3], w8
; CHECK-NEXT: sabd v0.4s, v0.4s, v1.4s
; CHECK-NEXT: ret
-entry:
%conv = sext <4 x i16> %a to <4 x i32>
%exted.b = sext i16 %b to i32
%ze.vec = insertelement <4 x i32> <i32 poison, i32 -128, i32 42, i32 69>, i32 %exted.b, i32 0
@@ -672,7 +667,7 @@ entry:
; ... uabd
define <4 x i32> @uabd_4h_bv_non_imm(<4 x i16> %a, i16 %b) {
; CHECK-LABEL: uabd_4h_bv_non_imm:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: and w9, w0, #0xffff
; CHECK-NEXT: mov w8, #64000 // =0xfa00
; CHECK-NEXT: ushll v0.4s, v0.4h, #0
@@ -684,7 +679,6 @@ define <4 x i32> @uabd_4h_bv_non_imm(<4 x i16> %a, i16 %b) {
; CHECK-NEXT: mov v1.s[3], w8
; CHECK-NEXT: uabd v0.4s, v1.4s, v0.4s
; CHECK-NEXT: ret
-entry:
%conv = zext <4 x i16> %a to <4 x i32>
%exted.b = zext i16 %b to i32
%ze.vec = insertelement <4 x i32> <i32 poison, i32 64000, i32 13, i32 37>, i32 %exted.b, i32 0
@@ -700,7 +694,7 @@ entry:
; negative: immediate wont fit in signed i16
define <8 x i32> @sabd_8s_splat_imm_no_shrink(<8 x i16> %a) {
; CHECK-LABEL: sabd_8s_splat_imm_no_shrink:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: movi v1.4s, #250, lsl #8
; CHECK-NEXT: sshll2 v2.4s, v0.8h, #0
; CHECK-NEXT: sshll v0.4s, v0.4h, #0
@@ -709,7 +703,6 @@ define <8 x i32> @sabd_8s_splat_imm_no_shrink(<8 x i16> %a) {
; CHECK-NEXT: bic v1.4s, #3, lsl #16
; CHECK-NEXT: bic v0.4s, #3, lsl #16
; CHECK-NEXT: ret
-entry:
%conv = sext <8 x i16> %a to <8 x i32>
%sub = sub <8 x i32> %conv, splat(i32 64000)
%cmp.i = icmp slt <8 x i32> %sub, splat(i32 0)
@@ -723,7 +716,7 @@ entry:
; negative: value out of range of unsigned i16
define <8 x i32> @uabd_8s_splat_imm_no_shrink(<8 x i16> %a) {
; CHECK-LABEL: uabd_8s_splat_imm_no_shrink:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: movi v1.2d, #0xffffffffffffffff
; CHECK-NEXT: ushll2 v2.4s, v0.8h, #0
; CHECK-NEXT: ushll v0.4s, v0.4h, #0
@@ -733,7 +726,6 @@ define <8 x i32> @uabd_8s_splat_imm_no_shrink(<8 x i16> %a) {
; CHECK-NEXT: and v1.16b, v1.16b, v3.16b
; CHECK-NEXT: and v0.16b, v0.16b, v3.16b
; CHECK-NEXT: ret
-entry:
%conv = zext <8 x i16> %a to <8 x i32>
%sub = sub <8 x i32> %conv, splat(i32 -1)
%cmp.i = icmp slt <8 x i32> %sub, splat(i32 0)
@@ -746,10 +738,9 @@ entry:
define <4 x i32> @abs_sub(<4 x i32> %a, <4 x i32> %b) {
; CHECK-LABEL: abs_sub:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: sabd v0.4s, v1.4s, v0.4s
; CHECK-NEXT: ret
-entry:
%add = sub nsw <4 x i32> %b, %a
%cmp.i = icmp slt <4 x i32> %add, zeroinitializer
%sub.i = sub nsw <4 x i32> zeroinitializer, %add
@@ -762,18 +753,17 @@ entry:
; }
define <4 x i16> @abs_diff_add_v4i16(<4 x i16> %a, <4 x i16> %c) {
; CHECK-LABEL: abs_diff_add_v4i16:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: mov w8, #1170 // =0x492
; CHECK-NEXT: dup v2.4h, w8
; CHECK-NEXT: saba v1.4h, v0.4h, v2.4h
; CHECK-NEXT: fmov d0, d1
; CHECK-NEXT: ret
-entry:
%conv = sext <4 x i16> %a to <4 x i32>
%sub = add nsw <4 x i32> %conv, splat(i32 -1170)
- %0 = tail call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true)
- %1 = trunc <4 x i32> %0 to <4 x i16>
- %conv2 = add <4 x i16> %1, %c
+ %1 = tail call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true)
+ %2 = trunc <4 x i32> %1 to <4 x i16>
+ %conv2 = add <4 x i16> %2, %c
ret <4 x i16> %conv2
}
@@ -782,19 +772,18 @@ entry:
; }
define <4 x i16> @abs_diff_add_v4i16_rii(<4 x i16> %a) {
; CHECK-LABEL: abs_diff_add_v4i16_rii:
-; CHECK: // %bb.0: // %entry
+; CHECK: // %bb.0:
; CHECK-NEXT: mov w8, #2371 // =0x943
; CHECK-NEXT: movi v2.4h, #147
; CHECK-NEXT: dup v1.4h, w8
; CHECK-NEXT: saba v1.4h, v0.4h, v2.4h
; CHECK-NEXT: fmov d0, d1
; CHECK-NEXT: ret
-entry:
%conv = sext <4 x i16> %a to <4 x i32>
%sub = add nsw <4 x i32> %conv, splat(i32 -147)
- %0 = tail call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true)
- %1 = trunc <4 x i32> %0 to <4 x i16>
- %conv1 = add nuw <4 x i16> %1, splat(i16 2371)
+ %1 = tail call <4 x i32> @llvm.abs.v4i32(<4 x i32> %sub, i1 true)
+ %2 = trunc <4 x i32> %1 to <4 x i16>
+ %conv1 = add nuw <4 x i16> %2, splat(i16 2371)
ret <4 x i16> %conv1
}
diff --git a/llvm/test/CodeGen/X86/abds.ll b/llvm/test/CodeGen/X86/abds.ll
index c18de18c174a5..5948af563d152 100644
--- a/llvm/test/CodeGen/X86/abds.ll
+++ b/llvm/test/CodeGen/X86/abds.ll
@@ -1366,8 +1366,8 @@ define i128 @abd_select_i128(i128 %a, i128 %b) nounwind {
; This used to be miscompiled into (abdu %v, i32:-1)
; https://github.com/llvm/llvm-project/issues/185467
-define i32 @issue185467(i32 range(i32 0, 2147483647) %v) {
-; X86-LABEL: issue185467:
+define i32 @PR185467(i32 range(i32 0, 2147483647) %v) {
+; X86-LABEL: PR185467:
; X86: # %bb.0:
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X86-NEXT: incl %ecx
@@ -1376,7 +1376,7 @@ define i32 @issue185467(i32 range(i32 0, 2147483647) %v) {
; X86-NEXT: cmovsl %ecx, %eax
; X86-NEXT: retl
;
-; X64-LABEL: issue185467:
+; X64-LABEL: PR185467:
; X64: # %bb.0:
; X64-NEXT: # kill: def $edi killed $edi def $rdi
; X64-NEXT: leal 1(%rdi), %ecx
More information about the llvm-commits
mailing list