RISC-V: Block VLSmodes according to TARGET_MAX_LMUL and BITS_PER_RISCV_VECTOR
commit2e7abd09621a4401d44f4513adf126bce4b4828b
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>
Tue, 5 Dec 2023 12:57:27 +0000 (5 20:57 +0800)
committerPan Li <pan2.li@intel.com>
Tue, 5 Dec 2023 23:30:28 +0000 (6 07:30 +0800)
treea846b783b63a1a34366839079f664185623182a8
parentc73cc6fe6207b2863afa31a3be8ad87b70d3df0a
RISC-V: Block VLSmodes according to TARGET_MAX_LMUL and BITS_PER_RISCV_VECTOR

This patch fixes ICE mentioned on PR112851 and PR112852.
Actually these ICEs happens many times in full coverage testing.

The ICE happens on:

bug.c:84:1: internal compiler error: in partial_subreg_p, at rtl.h:3187
   84 | }
      | ^
0x11a7271 partial_subreg_p(machine_mode, machine_mode)
        ../../../../gcc/gcc/rtl.h:3187

gcc_checking_assert (ordered_p (outer_prec, inner_prec));

outer_prec is the PRECISION of RVVM1SImode
inner_prec is the PRECISION of V64SImode

when it is zvl512b.

outer_prec is VLA mode with size (512, 512)
inner_prec is VLS mode with size (2048, 0)

Their precision/size relationship is not certain.
So block VLSmodes according to TARGET_MAX_LMUL and BITS_PER_RISCV_VECTOR, then we never reaches
the situation that comparing the precision/size between VLA size and VLS size that size > coeffs[0] of VLA mode.

Note this patch cause following regression:

FAIL: gcc.target/riscv/rvv/autovec/pr111751.c -O3 -ftree-vectorize  scan-assembler-not vset
FAIL: gcc.target/riscv/rvv/autovec/pr111751.c -O3 -ftree-vectorize  scan-assembler-times li\\s+[a-x0-9]+,0\\s+ret 2

FAIL: gcc.target/riscv/rvv/base/cpymem-1.c check-function-bodies f3
FAIL: gcc.target/riscv/rvv/base/cpymem-2.c check-function-bodies f2
FAIL: gcc.target/riscv/rvv/base/cpymem-2.c check-function-bodies f3

1. cpymem check FAIL should be fixed on the testcase since the test is fragile which should be robostified.

2. pr111751.c is Vector cost model issue, and I will fix it in the following patch.

For now, we should land this patch first (highest-priority) since it is fixing ICE.

PR target/112851
PR target/112852

gcc/ChangeLog:

* config/riscv/riscv-v.cc (vls_mode_valid_p): Block VLSmodes according
TARGET_MAX_LMUL and BITS_PER_RISCV_VECTOR.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/autovec/vls/consecutive-1.c: Add LMUL = 8 option.
* gcc.target/riscv/rvv/autovec/vls/consecutive-2.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mod-1.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-1.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-10.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-11.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-12.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-13.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-14.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-15.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-16.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-17.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-3.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-5.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-7.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-8.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/mov-9.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/spill-1.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/spill-2.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/spill-3.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/spill-5.c: Ditto.
* gcc.target/riscv/rvv/autovec/vls/spill-6.c: Ditto.
* gcc.target/riscv/rvv/autovec/zve32f-1.c: Adapt test.
* gcc.target/riscv/rvv/autovec/pr112851.c: New test.
* gcc.target/riscv/rvv/autovec/pr112852.c: New test.
26 files changed:
gcc/config/riscv/riscv-v.cc
gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112851.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112852.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/consecutive-1.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/consecutive-2.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mod-1.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-1.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-10.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-11.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-12.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-13.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-14.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-15.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-16.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-17.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-3.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-5.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-7.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-8.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/mov-9.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/spill-1.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/spill-2.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/spill-3.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/spill-5.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/spill-6.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/zve32f-1.c