From 54803f8fce5b66fec9a39c6a532a5778083e6e40 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Thu, 6 Nov 2025 07:23:23 -0800 Subject: [PATCH] [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. --- .../RISCV/rvv/vscale-vw-web-simplification.ll | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll b/llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll index ad2ed47e67e6..b1f0eee3e9f5 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vscale-vw-web-simplification.ll @@ -570,7 +570,83 @@ define @vwop_vscale_zext_i8i32_multiple_users(ptr %x, ptr %y, ret %i } +define @mismatched_extend_sub_add( %x, %y) { +; FOLDING-LABEL: mismatched_extend_sub_add: +; FOLDING: # %bb.0: +; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma +; FOLDING-NEXT: vzext.vf2 v10, v8 +; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma +; FOLDING-NEXT: vwsub.wv v12, v10, v9 +; FOLDING-NEXT: vwadd.wv v10, v10, v9 +; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma +; FOLDING-NEXT: vmul.vv v8, v12, v10 +; FOLDING-NEXT: ret + %a = zext %x to + %b = sext %y to + %c = sub %a, %b + %d = add %a, %b + %e = mul %c, %d + ret %e +} +; FIXME: this should remove the vsext +define @mismatched_extend_sub_add_commuted( %x, %y) { +; FOLDING-LABEL: mismatched_extend_sub_add_commuted: +; FOLDING: # %bb.0: +; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma +; FOLDING-NEXT: vzext.vf2 v10, v8 +; FOLDING-NEXT: vsext.vf2 v12, v9 +; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma +; FOLDING-NEXT: vwsub.wv v10, v10, v9 +; FOLDING-NEXT: vwaddu.wv v12, v12, v8 +; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma +; FOLDING-NEXT: vmul.vv v8, v10, v12 +; FOLDING-NEXT: ret + %a = zext %x to + %b = sext %y to + %c = sub %a, %b + %d = add %b, %a + %e = mul %c, %d + ret %e +} + +define @mismatched_extend_add_sub( %x, %y) { +; FOLDING-LABEL: mismatched_extend_add_sub: +; FOLDING: # %bb.0: +; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma +; FOLDING-NEXT: vzext.vf2 v10, v8 +; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma +; FOLDING-NEXT: vwadd.wv v12, v10, v9 +; FOLDING-NEXT: vwsub.wv v10, v10, v9 +; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma +; FOLDING-NEXT: vmul.vv v8, v12, v10 +; FOLDING-NEXT: ret + %a = zext %x to + %b = sext %y to + %c = add %a, %b + %d = sub %a, %b + %e = mul %c, %d + ret %e +} + +define @mismatched_extend_add_sub_commuted( %x, %y) { +; FOLDING-LABEL: mismatched_extend_add_sub_commuted: +; FOLDING: # %bb.0: +; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma +; FOLDING-NEXT: vzext.vf2 v10, v8 +; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma +; FOLDING-NEXT: vwadd.wv v12, v10, v9 +; FOLDING-NEXT: vwsub.wv v10, v10, v9 +; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma +; FOLDING-NEXT: vmul.vv v8, v12, v10 +; FOLDING-NEXT: ret + %a = zext %x to + %b = sext %y to + %c = add %a, %b + %d = sub %a, %b + %e = mul %c, %d + ret %e +} ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; RV32: {{.*}}