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