You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: llvm/test/CodeGen/RISCV/rvv/vl-opt-instrs.ll
+382-20
Original file line number
Diff line number
Diff line change
@@ -146,6 +146,246 @@ define <vscale x 4 x i32> @vrsub_vx(<vscale x 4 x i32> %a, i32 %b, iXLen %vl) {
146
146
ret <vscale x 4 x i32> %2
147
147
}
148
148
149
+
define <vscale x 4 x i32> @vand_vi(<vscale x 4 x i32> %a, iXLen %vl) {
150
+
; NOVLOPT-LABEL: vand_vi:
151
+
; NOVLOPT: # %bb.0:
152
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
153
+
; NOVLOPT-NEXT: vand.vi v10, v8, 5
154
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
155
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
156
+
; NOVLOPT-NEXT: ret
157
+
;
158
+
; VLOPT-LABEL: vand_vi:
159
+
; VLOPT: # %bb.0:
160
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
161
+
; VLOPT-NEXT: vand.vi v10, v8, 5
162
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
163
+
; VLOPT-NEXT: ret
164
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i325, iXLen -1)
165
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
166
+
ret <vscale x 4 x i32> %2
167
+
}
168
+
169
+
define <vscale x 4 x i32> @vand_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
170
+
; NOVLOPT-LABEL: vand_vv:
171
+
; NOVLOPT: # %bb.0:
172
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
173
+
; NOVLOPT-NEXT: vand.vv v8, v8, v10
174
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
175
+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
176
+
; NOVLOPT-NEXT: ret
177
+
;
178
+
; VLOPT-LABEL: vand_vv:
179
+
; VLOPT: # %bb.0:
180
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
181
+
; VLOPT-NEXT: vand.vv v8, v8, v10
182
+
; VLOPT-NEXT: vadd.vv v8, v8, v10
183
+
; VLOPT-NEXT: ret
184
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
185
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
186
+
ret <vscale x 4 x i32> %2
187
+
}
188
+
189
+
define <vscale x 4 x i32> @vand_vx(<vscale x 4 x i32> %a, i32%b, iXLen %vl) {
190
+
; NOVLOPT-LABEL: vand_vx:
191
+
; NOVLOPT: # %bb.0:
192
+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
193
+
; NOVLOPT-NEXT: vand.vx v10, v8, a0
194
+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
195
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
196
+
; NOVLOPT-NEXT: ret
197
+
;
198
+
; VLOPT-LABEL: vand_vx:
199
+
; VLOPT: # %bb.0:
200
+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
201
+
; VLOPT-NEXT: vand.vx v10, v8, a0
202
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
203
+
; VLOPT-NEXT: ret
204
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vand.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32%b, iXLen -1)
205
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
206
+
ret <vscale x 4 x i32> %2
207
+
}
208
+
209
+
define <vscale x 4 x i32> @vor_vi(<vscale x 4 x i32> %a, iXLen %vl) {
210
+
; NOVLOPT-LABEL: vor_vi:
211
+
; NOVLOPT: # %bb.0:
212
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
213
+
; NOVLOPT-NEXT: vor.vi v10, v8, 5
214
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
215
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
216
+
; NOVLOPT-NEXT: ret
217
+
;
218
+
; VLOPT-LABEL: vor_vi:
219
+
; VLOPT: # %bb.0:
220
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
221
+
; VLOPT-NEXT: vor.vi v10, v8, 5
222
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
223
+
; VLOPT-NEXT: ret
224
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i325, iXLen -1)
225
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
226
+
ret <vscale x 4 x i32> %2
227
+
}
228
+
229
+
define <vscale x 4 x i32> @vor_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
230
+
; NOVLOPT-LABEL: vor_vv:
231
+
; NOVLOPT: # %bb.0:
232
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
233
+
; NOVLOPT-NEXT: vor.vv v8, v8, v10
234
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
235
+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
236
+
; NOVLOPT-NEXT: ret
237
+
;
238
+
; VLOPT-LABEL: vor_vv:
239
+
; VLOPT: # %bb.0:
240
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
241
+
; VLOPT-NEXT: vor.vv v8, v8, v10
242
+
; VLOPT-NEXT: vadd.vv v8, v8, v10
243
+
; VLOPT-NEXT: ret
244
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
245
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
246
+
ret <vscale x 4 x i32> %2
247
+
}
248
+
249
+
define <vscale x 4 x i32> @vor_vx(<vscale x 4 x i32> %a, i32%b, iXLen %vl) {
250
+
; NOVLOPT-LABEL: vor_vx:
251
+
; NOVLOPT: # %bb.0:
252
+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
253
+
; NOVLOPT-NEXT: vor.vx v10, v8, a0
254
+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
255
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
256
+
; NOVLOPT-NEXT: ret
257
+
;
258
+
; VLOPT-LABEL: vor_vx:
259
+
; VLOPT: # %bb.0:
260
+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
261
+
; VLOPT-NEXT: vor.vx v10, v8, a0
262
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
263
+
; VLOPT-NEXT: ret
264
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32%b, iXLen -1)
265
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
266
+
ret <vscale x 4 x i32> %2
267
+
}
268
+
269
+
define <vscale x 4 x i32> @vxor_vi(<vscale x 4 x i32> %a, iXLen %vl) {
270
+
; NOVLOPT-LABEL: vxor_vi:
271
+
; NOVLOPT: # %bb.0:
272
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
273
+
; NOVLOPT-NEXT: vxor.vi v10, v8, 5
274
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
275
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
276
+
; NOVLOPT-NEXT: ret
277
+
;
278
+
; VLOPT-LABEL: vxor_vi:
279
+
; VLOPT: # %bb.0:
280
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
281
+
; VLOPT-NEXT: vxor.vi v10, v8, 5
282
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
283
+
; VLOPT-NEXT: ret
284
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i325, iXLen -1)
285
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
286
+
ret <vscale x 4 x i32> %2
287
+
}
288
+
289
+
define <vscale x 4 x i32> @vxor_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
290
+
; NOVLOPT-LABEL: vxor_vv:
291
+
; NOVLOPT: # %bb.0:
292
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
293
+
; NOVLOPT-NEXT: vxor.vv v8, v8, v10
294
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
295
+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
296
+
; NOVLOPT-NEXT: ret
297
+
;
298
+
; VLOPT-LABEL: vxor_vv:
299
+
; VLOPT: # %bb.0:
300
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
301
+
; VLOPT-NEXT: vxor.vv v8, v8, v10
302
+
; VLOPT-NEXT: vadd.vv v8, v8, v10
303
+
; VLOPT-NEXT: ret
304
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
305
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
306
+
ret <vscale x 4 x i32> %2
307
+
}
308
+
309
+
define <vscale x 4 x i32> @vxor_vx(<vscale x 4 x i32> %a, i32%b, iXLen %vl) {
310
+
; NOVLOPT-LABEL: vxor_vx:
311
+
; NOVLOPT: # %bb.0:
312
+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
313
+
; NOVLOPT-NEXT: vxor.vx v10, v8, a0
314
+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
315
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
316
+
; NOVLOPT-NEXT: ret
317
+
;
318
+
; VLOPT-LABEL: vxor_vx:
319
+
; VLOPT: # %bb.0:
320
+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
321
+
; VLOPT-NEXT: vxor.vx v10, v8, a0
322
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
323
+
; VLOPT-NEXT: ret
324
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vxor.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32%b, iXLen -1)
325
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
326
+
ret <vscale x 4 x i32> %2
327
+
}
328
+
329
+
define <vscale x 4 x i32> @vsll_vi(<vscale x 4 x i32> %a, iXLen %vl) {
330
+
; NOVLOPT-LABEL: vsll_vi:
331
+
; NOVLOPT: # %bb.0:
332
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
333
+
; NOVLOPT-NEXT: vsll.vi v10, v8, 5
334
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
335
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
336
+
; NOVLOPT-NEXT: ret
337
+
;
338
+
; VLOPT-LABEL: vsll_vi:
339
+
; VLOPT: # %bb.0:
340
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
341
+
; VLOPT-NEXT: vsll.vi v10, v8, 5
342
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
343
+
; VLOPT-NEXT: ret
344
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
345
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
346
+
ret <vscale x 4 x i32> %2
347
+
}
348
+
349
+
define <vscale x 4 x i32> @vsll_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
350
+
; NOVLOPT-LABEL: vsll_vv:
351
+
; NOVLOPT: # %bb.0:
352
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
353
+
; NOVLOPT-NEXT: vsll.vv v8, v8, v10
354
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
355
+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
356
+
; NOVLOPT-NEXT: ret
357
+
;
358
+
; VLOPT-LABEL: vsll_vv:
359
+
; VLOPT: # %bb.0:
360
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
361
+
; VLOPT-NEXT: vsll.vv v8, v8, v10
362
+
; VLOPT-NEXT: vadd.vv v8, v8, v10
363
+
; VLOPT-NEXT: ret
364
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
365
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
366
+
ret <vscale x 4 x i32> %2
367
+
}
368
+
369
+
define <vscale x 4 x i32> @vsll_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
370
+
; NOVLOPT-LABEL: vsll_vx:
371
+
; NOVLOPT: # %bb.0:
372
+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
373
+
; NOVLOPT-NEXT: vsll.vx v10, v8, a0
374
+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
375
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
376
+
; NOVLOPT-NEXT: ret
377
+
;
378
+
; VLOPT-LABEL: vsll_vx:
379
+
; VLOPT: # %bb.0:
380
+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
381
+
; VLOPT-NEXT: vsll.vx v10, v8, a0
382
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
383
+
; VLOPT-NEXT: ret
384
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
385
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
386
+
ret <vscale x 4 x i32> %2
387
+
}
388
+
149
389
define <vscale x 4 x i64> @vwaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
150
390
; NOVLOPT-LABEL: vwaddu_vv:
151
391
; NOVLOPT: # %bb.0:
@@ -167,6 +407,126 @@ define <vscale x 4 x i64> @vwaddu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %
167
407
ret <vscale x 4 x i64> %2
168
408
}
169
409
410
+
define <vscale x 4 x i32> @vsrl_vi(<vscale x 4 x i32> %a, iXLen %vl) {
411
+
; NOVLOPT-LABEL: vsrl_vi:
412
+
; NOVLOPT: # %bb.0:
413
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
414
+
; NOVLOPT-NEXT: vsrl.vi v10, v8, 5
415
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
416
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
417
+
; NOVLOPT-NEXT: ret
418
+
;
419
+
; VLOPT-LABEL: vsrl_vi:
420
+
; VLOPT: # %bb.0:
421
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
422
+
; VLOPT-NEXT: vsrl.vi v10, v8, 5
423
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
424
+
; VLOPT-NEXT: ret
425
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
426
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
427
+
ret <vscale x 4 x i32> %2
428
+
}
429
+
430
+
define <vscale x 4 x i32> @vsrl_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
431
+
; NOVLOPT-LABEL: vsrl_vv:
432
+
; NOVLOPT: # %bb.0:
433
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
434
+
; NOVLOPT-NEXT: vsrl.vv v8, v8, v10
435
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
436
+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
437
+
; NOVLOPT-NEXT: ret
438
+
;
439
+
; VLOPT-LABEL: vsrl_vv:
440
+
; VLOPT: # %bb.0:
441
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
442
+
; VLOPT-NEXT: vsrl.vv v8, v8, v10
443
+
; VLOPT-NEXT: vadd.vv v8, v8, v10
444
+
; VLOPT-NEXT: ret
445
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
446
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
447
+
ret <vscale x 4 x i32> %2
448
+
}
449
+
450
+
define <vscale x 4 x i32> @vsrl_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
451
+
; NOVLOPT-LABEL: vsrl_vx:
452
+
; NOVLOPT: # %bb.0:
453
+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
454
+
; NOVLOPT-NEXT: vsrl.vx v10, v8, a0
455
+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
456
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
457
+
; NOVLOPT-NEXT: ret
458
+
;
459
+
; VLOPT-LABEL: vsrl_vx:
460
+
; VLOPT: # %bb.0:
461
+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
462
+
; VLOPT-NEXT: vsrl.vx v10, v8, a0
463
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
464
+
; VLOPT-NEXT: ret
465
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsrl.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
466
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
467
+
ret <vscale x 4 x i32> %2
468
+
}
469
+
470
+
define <vscale x 4 x i32> @vsra_vi(<vscale x 4 x i32> %a, iXLen %vl) {
471
+
; NOVLOPT-LABEL: vsra_vi:
472
+
; NOVLOPT: # %bb.0:
473
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
474
+
; NOVLOPT-NEXT: vsra.vi v10, v8, 5
475
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
476
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
477
+
; NOVLOPT-NEXT: ret
478
+
;
479
+
; VLOPT-LABEL: vsra_vi:
480
+
; VLOPT: # %bb.0:
481
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
482
+
; VLOPT-NEXT: vsra.vi v10, v8, 5
483
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
484
+
; VLOPT-NEXT: ret
485
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
486
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
487
+
ret <vscale x 4 x i32> %2
488
+
}
489
+
490
+
define <vscale x 4 x i32> @vsra_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
491
+
; NOVLOPT-LABEL: vsra_vv:
492
+
; NOVLOPT: # %bb.0:
493
+
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
494
+
; NOVLOPT-NEXT: vsra.vv v8, v8, v10
495
+
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
496
+
; NOVLOPT-NEXT: vadd.vv v8, v8, v10
497
+
; NOVLOPT-NEXT: ret
498
+
;
499
+
; VLOPT-LABEL: vsra_vv:
500
+
; VLOPT: # %bb.0:
501
+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
502
+
; VLOPT-NEXT: vsra.vv v8, v8, v10
503
+
; VLOPT-NEXT: vadd.vv v8, v8, v10
504
+
; VLOPT-NEXT: ret
505
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen -1)
506
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %b, iXLen %vl)
507
+
ret <vscale x 4 x i32> %2
508
+
}
509
+
510
+
define <vscale x 4 x i32> @vsra_vx(<vscale x 4 x i32> %a, iXLen %b, iXLen %vl) {
511
+
; NOVLOPT-LABEL: vsra_vx:
512
+
; NOVLOPT: # %bb.0:
513
+
; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
514
+
; NOVLOPT-NEXT: vsra.vx v10, v8, a0
515
+
; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
516
+
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
517
+
; NOVLOPT-NEXT: ret
518
+
;
519
+
; VLOPT-LABEL: vsra_vx:
520
+
; VLOPT: # %bb.0:
521
+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
522
+
; VLOPT-NEXT: vsra.vx v10, v8, a0
523
+
; VLOPT-NEXT: vadd.vv v8, v10, v8
524
+
; VLOPT-NEXT: ret
525
+
%1 = call <vscale x 4 x i32> @llvm.riscv.vsra.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen %b, iXLen -1)
526
+
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
527
+
ret <vscale x 4 x i32> %2
528
+
}
529
+
170
530
define <vscale x 4 x i64> @vwaddu_vx(<vscale x 4 x i32> %a, i32%b, iXLen %vl) {
171
531
; NOVLOPT-LABEL: vwaddu_vx:
172
532
; NOVLOPT: # %bb.0:
@@ -602,26 +962,6 @@ define <vscale x 4 x i64> @vzext_vf8(<vscale x 4 x i8> %a, <vscale x 4 x i64> %b
602
962
ret <vscale x 4 x i64> %2
603
963
}
604
964
605
-
define <vscale x 4 x i32> @vsll_vi(<vscale x 4 x i32> %a, iXLen %vl) {
606
-
; NOVLOPT-LABEL: vsll_vi:
607
-
; NOVLOPT: # %bb.0:
608
-
; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
609
-
; NOVLOPT-NEXT: vsll.vi v10, v8, 5
610
-
; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
611
-
; NOVLOPT-NEXT: vadd.vv v8, v10, v8
612
-
; NOVLOPT-NEXT: ret
613
-
;
614
-
; VLOPT-LABEL: vsll_vi:
615
-
; VLOPT: # %bb.0:
616
-
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
617
-
; VLOPT-NEXT: vsll.vi v10, v8, 5
618
-
; VLOPT-NEXT: vadd.vv v8, v10, v8
619
-
; VLOPT-NEXT: ret
620
-
%1 = call <vscale x 4 x i32> @llvm.riscv.vsll.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
621
-
%2 = call <vscale x 4 x i32> @llvm.riscv.vadd.nxv4i32.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i32> %1, <vscale x 4 x i32> %a, iXLen %vl)
622
-
ret <vscale x 4 x i32> %2
623
-
}
624
-
625
965
define <vscale x 4 x i16> @vnsrl_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %vl) {
626
966
; NOVLOPT-LABEL: vnsrl_wi:
627
967
; NOVLOPT: # %bb.0:
@@ -1611,6 +1951,28 @@ define <vscale x 4 x i32> @vmv_v_x(<vscale x 4 x i32> %a, i32 %x, iXLen %vl) {
1611
1951
ret <vscale x 4 x i32> %2
1612
1952
}
1613
1953
1954
+
; The vmv.v.v is optimized away if we use a vadd as the user.
1955
+
define <vscale x 1 x i8> @vmv_v_v(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, iXLen %vl) {
1956
+
; NOVLOPT-LABEL: vmv_v_v:
1957
+
; NOVLOPT: # %bb.0:
1958
+
; NOVLOPT-NEXT: vsetvli a1, zero, e8, mf8, tu, ma
1959
+
; NOVLOPT-NEXT: vmv.v.v v8, v9
1960
+
; NOVLOPT-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
1961
+
; NOVLOPT-NEXT: vmerge.vvm v8, v8, v10, v0
1962
+
; NOVLOPT-NEXT: ret
1963
+
;
1964
+
; VLOPT-LABEL: vmv_v_v:
1965
+
; VLOPT: # %bb.0:
1966
+
; VLOPT-NEXT: vsetvli zero, a0, e8, mf8, tu, ma
1967
+
; VLOPT-NEXT: vmv.v.v v8, v9
1968
+
; VLOPT-NEXT: vsetvli zero, zero, e8, mf8, ta, ma
1969
+
; VLOPT-NEXT: vmerge.vvm v8, v8, v10, v0
1970
+
; VLOPT-NEXT: ret
1971
+
%2 = call <vscale x 1 x i8> @llvm.riscv.vmv.v.v.nxv1i8.nxv1i8(<vscale x 1 x i8> %a, <vscale x 1 x i8> %b, iXLen -1)
1972
+
%3 = call <vscale x 1 x i8> @llvm.riscv.vmerge.nxv1i8.nxv1i8(<vscale x 1 x i8> undef, <vscale x 1 x i8> %2, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, iXLen %vl)
1973
+
ret <vscale x 1 x i8> %3
1974
+
}
1975
+
1614
1976
define <vscale x 4 x i32> @vwsll_vi(<vscale x 4 x i16> %a, <vscale x 4 x i32> %b, iXLen %vl) {
0 commit comments