[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:00:25 PDT 2024
https://github.com/goldsteinn updated https://github.com/llvm/llvm-project/pull/85574
>From af60554d867478c8d799392c7b08ef9c083306fa 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, 1 insertion(+), 12 deletions(-)
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index edbeede910d7f7..8ac2626acc08a8 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -419,27 +419,16 @@ static void computeKnownBitsMul(const Value *Op0, const Value *Op1, bool NSW,
void llvm::computeKnownBitsFromRangeMetadata(const MDNode &Ranges,
KnownBits &Known) {
- unsigned BitWidth = Known.getBitWidth();
unsigned NumRanges = Ranges.getNumOperands() / 2;
assert(NumRanges >= 1);
- Known.Zero.setAllBits();
- Known.One.setAllBits();
-
for (unsigned i = 0; i < NumRanges; ++i) {
ConstantInt *Lower =
mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 0));
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;
+ Known = Known.unionWith(Range.toKnownBits());
}
}
More information about the llvm-commits
mailing list