[llvm] [ValueTracking] Use `ConstantRange::toKnownBits` when computing from Range Metadata; NFC (PR #85574)

via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 17 10:38:27 PDT 2024


https://github.com/goldsteinn updated https://github.com/llvm/llvm-project/pull/85574

>From 626bda63ff41a1d882848b92e196cf0f81b6f102 Mon Sep 17 00:00:00 2001
From: Noah Goldstein <goldstein.w.n at gmail.com>
Date: Sun, 17 Mar 2024 11:57:41 -0500
Subject: [PATCH] [ValueTracking] Use `ConstantRange::toKnownBits` when
 computing from Range Metadata; NFC

Just replaces some bespoke logic with a better tested API.
---
 llvm/lib/Analysis/ValueTracking.cpp | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index edbeede910d7f7..01ca0cb279e105 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -423,8 +423,7 @@ void llvm::computeKnownBitsFromRangeMetadata(const MDNode &Ranges,
   unsigned NumRanges = Ranges.getNumOperands() / 2;
   assert(NumRanges >= 1);
 
-  Known.Zero.setAllBits();
-  Known.One.setAllBits();
+  ConstantRange CR = ConstantRange::getFull(BitWidth);
 
   for (unsigned i = 0; i < NumRanges; ++i) {
     ConstantInt *Lower =
@@ -432,15 +431,9 @@ void llvm::computeKnownBitsFromRangeMetadata(const MDNode &Ranges,
     ConstantInt *Upper =
         mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 1));
     ConstantRange Range(Lower->getValue(), Upper->getValue());
-
-    // The first CommonPrefixBits of all values in Range are equal.
-    unsigned CommonPrefixBits =
-        (Range.getUnsignedMax() ^ Range.getUnsignedMin()).countl_zero();
-    APInt Mask = APInt::getHighBitsSet(BitWidth, CommonPrefixBits);
-    APInt UnsignedMax = Range.getUnsignedMax().zextOrTrunc(BitWidth);
-    Known.One &= UnsignedMax & Mask;
-    Known.Zero &= ~UnsignedMax & Mask;
+    CR = CR.intersectWith(Range.zextOrTrunc(BitWidth));
   }
+  Known = Known.unionWith(CR.toKnownBits());
 }
 
 static bool isEphemeralValueOf(const Instruction *I, const Value *E) {



More information about the llvm-commits mailing list