[llvm] Improve SelectionDAG::ComputeNumSignBits test coverage for ISD::ABDS (PR #175321)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 14 09:26:54 PST 2026


https://github.com/RKSimon updated https://github.com/llvm/llvm-project/pull/175321

>From e3f5d8aa4c71b45120295604d7277b0ab5e5d30d Mon Sep 17 00:00:00 2001
From: Dhruva Narayan <dhruvakodiadka at gmail.com>
Date: Sat, 10 Jan 2026 21:06:20 +0530
Subject: [PATCH] Handle ISD::ABDS in ComputeNumSignBits

---
 .../AArch64/AArch64SelectionDAGTest.cpp       | 51 +++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp b/llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp
index 14e1efaf65c8f..1d5a8b064b05b 100644
--- a/llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp
+++ b/llvm/unittests/Target/AArch64/AArch64SelectionDAGTest.cpp
@@ -338,6 +338,57 @@ TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_ADDC) {
   EXPECT_EQ(DAG->ComputeNumSignBits(Op), 2u);
 }
 
+TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_ABDS) {
+  SDLoc Loc;
+  auto IntVT = EVT::getIntegerVT(Context, 8);
+  auto VecVT = MVT::v8i8;
+
+  auto N0 = DAG->getConstant(0x00, Loc, IntVT);
+  auto V0 = DAG->getConstant(0x00, Loc, VecVT);
+  auto Nsign1 = DAG->getConstant(0x55, Loc, IntVT);
+
+  auto UnknownScalar = DAG->getUNDEF(IntVT);
+  auto UnknownVec = DAG->getUNDEF(VecVT);
+
+  // AssertSext to i4 guarantees 5 sign bits in i8
+  // Op5Sig = sssss???
+  auto Op5Sig = DAG->getNode(ISD::AssertSext, Loc, IntVT, UnknownScalar,
+                             DAG->getValueType(MVT::i4));
+
+  // Vec5Sig = sssss??? per element
+  auto Vec5Sig = DAG->getNode(ISD::AssertSext, Loc, VecVT, UnknownVec,
+                              DAG->getValueType(MVT::i4));
+
+  // LHS early out
+  // Nsign1 = 01010101
+  // N0     = 00000000
+  auto OpLhsEo = DAG->getNode(ISD::ABDS, Loc, IntVT, Nsign1, N0);
+  EXPECT_EQ(DAG->ComputeNumSignBits(OpLhsEo), 1u);
+
+  // Normal scalar case
+  // Op5Sig = sssss???
+  // N0     = 00000000
+  auto OpScalar = DAG->getNode(ISD::ABDS, Loc, IntVT, Op5Sig, N0);
+  EXPECT_EQ(DAG->ComputeNumSignBits(OpScalar), 4u);
+
+  // Normal vector case
+  // Vec5Sig = sssss???
+  // V0      = 00000000
+  auto OpVec = DAG->getNode(ISD::ABDS, Loc, VecVT, Vec5Sig, V0);
+  EXPECT_EQ(DAG->ComputeNumSignBits(OpVec), 4u);
+
+  // RHS early out
+  // N0     = 00000000
+  // Nsign1 = 01010101
+  auto OpRhsEo = DAG->getNode(ISD::ABDS, Loc, IntVT, N0, Nsign1);
+  EXPECT_EQ(DAG->ComputeNumSignBits(OpRhsEo), 1u);
+
+  // Zero case
+  // N0 = 00000000
+  auto OpZero = DAG->getNode(ISD::ABDS, Loc, IntVT, N0, N0);
+  EXPECT_EQ(DAG->ComputeNumSignBits(OpZero), 8u);
+}
+
 TEST_F(AArch64SelectionDAGTest, SimplifyDemandedVectorElts_EXTRACT_SUBVECTOR) {
   TargetLowering TL(*TM, *STI);
 



More information about the llvm-commits mailing list