Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / get_vector_length.ll
blob1d42b6e3937c76ebe883cd1a0aa5b5328a09ccae
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+m,+v -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,RV32
3 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv64 -mattr=+m,+v -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,RV64
5 declare i32 @llvm.experimental.get.vector.length.i16(i16, i32, i1)
6 declare i32 @llvm.experimental.get.vector.length.i32(i32, i32, i1)
7 declare i32 @llvm.experimental.get.vector.length.i64(i64, i32, i1)
9 define i32 @vector_length_i16(i16 zeroext %tc) {
10 ; CHECK-LABEL: vector_length_i16:
11 ; CHECK:       # %bb.0:
12 ; CHECK-NEXT:    csrr a1, vlenb
13 ; CHECK-NEXT:    srli a1, a1, 2
14 ; CHECK-NEXT:    bltu a0, a1, .LBB0_2
15 ; CHECK-NEXT:  # %bb.1:
16 ; CHECK-NEXT:    mv a0, a1
17 ; CHECK-NEXT:  .LBB0_2:
18 ; CHECK-NEXT:    ret
19   %a = call i32 @llvm.experimental.get.vector.length.i16(i16 %tc, i32 2, i1 true)
20   ret i32 %a
23 define i32 @vector_length_i32(i32 zeroext %tc) {
24 ; CHECK-LABEL: vector_length_i32:
25 ; CHECK:       # %bb.0:
26 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf4, ta, ma
27 ; CHECK-NEXT:    ret
28   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 2, i1 true)
29   ret i32 %a
32 define i32 @vector_length_XLen(iXLen zeroext %tc) {
33 ; CHECK-LABEL: vector_length_XLen:
34 ; CHECK:       # %bb.0:
35 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf4, ta, ma
36 ; CHECK-NEXT:    ret
37   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 2, i1 true)
38   ret i32 %a
41 define i32 @vector_length_i16_fixed(i16 zeroext %tc) {
42 ; CHECK-LABEL: vector_length_i16_fixed:
43 ; CHECK:       # %bb.0:
44 ; CHECK-NEXT:    li a1, 2
45 ; CHECK-NEXT:    bltu a0, a1, .LBB3_2
46 ; CHECK-NEXT:  # %bb.1:
47 ; CHECK-NEXT:    li a0, 2
48 ; CHECK-NEXT:  .LBB3_2:
49 ; CHECK-NEXT:    ret
50   %a = call i32 @llvm.experimental.get.vector.length.i16(i16 %tc, i32 2, i1 false)
51   ret i32 %a
54 define i32 @vector_length_i32_fixed(i32 zeroext %tc) {
55 ; RV32-LABEL: vector_length_i32_fixed:
56 ; RV32:       # %bb.0:
57 ; RV32-NEXT:    li a1, 2
58 ; RV32-NEXT:    bltu a0, a1, .LBB4_2
59 ; RV32-NEXT:  # %bb.1:
60 ; RV32-NEXT:    li a0, 2
61 ; RV32-NEXT:  .LBB4_2:
62 ; RV32-NEXT:    ret
64 ; RV64-LABEL: vector_length_i32_fixed:
65 ; RV64:       # %bb.0:
66 ; RV64-NEXT:    sext.w a0, a0
67 ; RV64-NEXT:    li a1, 2
68 ; RV64-NEXT:    bltu a0, a1, .LBB4_2
69 ; RV64-NEXT:  # %bb.1:
70 ; RV64-NEXT:    li a0, 2
71 ; RV64-NEXT:  .LBB4_2:
72 ; RV64-NEXT:    ret
73   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 2, i1 false)
74   ret i32 %a
77 define i32 @vector_length_XLen_fixed(iXLen zeroext %tc) {
78 ; RV32-LABEL: vector_length_XLen_fixed:
79 ; RV32:       # %bb.0:
80 ; RV32-NEXT:    li a1, 2
81 ; RV32-NEXT:    bltu a0, a1, .LBB5_2
82 ; RV32-NEXT:  # %bb.1:
83 ; RV32-NEXT:    li a0, 2
84 ; RV32-NEXT:  .LBB5_2:
85 ; RV32-NEXT:    ret
87 ; RV64-LABEL: vector_length_XLen_fixed:
88 ; RV64:       # %bb.0:
89 ; RV64-NEXT:    sext.w a0, a0
90 ; RV64-NEXT:    li a1, 2
91 ; RV64-NEXT:    bltu a0, a1, .LBB5_2
92 ; RV64-NEXT:  # %bb.1:
93 ; RV64-NEXT:    li a0, 2
94 ; RV64-NEXT:  .LBB5_2:
95 ; RV64-NEXT:    ret
96   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 2, i1 false)
97   ret i32 %a
100 define i32 @vector_length_vf1_i32(i32 zeroext %tc) {
101 ; CHECK-LABEL: vector_length_vf1_i32:
102 ; CHECK:       # %bb.0:
103 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf8, ta, ma
104 ; CHECK-NEXT:    ret
105   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 1, i1 true)
106   ret i32 %a
109 define i32 @vector_length_vf1_XLen(iXLen zeroext %tc) {
110 ; CHECK-LABEL: vector_length_vf1_XLen:
111 ; CHECK:       # %bb.0:
112 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf8, ta, ma
113 ; CHECK-NEXT:    ret
114   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 1, i1 true)
115   ret i32 %a
118 define i32 @vector_length_vf2_i32(i32 zeroext %tc) {
119 ; CHECK-LABEL: vector_length_vf2_i32:
120 ; CHECK:       # %bb.0:
121 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf4, ta, ma
122 ; CHECK-NEXT:    ret
123   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 2, i1 true)
124   ret i32 %a
127 define i32 @vector_length_vf2_XLen(iXLen zeroext %tc) {
128 ; CHECK-LABEL: vector_length_vf2_XLen:
129 ; CHECK:       # %bb.0:
130 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf4, ta, ma
131 ; CHECK-NEXT:    ret
132   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 2, i1 true)
133   ret i32 %a
136 define i32 @vector_length_vf4_i32(i32 zeroext %tc) {
137 ; CHECK-LABEL: vector_length_vf4_i32:
138 ; CHECK:       # %bb.0:
139 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf2, ta, ma
140 ; CHECK-NEXT:    ret
141   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 4, i1 true)
142   ret i32 %a
145 define i32 @vector_length_vf4_XLen(iXLen zeroext %tc) {
146 ; CHECK-LABEL: vector_length_vf4_XLen:
147 ; CHECK:       # %bb.0:
148 ; CHECK-NEXT:    vsetvli a0, a0, e8, mf2, ta, ma
149 ; CHECK-NEXT:    ret
150   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 4, i1 true)
151   ret i32 %a
154 define i32 @vector_length_vf8_i32(i32 zeroext %tc) {
155 ; CHECK-LABEL: vector_length_vf8_i32:
156 ; CHECK:       # %bb.0:
157 ; CHECK-NEXT:    vsetvli a0, a0, e8, m1, ta, ma
158 ; CHECK-NEXT:    ret
159   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 8, i1 true)
160   ret i32 %a
163 define i32 @vector_length_vf8_XLen(iXLen zeroext %tc) {
164 ; CHECK-LABEL: vector_length_vf8_XLen:
165 ; CHECK:       # %bb.0:
166 ; CHECK-NEXT:    vsetvli a0, a0, e8, m1, ta, ma
167 ; CHECK-NEXT:    ret
168   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 8, i1 true)
169   ret i32 %a
172 define i32 @vector_length_vf16_i32(i32 zeroext %tc) {
173 ; CHECK-LABEL: vector_length_vf16_i32:
174 ; CHECK:       # %bb.0:
175 ; CHECK-NEXT:    vsetvli a0, a0, e8, m2, ta, ma
176 ; CHECK-NEXT:    ret
177   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 16, i1 true)
178   ret i32 %a
181 define i32 @vector_length_vf16_XLen(iXLen zeroext %tc) {
182 ; CHECK-LABEL: vector_length_vf16_XLen:
183 ; CHECK:       # %bb.0:
184 ; CHECK-NEXT:    vsetvli a0, a0, e8, m2, ta, ma
185 ; CHECK-NEXT:    ret
186   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 16, i1 true)
187   ret i32 %a
190 define i32 @vector_length_vf32_i32(i32 zeroext %tc) {
191 ; CHECK-LABEL: vector_length_vf32_i32:
192 ; CHECK:       # %bb.0:
193 ; CHECK-NEXT:    vsetvli a0, a0, e8, m4, ta, ma
194 ; CHECK-NEXT:    ret
195   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 32, i1 true)
196   ret i32 %a
199 define i32 @vector_length_vf32_XLen(iXLen zeroext %tc) {
200 ; CHECK-LABEL: vector_length_vf32_XLen:
201 ; CHECK:       # %bb.0:
202 ; CHECK-NEXT:    vsetvli a0, a0, e8, m4, ta, ma
203 ; CHECK-NEXT:    ret
204   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 32, i1 true)
205   ret i32 %a
208 define i32 @vector_length_vf64_i32(i32 zeroext %tc) {
209 ; CHECK-LABEL: vector_length_vf64_i32:
210 ; CHECK:       # %bb.0:
211 ; CHECK-NEXT:    vsetvli a0, a0, e8, m8, ta, ma
212 ; CHECK-NEXT:    ret
213   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 64, i1 true)
214   ret i32 %a
217 define i32 @vector_length_vf64_XLen(iXLen zeroext %tc) {
218 ; CHECK-LABEL: vector_length_vf64_XLen:
219 ; CHECK:       # %bb.0:
220 ; CHECK-NEXT:    vsetvli a0, a0, e8, m8, ta, ma
221 ; CHECK-NEXT:    ret
222   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 64, i1 true)
223   ret i32 %a
226 define i32 @vector_length_vf128_i32(i32 zeroext %tc) {
227 ; RV32-LABEL: vector_length_vf128_i32:
228 ; RV32:       # %bb.0:
229 ; RV32-NEXT:    csrr a1, vlenb
230 ; RV32-NEXT:    slli a1, a1, 4
231 ; RV32-NEXT:    bltu a0, a1, .LBB20_2
232 ; RV32-NEXT:  # %bb.1:
233 ; RV32-NEXT:    mv a0, a1
234 ; RV32-NEXT:  .LBB20_2:
235 ; RV32-NEXT:    ret
237 ; RV64-LABEL: vector_length_vf128_i32:
238 ; RV64:       # %bb.0:
239 ; RV64-NEXT:    sext.w a0, a0
240 ; RV64-NEXT:    csrr a1, vlenb
241 ; RV64-NEXT:    slli a1, a1, 4
242 ; RV64-NEXT:    bltu a0, a1, .LBB20_2
243 ; RV64-NEXT:  # %bb.1:
244 ; RV64-NEXT:    mv a0, a1
245 ; RV64-NEXT:  .LBB20_2:
246 ; RV64-NEXT:    ret
247   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 128, i1 true)
248   ret i32 %a
251 define i32 @vector_length_vf128_XLen(iXLen zeroext %tc) {
252 ; RV32-LABEL: vector_length_vf128_XLen:
253 ; RV32:       # %bb.0:
254 ; RV32-NEXT:    csrr a1, vlenb
255 ; RV32-NEXT:    slli a1, a1, 4
256 ; RV32-NEXT:    bltu a0, a1, .LBB21_2
257 ; RV32-NEXT:  # %bb.1:
258 ; RV32-NEXT:    mv a0, a1
259 ; RV32-NEXT:  .LBB21_2:
260 ; RV32-NEXT:    ret
262 ; RV64-LABEL: vector_length_vf128_XLen:
263 ; RV64:       # %bb.0:
264 ; RV64-NEXT:    sext.w a0, a0
265 ; RV64-NEXT:    csrr a1, vlenb
266 ; RV64-NEXT:    slli a1, a1, 4
267 ; RV64-NEXT:    bltu a0, a1, .LBB21_2
268 ; RV64-NEXT:  # %bb.1:
269 ; RV64-NEXT:    mv a0, a1
270 ; RV64-NEXT:  .LBB21_2:
271 ; RV64-NEXT:    ret
272   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 128, i1 true)
273   ret i32 %a
276 define i32 @vector_length_vf3_i32(i32 zeroext %tc) {
277 ; RV32-LABEL: vector_length_vf3_i32:
278 ; RV32:       # %bb.0:
279 ; RV32-NEXT:    csrr a1, vlenb
280 ; RV32-NEXT:    srli a1, a1, 3
281 ; RV32-NEXT:    slli a2, a1, 1
282 ; RV32-NEXT:    add a1, a2, a1
283 ; RV32-NEXT:    bltu a0, a1, .LBB22_2
284 ; RV32-NEXT:  # %bb.1:
285 ; RV32-NEXT:    mv a0, a1
286 ; RV32-NEXT:  .LBB22_2:
287 ; RV32-NEXT:    ret
289 ; RV64-LABEL: vector_length_vf3_i32:
290 ; RV64:       # %bb.0:
291 ; RV64-NEXT:    sext.w a0, a0
292 ; RV64-NEXT:    csrr a1, vlenb
293 ; RV64-NEXT:    srli a1, a1, 3
294 ; RV64-NEXT:    slli a2, a1, 1
295 ; RV64-NEXT:    add a1, a2, a1
296 ; RV64-NEXT:    bltu a0, a1, .LBB22_2
297 ; RV64-NEXT:  # %bb.1:
298 ; RV64-NEXT:    mv a0, a1
299 ; RV64-NEXT:  .LBB22_2:
300 ; RV64-NEXT:    ret
301   %a = call i32 @llvm.experimental.get.vector.length.i32(i32 %tc, i32 3, i1 true)
302   ret i32 %a
305 define i32 @vector_length_vf3_XLen(iXLen zeroext %tc) {
306 ; RV32-LABEL: vector_length_vf3_XLen:
307 ; RV32:       # %bb.0:
308 ; RV32-NEXT:    csrr a1, vlenb
309 ; RV32-NEXT:    srli a1, a1, 3
310 ; RV32-NEXT:    slli a2, a1, 1
311 ; RV32-NEXT:    add a1, a2, a1
312 ; RV32-NEXT:    bltu a0, a1, .LBB23_2
313 ; RV32-NEXT:  # %bb.1:
314 ; RV32-NEXT:    mv a0, a1
315 ; RV32-NEXT:  .LBB23_2:
316 ; RV32-NEXT:    ret
318 ; RV64-LABEL: vector_length_vf3_XLen:
319 ; RV64:       # %bb.0:
320 ; RV64-NEXT:    sext.w a0, a0
321 ; RV64-NEXT:    csrr a1, vlenb
322 ; RV64-NEXT:    srli a1, a1, 3
323 ; RV64-NEXT:    slli a2, a1, 1
324 ; RV64-NEXT:    add a1, a2, a1
325 ; RV64-NEXT:    bltu a0, a1, .LBB23_2
326 ; RV64-NEXT:  # %bb.1:
327 ; RV64-NEXT:    mv a0, a1
328 ; RV64-NEXT:  .LBB23_2:
329 ; RV64-NEXT:    ret
330   %a = call i32 @llvm.experimental.get.vector.length.iXLen(iXLen %tc, i32 3, i1 true)
331   ret i32 %a