Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions llvm/lib/Transforms/Utils/SCCPSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1923,6 +1923,12 @@ void SCCPInstVisitor::handleCallResult(CallBase &CB) {
return (void)mergeInValue(IV, &CB, CopyOfVal);
}

if (II->getIntrinsicID() == Intrinsic::vscale) {
unsigned BitWidth = CB.getType()->getScalarSizeInBits();
const ConstantRange Result = getVScaleRange(II->getFunction(), BitWidth);
return (void)mergeInValue(II, ValueLatticeElement::getRange(Result));
}

if (ConstantRange::isIntrinsicSupported(II->getIntrinsicID())) {
// Compute result range for intrinsics supported by ConstantRange.
// Do this even if we don't know a range for all operands, as we may
Expand Down
56 changes: 56 additions & 0 deletions llvm/test/Transforms/SCCP/vscale-intrinsic.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt < %s -passes=sccp -S | FileCheck %s

define i1 @vscale_i32_noattr() {
; CHECK-LABEL: define i1 @vscale_i32_noattr() {
; CHECK-NEXT: [[SCALE:%.*]] = call i32 @llvm.vscale.i32()
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[SCALE]], 16
; CHECK-NEXT: [[RES:%.*]] = and i1 true, [[CMP2]]
; CHECK-NEXT: ret i1 [[RES]]
;
%scale = call i32 @llvm.vscale.i32()
%cmp1 = icmp uge i32 %scale, 1
%cmp2 = icmp ule i32 %scale, 16
%res = and i1 %cmp1, %cmp2
ret i1 %res
}

define i1 @vscale_i32_attr() vscale_range(1, 16) {
; CHECK-LABEL: define i1 @vscale_i32_attr(
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[SCALE:%.*]] = call i32 @llvm.vscale.i32()
; CHECK-NEXT: ret i1 true
;
%scale = call i32 @llvm.vscale.i32()
%cmp1 = icmp uge i32 %scale, 1
%cmp2 = icmp ule i32 %scale, 16
%res = and i1 %cmp1, %cmp2
ret i1 %res
}

define i1 @vscale_i64_noattr() {
; CHECK-LABEL: define i1 @vscale_i64_noattr() {
; CHECK-NEXT: [[SCALE:%.*]] = call i64 @llvm.vscale.i64()
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i64 [[SCALE]], 16
; CHECK-NEXT: [[RES:%.*]] = and i1 true, [[CMP2]]
; CHECK-NEXT: ret i1 [[RES]]
;
%scale = call i64 @llvm.vscale.i64()
%cmp1 = icmp uge i64 %scale, 1
%cmp2 = icmp ule i64 %scale, 16
%res = and i1 %cmp1, %cmp2
ret i1 %res
}

define i1 @vscale_i64_attr() vscale_range(1, 16) {
; CHECK-LABEL: define i1 @vscale_i64_attr(
; CHECK-SAME: ) #[[ATTR0]] {
; CHECK-NEXT: [[SCALE:%.*]] = call i64 @llvm.vscale.i64()
; CHECK-NEXT: ret i1 true
;
%scale = call i64 @llvm.vscale.i64()
%cmp1 = icmp uge i64 %scale, 1
%cmp2 = icmp ule i64 %scale, 16
%res = and i1 %cmp1, %cmp2
ret i1 %res
}
Loading