[llvm] 2e9bc1b - [LVI] Use !range metadata for supported intrinsics
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 26 06:11:17 PST 2023
Author: Nikita Popov
Date: 2023-01-26T15:09:48+01:00
New Revision: 2e9bc1b8614c9422573cf2f4728525787b0cb0cb
URL: https://github.com/llvm/llvm-project/commit/2e9bc1b8614c9422573cf2f4728525787b0cb0cb
DIFF: https://github.com/llvm/llvm-project/commit/2e9bc1b8614c9422573cf2f4728525787b0cb0cb.diff
LOG: [LVI] Use !range metadata for supported intrinsics
Even if the intrinsic is supported by ConstantRange, we should
still make use of !range metadata. This doesn't matter much now,
but is important if we want to support ctlz style intrinsics,
which always have KnownBits-based !range metadata attached, which
might be better than what we can compute using ranges.
Added:
Modified:
llvm/lib/Analysis/LazyValueInfo.cpp
llvm/test/Transforms/CorrelatedValuePropagation/range.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index f1587cecf9fbd..16d9ad74769ea 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -990,10 +990,11 @@ LazyValueInfoImpl::solveBlockValueOverflowIntrinsic(WithOverflowInst *WO,
std::optional<ValueLatticeElement>
LazyValueInfoImpl::solveBlockValueIntrinsic(IntrinsicInst *II, BasicBlock *BB) {
+ ValueLatticeElement MetadataVal = getFromRangeMetadata(II);
if (!ConstantRange::isIntrinsicSupported(II->getIntrinsicID())) {
LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
<< "' - unknown intrinsic.\n");
- return getFromRangeMetadata(II);
+ return MetadataVal;
}
SmallVector<ConstantRange, 2> OpRanges;
@@ -1004,8 +1005,9 @@ LazyValueInfoImpl::solveBlockValueIntrinsic(IntrinsicInst *II, BasicBlock *BB) {
OpRanges.push_back(*Range);
}
- return ValueLatticeElement::getRange(
- ConstantRange::intrinsic(II->getIntrinsicID(), OpRanges));
+ return intersect(ValueLatticeElement::getRange(ConstantRange::intrinsic(
+ II->getIntrinsicID(), OpRanges)),
+ MetadataVal);
}
std::optional<ValueLatticeElement>
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/range.ll b/llvm/test/Transforms/CorrelatedValuePropagation/range.ll
index 458ecae0cbc3d..26b31ce8ee096 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/range.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/range.ll
@@ -950,8 +950,7 @@ define i1 @supported_intrinsic_range(i16 %x) {
; CHECK-LABEL: @supported_intrinsic_range(
; CHECK-NEXT: [[ABS:%.*]] = call i16 @llvm.abs.i16(i16 [[X:%.*]], i1 false), !range [[RNG5]]
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i16 [[ABS]] to i8
-; CHECK-NEXT: [[RES:%.*]] = icmp ult i8 [[TRUNC]], 8
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 true
;
%abs = call i16 @llvm.abs.i16(i16 %x, i1 false), !range !{i16 0, i16 8}
%trunc = trunc i16 %abs to i8
More information about the llvm-commits
mailing list