From 0a99fbafef3cce93999d4c31e3d0345a7a86c006 Mon Sep 17 00:00:00 2001 From: John Lu Date: Tue, 25 Mar 2025 14:59:23 -0500 Subject: [PATCH 1/5] Ensure KnownBits passed to computeKnownBitsFromRangeMetadata has correct size Signed-off-by: John Lu --- llvm/lib/Analysis/ValueTracking.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 880781742fae0..4e3d5d8f12cbc 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -433,6 +433,8 @@ void llvm::computeKnownBitsFromRangeMetadata(const MDNode &Ranges, // The first CommonPrefixBits of all values in Range are equal. unsigned CommonPrefixBits = (Range.getUnsignedMax() ^ Range.getUnsignedMin()).countl_zero(); + // BitWidth must equal the Ranges BitWidth for the correct number of high bits to be set. + assert(BitWidth == Lower->getBitWidth() ); APInt Mask = APInt::getHighBitsSet(BitWidth, CommonPrefixBits); APInt UnsignedMax = Range.getUnsignedMax().zextOrTrunc(BitWidth); Known.One &= UnsignedMax & Mask; From 1c79f0f868649909849417356cc801abdbc1f68f Mon Sep 17 00:00:00 2001 From: John Lu Date: Tue, 25 Mar 2025 15:03:11 -0500 Subject: [PATCH 2/5] Fix formatting Signed-off-by: John Lu --- llvm/lib/Analysis/ValueTracking.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 4e3d5d8f12cbc..0a423b764c95d 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -433,8 +433,9 @@ void llvm::computeKnownBitsFromRangeMetadata(const MDNode &Ranges, // The first CommonPrefixBits of all values in Range are equal. unsigned CommonPrefixBits = (Range.getUnsignedMax() ^ Range.getUnsignedMin()).countl_zero(); - // BitWidth must equal the Ranges BitWidth for the correct number of high bits to be set. - assert(BitWidth == Lower->getBitWidth() ); + // BitWidth must equal the Ranges BitWidth for the correct number of high + // bits to be set. + assert(BitWidth == Lower->getBitWidth()); APInt Mask = APInt::getHighBitsSet(BitWidth, CommonPrefixBits); APInt UnsignedMax = Range.getUnsignedMax().zextOrTrunc(BitWidth); Known.One &= UnsignedMax & Mask; From 40d30f36612515aa71ecbed899b9903583b6ac39 Mon Sep 17 00:00:00 2001 From: John Lu Date: Thu, 27 Mar 2025 13:23:56 -0500 Subject: [PATCH 3/5] When creating load assert that range MD and load type are consistent Signed-off-by: John Lu --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 7ce4eebf685e1..07a5788c8e845 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -9176,6 +9176,12 @@ SDValue SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, "Cannot use an ext load to change the number of vector elements!"); } + assert((!MMO->getRanges() || + (mdconst::extract(MMO->getRanges()->getOperand(0)) + ->getBitWidth() == MemVT.getScalarSizeInBits() && + MemVT.isInteger())) && + "Range metadata and load type must match!"); + bool Indexed = AM != ISD::UNINDEXED; assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!"); From f2e682b35348e8e2180a511658da239c4b0765bf Mon Sep 17 00:00:00 2001 From: John Lu Date: Thu, 27 Mar 2025 13:28:24 -0500 Subject: [PATCH 4/5] Add assertion text Signed-off-by: John Lu --- llvm/lib/Analysis/ValueTracking.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 0a423b764c95d..9a06f88093e5d 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -435,7 +435,8 @@ void llvm::computeKnownBitsFromRangeMetadata(const MDNode &Ranges, (Range.getUnsignedMax() ^ Range.getUnsignedMin()).countl_zero(); // BitWidth must equal the Ranges BitWidth for the correct number of high // bits to be set. - assert(BitWidth == Lower->getBitWidth()); + assert(BitWidth == Lower->getBitWidth() && + "Known bit width must match range bit width!"); APInt Mask = APInt::getHighBitsSet(BitWidth, CommonPrefixBits); APInt UnsignedMax = Range.getUnsignedMax().zextOrTrunc(BitWidth); Known.One &= UnsignedMax & Mask; From d68da5ac6266e522012b37c48672a9ef3e756445 Mon Sep 17 00:00:00 2001 From: John Lu Date: Fri, 28 Mar 2025 06:54:25 -0500 Subject: [PATCH 5/5] Use Range.getBitWidth() Signed-off-by: John Lu --- llvm/lib/Analysis/ValueTracking.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 9a06f88093e5d..f6ae9ed99fb3b 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -429,14 +429,14 @@ void llvm::computeKnownBitsFromRangeMetadata(const MDNode &Ranges, ConstantInt *Upper = mdconst::extract(Ranges.getOperand(2 * i + 1)); ConstantRange Range(Lower->getValue(), Upper->getValue()); + // BitWidth must equal the Ranges BitWidth for the correct number of high + // bits to be set. + assert(BitWidth == Range.getBitWidth() && + "Known bit width must match range bit width!"); // The first CommonPrefixBits of all values in Range are equal. unsigned CommonPrefixBits = (Range.getUnsignedMax() ^ Range.getUnsignedMin()).countl_zero(); - // BitWidth must equal the Ranges BitWidth for the correct number of high - // bits to be set. - assert(BitWidth == Lower->getBitWidth() && - "Known bit width must match range bit width!"); APInt Mask = APInt::getHighBitsSet(BitWidth, CommonPrefixBits); APInt UnsignedMax = Range.getUnsignedMax().zextOrTrunc(BitWidth); Known.One &= UnsignedMax & Mask;