xref: /llvm-project/llvm/test/Transforms/InstCombine/vscale_sext_and_zext.ll (revision 7203286329defc7976c719d8750712c0d5de9c31)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4;
5; Sign-extend
6;
7
8define i32 @vscale_SExt_i8toi32() vscale_range(1, 64) {
9; CHECK-LABEL: @vscale_SExt_i8toi32(
10; CHECK-NEXT:  entry:
11; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.vscale.i32()
12; CHECK-NEXT:    ret i32 [[TMP0]]
13;
14entry:
15  %0 = call i8 @llvm.vscale.i8()
16  %1 = sext i8 %0 to i32
17  ret i32 %1
18}
19
20define i32 @vscale_SExt_i8toi32_poison() vscale_range(1, 128) {
21; CHECK-LABEL: @vscale_SExt_i8toi32_poison(
22; CHECK-NEXT:  entry:
23; CHECK-NEXT:    [[TMP0:%.*]] = call i8 @llvm.vscale.i8()
24; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[TMP0]] to i32
25; CHECK-NEXT:    ret i32 [[TMP1]]
26;
27  entry:
28  %0 = call i8 @llvm.vscale.i8()
29  %1 = sext i8 %0 to i32
30  ret i32 %1
31}
32
33;
34; Zero-extend
35;
36
37define i32 @vscale_ZExt_i8toi32() vscale_range(1, 128) {
38; CHECK-LABEL: @vscale_ZExt_i8toi32(
39; CHECK-NEXT:  entry:
40; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.vscale.i32()
41; CHECK-NEXT:    ret i32 [[TMP0]]
42;
43entry:
44  %0 = call i8 @llvm.vscale.i8()
45  %1 = zext i8 %0 to i32
46  ret i32 %1
47}
48
49define i32 @vscale_ZExt_i8toi32_poison() vscale_range(1, 256) {
50; CHECK-LABEL: @vscale_ZExt_i8toi32_poison(
51; CHECK-NEXT:  entry:
52; CHECK-NEXT:    [[TMP0:%.*]] = call i8 @llvm.vscale.i8()
53; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
54; CHECK-NEXT:    ret i32 [[TMP1]]
55;
56  entry:
57  %0 = call i8 @llvm.vscale.i8()
58  %1 = zext i8 %0 to i32
59  ret i32 %1
60}
61
62;
63; No vscale_range attribute
64;
65
66define i32 @vscale_ZExt_i8toi32_unknown() {
67; CHECK-LABEL: @vscale_ZExt_i8toi32_unknown(
68; CHECK-NEXT:  entry:
69; CHECK-NEXT:    [[TMP0:%.*]] = call i8 @llvm.vscale.i8()
70; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
71; CHECK-NEXT:    ret i32 [[TMP1]]
72;
73  entry:
74  %0 = call i8 @llvm.vscale.i8()
75  %1 = zext i8 %0 to i32
76  ret i32 %1
77}
78
79;
80; unbounded vscale_range maximum (0)
81;
82
83define i32 @vscale_SExt_i8toi32_unbounded() vscale_range(1, 0) {
84; CHECK-LABEL: @vscale_SExt_i8toi32_unbounded(
85; CHECK-NEXT:  entry:
86; CHECK-NEXT:    [[TMP0:%.*]] = call i8 @llvm.vscale.i8()
87; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[TMP0]] to i32
88; CHECK-NEXT:    ret i32 [[TMP1]]
89;
90  entry:
91  %0 = call i8 @llvm.vscale.i8()
92  %1 = sext i8 %0 to i32
93  ret i32 %1
94}
95
96define i32 @vscale_ZExt_i8toi32_unbounded() vscale_range(1, 0) {
97; CHECK-LABEL: @vscale_ZExt_i8toi32_unbounded(
98; CHECK-NEXT:  entry:
99; CHECK-NEXT:    [[TMP0:%.*]] = call i8 @llvm.vscale.i8()
100; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[TMP0]] to i32
101; CHECK-NEXT:    ret i32 [[TMP1]]
102;
103  entry:
104  %0 = call i8 @llvm.vscale.i8()
105  %1 = zext i8 %0 to i32
106  ret i32 %1
107}
108
109declare i8  @llvm.vscale.i8()
110