Skip to content

Commit 20f10af

Browse files
committed
[RISCV][ISel] Ensure the narrowing element type is legal.
1 parent 60f7b15 commit 20f10af

File tree

2 files changed

+119
-1
lines changed

2 files changed

+119
-1
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13039,11 +13039,16 @@ struct NodeExtensionHelper {
1303913039
if (!VT.isVector())
1304013040
break;
1304113041

13042-
MVT NarrowVT = OrigOperand.getOperand(0)->getSimpleValueType(0);
13042+
SDValue NarrowElt = OrigOperand.getOperand(0);
13043+
MVT NarrowVT = NarrowElt.getSimpleValueType();
1304313044

1304413045
unsigned ScalarBits = VT.getScalarSizeInBits();
1304513046
unsigned NarrowScalarBits = NarrowVT.getScalarSizeInBits();
1304613047

13048+
// Ensure the narrowing element type is legal
13049+
if (!Subtarget.getTargetLowering()->isTypeLegal(NarrowElt.getValueType()))
13050+
break;
13051+
1304713052
// Ensure the extension's semantic is equivalent to rvv vzext or vsext.
1304813053
if (ScalarBits != NarrowScalarBits * 2)
1304913054
break;

llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,64 @@ define <vscale x 2 x i32> @vwop_vscale_sext_i1i32_multiple_users(ptr %x, ptr %y,
206206
ret <vscale x 2 x i32> %i
207207
}
208208

209+
define <vscale x 2 x i8> @vwop_vscale_sext_i1i8_multiple_users(ptr %x, ptr %y, ptr %z) {
210+
; NO_FOLDING-LABEL: vwop_vscale_sext_i1i8_multiple_users:
211+
; NO_FOLDING: # %bb.0:
212+
; NO_FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
213+
; NO_FOLDING-NEXT: vlm.v v8, (a0)
214+
; NO_FOLDING-NEXT: vlm.v v9, (a1)
215+
; NO_FOLDING-NEXT: vlm.v v10, (a2)
216+
; NO_FOLDING-NEXT: vmv.v.i v11, 0
217+
; NO_FOLDING-NEXT: vmv1r.v v0, v8
218+
; NO_FOLDING-NEXT: vmerge.vim v12, v11, -1, v0
219+
; NO_FOLDING-NEXT: vmv1r.v v0, v9
220+
; NO_FOLDING-NEXT: vmerge.vim v9, v11, -1, v0
221+
; NO_FOLDING-NEXT: vmv1r.v v0, v10
222+
; NO_FOLDING-NEXT: vmerge.vim v10, v11, -1, v0
223+
; NO_FOLDING-NEXT: vmul.vv v9, v12, v9
224+
; NO_FOLDING-NEXT: vmv1r.v v0, v8
225+
; NO_FOLDING-NEXT: vmerge.vim v8, v11, 1, v0
226+
; NO_FOLDING-NEXT: vsub.vv v8, v10, v8
227+
; NO_FOLDING-NEXT: vsub.vv v10, v12, v10
228+
; NO_FOLDING-NEXT: vor.vv v8, v9, v8
229+
; NO_FOLDING-NEXT: vor.vv v8, v8, v10
230+
; NO_FOLDING-NEXT: ret
231+
;
232+
; FOLDING-LABEL: vwop_vscale_sext_i1i8_multiple_users:
233+
; FOLDING: # %bb.0:
234+
; FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
235+
; FOLDING-NEXT: vlm.v v8, (a0)
236+
; FOLDING-NEXT: vlm.v v9, (a1)
237+
; FOLDING-NEXT: vlm.v v10, (a2)
238+
; FOLDING-NEXT: vmv.v.i v11, 0
239+
; FOLDING-NEXT: vmv1r.v v0, v8
240+
; FOLDING-NEXT: vmerge.vim v12, v11, -1, v0
241+
; FOLDING-NEXT: vmv1r.v v0, v9
242+
; FOLDING-NEXT: vmerge.vim v9, v11, -1, v0
243+
; FOLDING-NEXT: vmv1r.v v0, v10
244+
; FOLDING-NEXT: vmerge.vim v10, v11, -1, v0
245+
; FOLDING-NEXT: vmul.vv v9, v12, v9
246+
; FOLDING-NEXT: vmv1r.v v0, v8
247+
; FOLDING-NEXT: vmerge.vim v8, v11, 1, v0
248+
; FOLDING-NEXT: vsub.vv v8, v10, v8
249+
; FOLDING-NEXT: vsub.vv v10, v12, v10
250+
; FOLDING-NEXT: vor.vv v8, v9, v8
251+
; FOLDING-NEXT: vor.vv v8, v8, v10
252+
; FOLDING-NEXT: ret
253+
%a = load <vscale x 2 x i1>, ptr %x
254+
%b = load <vscale x 2 x i1>, ptr %y
255+
%b2 = load <vscale x 2 x i1>, ptr %z
256+
%c = sext <vscale x 2 x i1> %a to <vscale x 2 x i8>
257+
%d = sext <vscale x 2 x i1> %b to <vscale x 2 x i8>
258+
%d2 = sext <vscale x 2 x i1> %b2 to <vscale x 2 x i8>
259+
%e = mul <vscale x 2 x i8> %c, %d
260+
%f = add <vscale x 2 x i8> %c, %d2
261+
%g = sub <vscale x 2 x i8> %c, %d2
262+
%h = or <vscale x 2 x i8> %e, %f
263+
%i = or <vscale x 2 x i8> %h, %g
264+
ret <vscale x 2 x i8> %i
265+
}
266+
209267
define <vscale x 2 x i32> @vwop_vscale_sext_i8i32_multiple_users(ptr %x, ptr %y, ptr %z) {
210268
; NO_FOLDING-LABEL: vwop_vscale_sext_i8i32_multiple_users:
211269
; NO_FOLDING: # %bb.0:
@@ -434,6 +492,58 @@ define <vscale x 2 x i32> @vwop_vscale_zext_i1i32_multiple_users(ptr %x, ptr %y,
434492
ret <vscale x 2 x i32> %i
435493
}
436494

495+
define <vscale x 2 x i8> @vwop_vscale_zext_i1i8_multiple_users(ptr %x, ptr %y, ptr %z) {
496+
; NO_FOLDING-LABEL: vwop_vscale_zext_i1i8_multiple_users:
497+
; NO_FOLDING: # %bb.0:
498+
; NO_FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
499+
; NO_FOLDING-NEXT: vlm.v v0, (a0)
500+
; NO_FOLDING-NEXT: vlm.v v8, (a1)
501+
; NO_FOLDING-NEXT: vlm.v v9, (a2)
502+
; NO_FOLDING-NEXT: vmv.v.i v10, 0
503+
; NO_FOLDING-NEXT: vmerge.vim v11, v10, 1, v0
504+
; NO_FOLDING-NEXT: vmv1r.v v0, v8
505+
; NO_FOLDING-NEXT: vmerge.vim v8, v10, 1, v0
506+
; NO_FOLDING-NEXT: vmv1r.v v0, v9
507+
; NO_FOLDING-NEXT: vmerge.vim v9, v10, 1, v0
508+
; NO_FOLDING-NEXT: vmul.vv v8, v11, v8
509+
; NO_FOLDING-NEXT: vadd.vv v10, v11, v9
510+
; NO_FOLDING-NEXT: vsub.vv v9, v11, v9
511+
; NO_FOLDING-NEXT: vor.vv v8, v8, v10
512+
; NO_FOLDING-NEXT: vor.vv v8, v8, v9
513+
; NO_FOLDING-NEXT: ret
514+
;
515+
; FOLDING-LABEL: vwop_vscale_zext_i1i8_multiple_users:
516+
; FOLDING: # %bb.0:
517+
; FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
518+
; FOLDING-NEXT: vlm.v v0, (a0)
519+
; FOLDING-NEXT: vlm.v v8, (a1)
520+
; FOLDING-NEXT: vlm.v v9, (a2)
521+
; FOLDING-NEXT: vmv.v.i v10, 0
522+
; FOLDING-NEXT: vmerge.vim v11, v10, 1, v0
523+
; FOLDING-NEXT: vmv1r.v v0, v8
524+
; FOLDING-NEXT: vmerge.vim v8, v10, 1, v0
525+
; FOLDING-NEXT: vmv1r.v v0, v9
526+
; FOLDING-NEXT: vmerge.vim v9, v10, 1, v0
527+
; FOLDING-NEXT: vmul.vv v8, v11, v8
528+
; FOLDING-NEXT: vadd.vv v10, v11, v9
529+
; FOLDING-NEXT: vsub.vv v9, v11, v9
530+
; FOLDING-NEXT: vor.vv v8, v8, v10
531+
; FOLDING-NEXT: vor.vv v8, v8, v9
532+
; FOLDING-NEXT: ret
533+
%a = load <vscale x 2 x i1>, ptr %x
534+
%b = load <vscale x 2 x i1>, ptr %y
535+
%b2 = load <vscale x 2 x i1>, ptr %z
536+
%c = zext <vscale x 2 x i1> %a to <vscale x 2 x i8>
537+
%d = zext <vscale x 2 x i1> %b to <vscale x 2 x i8>
538+
%d2 = zext <vscale x 2 x i1> %b2 to <vscale x 2 x i8>
539+
%e = mul <vscale x 2 x i8> %c, %d
540+
%f = add <vscale x 2 x i8> %c, %d2
541+
%g = sub <vscale x 2 x i8> %c, %d2
542+
%h = or <vscale x 2 x i8> %e, %f
543+
%i = or <vscale x 2 x i8> %h, %g
544+
ret <vscale x 2 x i8> %i
545+
}
546+
437547
define <vscale x 2 x i32> @vwop_vscale_zext_i8i32_multiple_users(ptr %x, ptr %y, ptr %z) {
438548
; NO_FOLDING-LABEL: vwop_vscale_zext_i8i32_multiple_users:
439549
; NO_FOLDING: # %bb.0:
@@ -479,3 +589,6 @@ define <vscale x 2 x i32> @vwop_vscale_zext_i8i32_multiple_users(ptr %x, ptr %y,
479589
%i = or <vscale x 2 x i32> %h, %g
480590
ret <vscale x 2 x i32> %i
481591
}
592+
593+
594+

0 commit comments

Comments
 (0)