Skip to content

Commit 1d4695f

Browse files
committed
Fix bug in prior version and add additional tests
1 parent b0ee8ad commit 1d4695f

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4477,7 +4477,7 @@ static bool isDeinterleaveShuffle(MVT VT, MVT ContainerVT, SDValue V1,
44774477

44784478
// The others must increase by 2 each time (or be undef).
44794479
for (unsigned i = 1; i != Mask.size(); ++i)
4480-
if (Mask[i] != Mask[i - 1] + 2 && Mask[i] != -1)
4480+
if (Mask[i] != -1 && Mask[i] != Mask[0] + (int)i * 2)
44814481
return false;
44824482

44834483
return true;

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shufflevector-vnsrl.ll

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,94 @@ entry:
347347
store <2 x double> %shuffle.i5, ptr %out, align 8
348348
ret void
349349
}
350+
351+
define void @vnsrl_0_i8_undef(ptr %in, ptr %out) {
352+
; CHECK-LABEL: vnsrl_0_i8_undef:
353+
; CHECK: # %bb.0: # %entry
354+
; CHECK-NEXT: vsetivli zero, 16, e8, mf2, ta, ma
355+
; CHECK-NEXT: vle8.v v8, (a0)
356+
; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, ma
357+
; CHECK-NEXT: vnsrl.wi v8, v8, 0
358+
; CHECK-NEXT: vse8.v v8, (a1)
359+
; CHECK-NEXT: ret
360+
entry:
361+
%0 = load <16 x i8>, ptr %in, align 1
362+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 undef, i32 undef>
363+
store <8 x i8> %shuffle.i5, ptr %out, align 1
364+
ret void
365+
}
366+
367+
define void @vnsrl_0_i8_undef2(ptr %in, ptr %out) {
368+
; CHECK-LABEL: vnsrl_0_i8_undef2:
369+
; CHECK: # %bb.0: # %entry
370+
; CHECK-NEXT: vsetivli zero, 16, e8, mf2, ta, ma
371+
; CHECK-NEXT: vle8.v v8, (a0)
372+
; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, ma
373+
; CHECK-NEXT: vnsrl.wi v8, v8, 0
374+
; CHECK-NEXT: vse8.v v8, (a1)
375+
; CHECK-NEXT: ret
376+
entry:
377+
%0 = load <16 x i8>, ptr %in, align 1
378+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 2, i32 undef, i32 6, i32 undef, i32 10, i32 12, i32 14>
379+
store <8 x i8> %shuffle.i5, ptr %out, align 1
380+
ret void
381+
}
382+
383+
; TODO: Allow an undef initial element
384+
define void @vnsrl_0_i8_undef3(ptr %in, ptr %out) {
385+
; CHECK-LABEL: vnsrl_0_i8_undef3:
386+
; CHECK: # %bb.0: # %entry
387+
; CHECK-NEXT: vsetivli zero, 16, e8, mf2, ta, ma
388+
; CHECK-NEXT: vle8.v v8, (a0)
389+
; CHECK-NEXT: lui a0, 24640
390+
; CHECK-NEXT: addi a0, a0, 6
391+
; CHECK-NEXT: vsetivli zero, 8, e32, m1, ta, ma
392+
; CHECK-NEXT: vmv.v.x v9, a0
393+
; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
394+
; CHECK-NEXT: vrgather.vv v10, v8, v9
395+
; CHECK-NEXT: vid.v v9
396+
; CHECK-NEXT: vadd.vv v9, v9, v9
397+
; CHECK-NEXT: vadd.vi v9, v9, -8
398+
; CHECK-NEXT: li a0, -32
399+
; CHECK-NEXT: vmv.s.x v0, a0
400+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
401+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
402+
; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, mu
403+
; CHECK-NEXT: vrgather.vv v10, v8, v9, v0.t
404+
; CHECK-NEXT: vse8.v v10, (a1)
405+
; CHECK-NEXT: ret
406+
entry:
407+
%0 = load <16 x i8>, ptr %in, align 1
408+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 undef, i32 undef, i32 4, i32 6, i32 6, i32 10, i32 12, i32 14>
409+
store <8 x i8> %shuffle.i5, ptr %out, align 1
410+
ret void
411+
}
412+
413+
; Not a vnsrl (checking for a prior pattern matching bug)
414+
define void @vnsrl_0_i8_undef_negative(ptr %in, ptr %out) {
415+
; CHECK-LABEL: vnsrl_0_i8_undef_negative:
416+
; CHECK: # %bb.0: # %entry
417+
; CHECK-NEXT: vsetivli zero, 16, e8, mf2, ta, ma
418+
; CHECK-NEXT: vle8.v v8, (a0)
419+
; CHECK-NEXT: lui a0, %hi(.LCPI17_0)
420+
; CHECK-NEXT: addi a0, a0, %lo(.LCPI17_0)
421+
; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, ma
422+
; CHECK-NEXT: vle8.v v9, (a0)
423+
; CHECK-NEXT: vrgather.vv v10, v8, v9
424+
; CHECK-NEXT: vid.v v9
425+
; CHECK-NEXT: vadd.vv v9, v9, v9
426+
; CHECK-NEXT: vadd.vi v9, v9, -8
427+
; CHECK-NEXT: li a0, 48
428+
; CHECK-NEXT: vmv.s.x v0, a0
429+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
430+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
431+
; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, mu
432+
; CHECK-NEXT: vrgather.vv v10, v8, v9, v0.t
433+
; CHECK-NEXT: vse8.v v10, (a1)
434+
; CHECK-NEXT: ret
435+
entry:
436+
%0 = load <16 x i8>, ptr %in, align 1
437+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 undef, i32 1>
438+
store <8 x i8> %shuffle.i5, ptr %out, align 1
439+
ret void
440+
}

0 commit comments

Comments
 (0)