File tree Expand file tree Collapse file tree 2 files changed +54
-0
lines changed
lib/Transforms/InstCombine
test/Transforms/InstCombine Expand file tree Collapse file tree 2 files changed +54
-0
lines changed Original file line number Diff line number Diff line change @@ -961,6 +961,20 @@ Instruction *InstCombinerImpl::visitTrunc(TruncInst &Trunc) {
961
961
return BinaryOperator::CreateAdd (NarrowCtlz, WidthDiff);
962
962
}
963
963
}
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
+
964
978
return nullptr ;
965
979
}
966
980
Original file line number Diff line number Diff line change
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 ()
You can’t perform that action at this time.
0 commit comments