Skip to content

Commit 2e9bc1b

Browse files
committed
[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.
1 parent 1f88048 commit 2e9bc1b

File tree

2 files changed

+6
-5
lines changed

2 files changed

+6
-5
lines changed

llvm/lib/Analysis/LazyValueInfo.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -990,10 +990,11 @@ LazyValueInfoImpl::solveBlockValueOverflowIntrinsic(WithOverflowInst *WO,
990990

991991
std::optional<ValueLatticeElement>
992992
LazyValueInfoImpl::solveBlockValueIntrinsic(IntrinsicInst *II, BasicBlock *BB) {
993+
ValueLatticeElement MetadataVal = getFromRangeMetadata(II);
993994
if (!ConstantRange::isIntrinsicSupported(II->getIntrinsicID())) {
994995
LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
995996
<< "' - unknown intrinsic.\n");
996-
return getFromRangeMetadata(II);
997+
return MetadataVal;
997998
}
998999

9991000
SmallVector<ConstantRange, 2> OpRanges;
@@ -1004,8 +1005,9 @@ LazyValueInfoImpl::solveBlockValueIntrinsic(IntrinsicInst *II, BasicBlock *BB) {
10041005
OpRanges.push_back(*Range);
10051006
}
10061007

1007-
return ValueLatticeElement::getRange(
1008-
ConstantRange::intrinsic(II->getIntrinsicID(), OpRanges));
1008+
return intersect(ValueLatticeElement::getRange(ConstantRange::intrinsic(
1009+
II->getIntrinsicID(), OpRanges)),
1010+
MetadataVal);
10091011
}
10101012

10111013
std::optional<ValueLatticeElement>

llvm/test/Transforms/CorrelatedValuePropagation/range.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -950,8 +950,7 @@ define i1 @supported_intrinsic_range(i16 %x) {
950950
; CHECK-LABEL: @supported_intrinsic_range(
951951
; CHECK-NEXT: [[ABS:%.*]] = call i16 @llvm.abs.i16(i16 [[X:%.*]], i1 false), !range [[RNG5]]
952952
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i16 [[ABS]] to i8
953-
; CHECK-NEXT: [[RES:%.*]] = icmp ult i8 [[TRUNC]], 8
954-
; CHECK-NEXT: ret i1 [[RES]]
953+
; CHECK-NEXT: ret i1 true
955954
;
956955
%abs = call i16 @llvm.abs.i16(i16 %x, i1 false), !range !{i16 0, i16 8}
957956
%trunc = trunc i16 %abs to i8

0 commit comments

Comments
 (0)