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 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 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 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