Skip to content

Commit 4be7fb9

Browse files
[SVE] Add folds for truncation of vscale
Reviewed By: david-arm Differential Revision: https://reviews.llvm.org/D107453
1 parent 46abd1f commit 4be7fb9

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,20 @@ Instruction *InstCombinerImpl::visitTrunc(TruncInst &Trunc) {
961961
return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
962962
}
963963
}
964+
965+
if (match(Src, m_VScale(DL))) {
966+
if (Trunc.getFunction()->hasFnAttribute(Attribute::VScaleRange)) {
967+
unsigned MaxVScale = Trunc.getFunction()
968+
->getFnAttribute(Attribute::VScaleRange)
969+
.getVScaleRangeArgs()
970+
.second;
971+
if (MaxVScale > 0 && Log2_32(MaxVScale) < DestWidth) {
972+
Value *VScale = Builder.CreateVScale(ConstantInt::get(DestTy, 1));
973+
return replaceInstUsesWith(Trunc, VScale);
974+
}
975+
}
976+
}
977+
964978
return nullptr;
965979
}
966980

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -instcombine -S | FileCheck %s
3+
4+
define i8 @vscale_trunc_i32toi8() vscale_range(0, 255) {
5+
; CHECK-LABEL: @vscale_trunc_i32toi8(
6+
; CHECK-NEXT: entry:
7+
; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8()
8+
; CHECK-NEXT: ret i8 [[TMP0]]
9+
entry:
10+
%0 = call i32 @llvm.vscale.i32()
11+
%1 = trunc i32 %0 to i8
12+
ret i8 %1
13+
}
14+
15+
16+
define i8 @vscale_trunc_i32toi8_poison() vscale_range(0, 256) {
17+
; CHECK-LABEL: @vscale_trunc_i32toi8_poison(
18+
; CHECK-NEXT: entry:
19+
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vscale.i32()
20+
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[TMP0]] to i8
21+
; CHECK-NEXT: ret i8 [[TMP1]]
22+
entry:
23+
%0 = call i32 @llvm.vscale.i32()
24+
%1 = trunc i32 %0 to i8
25+
ret i8 %1
26+
}
27+
28+
define i8 @vscale_trunc_i32toi8_noAttr() {
29+
; CHECK-LABEL: @vscale_trunc_i32toi8_noAttr(
30+
; CHECK-NEXT: entry:
31+
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vscale.i32()
32+
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[TMP0]] to i8
33+
; CHECK-NEXT: ret i8 [[TMP1]]
34+
entry:
35+
%0 = call i32 @llvm.vscale.i32()
36+
%1 = trunc i32 %0 to i8
37+
ret i8 %1
38+
}
39+
40+
declare i32 @llvm.vscale.i32()

0 commit comments

Comments
 (0)