forked from OSchip/llvm-project
[SVE] Add folds for truncation of vscale
Reviewed By: david-arm Differential Revision: https://reviews.llvm.org/D107453
This commit is contained in:
parent
46abd1fbe8
commit
4be7fb9762
|
@ -961,6 +961,20 @@ Instruction *InstCombinerImpl::visitTrunc(TruncInst &Trunc) {
|
|||
return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
|
||||
}
|
||||
}
|
||||
|
||||
if (match(Src, m_VScale(DL))) {
|
||||
if (Trunc.getFunction()->hasFnAttribute(Attribute::VScaleRange)) {
|
||||
unsigned MaxVScale = Trunc.getFunction()
|
||||
->getFnAttribute(Attribute::VScaleRange)
|
||||
.getVScaleRangeArgs()
|
||||
.second;
|
||||
if (MaxVScale > 0 && Log2_32(MaxVScale) < DestWidth) {
|
||||
Value *VScale = Builder.CreateVScale(ConstantInt::get(DestTy, 1));
|
||||
return replaceInstUsesWith(Trunc, VScale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
define i8 @vscale_trunc_i32toi8() vscale_range(0, 255) {
|
||||
; CHECK-LABEL: @vscale_trunc_i32toi8(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8()
|
||||
; CHECK-NEXT: ret i8 [[TMP0]]
|
||||
entry:
|
||||
%0 = call i32 @llvm.vscale.i32()
|
||||
%1 = trunc i32 %0 to i8
|
||||
ret i8 %1
|
||||
}
|
||||
|
||||
|
||||
define i8 @vscale_trunc_i32toi8_poison() vscale_range(0, 256) {
|
||||
; CHECK-LABEL: @vscale_trunc_i32toi8_poison(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vscale.i32()
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[TMP0]] to i8
|
||||
; CHECK-NEXT: ret i8 [[TMP1]]
|
||||
entry:
|
||||
%0 = call i32 @llvm.vscale.i32()
|
||||
%1 = trunc i32 %0 to i8
|
||||
ret i8 %1
|
||||
}
|
||||
|
||||
define i8 @vscale_trunc_i32toi8_noAttr() {
|
||||
; CHECK-LABEL: @vscale_trunc_i32toi8_noAttr(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vscale.i32()
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[TMP0]] to i8
|
||||
; CHECK-NEXT: ret i8 [[TMP1]]
|
||||
entry:
|
||||
%0 = call i32 @llvm.vscale.i32()
|
||||
%1 = trunc i32 %0 to i8
|
||||
ret i8 %1
|
||||
}
|
||||
|
||||
declare i32 @llvm.vscale.i32()
|
Loading…
Reference in New Issue