Skip to content

Commit 54803f8

Browse files
authored
[RISCV] Add test cases for widening add/sub with mismatched extends. NFC (#166700)
These are test cases where we have an add and a sub with the same operands. One operand is a sign extend and the other is a zero extend. The sub can only form a vwsub.wv but because add is commutable, it could form vwadd.wv or vwaddu.wv depending on which extend is removed. We want to form vwadd.wv to match the sub so the vsext can be removed. Depending on the order of the instructions and the operand order of the add, we might form vwaddu.wv instead and no extends will be removed.
1 parent 3d589a9 commit 54803f8

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,83 @@ define <vscale x 2 x i32> @vwop_vscale_zext_i8i32_multiple_users(ptr %x, ptr %y,
570570
ret <vscale x 2 x i32> %i
571571
}
572572

573+
define <vscale x 4 x i32> @mismatched_extend_sub_add(<vscale x 4 x i16> %x, <vscale x 4 x i16> %y) {
574+
; FOLDING-LABEL: mismatched_extend_sub_add:
575+
; FOLDING: # %bb.0:
576+
; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma
577+
; FOLDING-NEXT: vzext.vf2 v10, v8
578+
; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma
579+
; FOLDING-NEXT: vwsub.wv v12, v10, v9
580+
; FOLDING-NEXT: vwadd.wv v10, v10, v9
581+
; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma
582+
; FOLDING-NEXT: vmul.vv v8, v12, v10
583+
; FOLDING-NEXT: ret
584+
%a = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>
585+
%b = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>
586+
%c = sub <vscale x 4 x i32> %a, %b
587+
%d = add <vscale x 4 x i32> %a, %b
588+
%e = mul <vscale x 4 x i32> %c, %d
589+
ret <vscale x 4 x i32> %e
590+
}
591+
592+
; FIXME: this should remove the vsext
593+
define <vscale x 4 x i32> @mismatched_extend_sub_add_commuted(<vscale x 4 x i16> %x, <vscale x 4 x i16> %y) {
594+
; FOLDING-LABEL: mismatched_extend_sub_add_commuted:
595+
; FOLDING: # %bb.0:
596+
; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma
597+
; FOLDING-NEXT: vzext.vf2 v10, v8
598+
; FOLDING-NEXT: vsext.vf2 v12, v9
599+
; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma
600+
; FOLDING-NEXT: vwsub.wv v10, v10, v9
601+
; FOLDING-NEXT: vwaddu.wv v12, v12, v8
602+
; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma
603+
; FOLDING-NEXT: vmul.vv v8, v10, v12
604+
; FOLDING-NEXT: ret
605+
%a = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>
606+
%b = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>
607+
%c = sub <vscale x 4 x i32> %a, %b
608+
%d = add <vscale x 4 x i32> %b, %a
609+
%e = mul <vscale x 4 x i32> %c, %d
610+
ret <vscale x 4 x i32> %e
611+
}
573612

613+
define <vscale x 4 x i32> @mismatched_extend_add_sub(<vscale x 4 x i16> %x, <vscale x 4 x i16> %y) {
614+
; FOLDING-LABEL: mismatched_extend_add_sub:
615+
; FOLDING: # %bb.0:
616+
; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma
617+
; FOLDING-NEXT: vzext.vf2 v10, v8
618+
; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma
619+
; FOLDING-NEXT: vwadd.wv v12, v10, v9
620+
; FOLDING-NEXT: vwsub.wv v10, v10, v9
621+
; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma
622+
; FOLDING-NEXT: vmul.vv v8, v12, v10
623+
; FOLDING-NEXT: ret
624+
%a = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>
625+
%b = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>
626+
%c = add <vscale x 4 x i32> %a, %b
627+
%d = sub <vscale x 4 x i32> %a, %b
628+
%e = mul <vscale x 4 x i32> %c, %d
629+
ret <vscale x 4 x i32> %e
630+
}
631+
632+
define <vscale x 4 x i32> @mismatched_extend_add_sub_commuted(<vscale x 4 x i16> %x, <vscale x 4 x i16> %y) {
633+
; FOLDING-LABEL: mismatched_extend_add_sub_commuted:
634+
; FOLDING: # %bb.0:
635+
; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma
636+
; FOLDING-NEXT: vzext.vf2 v10, v8
637+
; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma
638+
; FOLDING-NEXT: vwadd.wv v12, v10, v9
639+
; FOLDING-NEXT: vwsub.wv v10, v10, v9
640+
; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma
641+
; FOLDING-NEXT: vmul.vv v8, v12, v10
642+
; FOLDING-NEXT: ret
643+
%a = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>
644+
%b = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>
645+
%c = add <vscale x 4 x i32> %a, %b
646+
%d = sub <vscale x 4 x i32> %a, %b
647+
%e = mul <vscale x 4 x i32> %c, %d
648+
ret <vscale x 4 x i32> %e
649+
}
574650

575651
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
576652
; RV32: {{.*}}

0 commit comments

Comments
 (0)