https://gcc.gnu.org/g:b7d975945025d1e4e9237c90b46bf4f660289d22
commit r14-11572-gb7d975945025d1e4e9237c90b46bf4f660289d22 Author: Robin Dapp <rd...@ventanamicro.com> Date: Wed Jul 24 09:08:00 2024 +0200 RISC-V: Error early with V and no M extension. For calculating the value of a poly_int at runtime we use a multiplication instruction that requires the M extension. Instead of just asserting and ICEing this patch emits an early error at option-parsing time. gcc/ChangeLog: PR target/116036 * config/riscv/riscv.cc (riscv_override_options_internal): Error with TARGET_VECTOR && !TARGET_MUL. gcc/testsuite/ChangeLog: * gcc.target/riscv/arch-31.c: Add m to arch string and expect it. * gcc.target/riscv/arch-32.c: Ditto. * gcc.target/riscv/predef-14.c: Ditto. * gcc.target/riscv/predef-15.c: Ditto. * gcc.target/riscv/predef-16.c: Ditto. * gcc.target/riscv/predef-26.c: Ditto. * gcc.target/riscv/predef-27.c: Ditto. * gcc.target/riscv/predef-32.c: Ditto. * gcc.target/riscv/predef-33.c: Ditto. * gcc.target/riscv/rvv/autovec/pr111486.c: Add m to arch string. * gcc.target/riscv/compare-debug-1.c: Ditto. * gcc.target/riscv/compare-debug-2.c: Ditto. * gcc.target/riscv/rvv/base/pr116036.c: New test. Diff: --- gcc/config/riscv/riscv.cc | 5 +++++ gcc/testsuite/gcc.target/riscv/arch-31.c | 2 +- gcc/testsuite/gcc.target/riscv/arch-32.c | 2 +- gcc/testsuite/gcc.target/riscv/compare-debug-1.c | 2 +- gcc/testsuite/gcc.target/riscv/compare-debug-2.c | 2 +- gcc/testsuite/gcc.target/riscv/predef-14.c | 6 +++--- gcc/testsuite/gcc.target/riscv/predef-15.c | 4 ++-- gcc/testsuite/gcc.target/riscv/predef-16.c | 4 ++-- gcc/testsuite/gcc.target/riscv/predef-26.c | 6 +++++- gcc/testsuite/gcc.target/riscv/predef-27.c | 6 +++++- gcc/testsuite/gcc.target/riscv/predef-32.c | 6 +++++- gcc/testsuite/gcc.target/riscv/predef-33.c | 6 +++++- gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111486.c | 2 +- gcc/testsuite/gcc.target/riscv/rvv/base/pr116036.c | 11 +++++++++++ 14 files changed, 48 insertions(+), 16 deletions(-) diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 9591bdf2c0cb..f4a3b96745b6 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -9257,6 +9257,11 @@ riscv_override_options_internal (struct gcc_options *opts) else if (!TARGET_MUL_OPTS_P (opts) && TARGET_DIV_OPTS_P (opts)) error ("%<-mdiv%> requires %<-march%> to subsume the %<M%> extension"); + /* We might use a multiplication to calculate the scalable vector length at + runtime. Therefore, require the M extension. */ + if (TARGET_VECTOR && !TARGET_MUL) + sorry ("GCC's current %<V%> implementation requires the %<M%> extension"); + /* Likewise floating-point division and square root. */ if ((TARGET_HARD_FLOAT_OPTS_P (opts) || TARGET_ZFINX_OPTS_P (opts)) && ((target_flags_explicit & MASK_FDIV) == 0)) diff --git a/gcc/testsuite/gcc.target/riscv/arch-31.c b/gcc/testsuite/gcc.target/riscv/arch-31.c index 5180753b9057..9b867c5ecd20 100644 --- a/gcc/testsuite/gcc.target/riscv/arch-31.c +++ b/gcc/testsuite/gcc.target/riscv/arch-31.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv32i_zvfbfmin -mabi=ilp32f" } */ +/* { dg-options "-march=rv32im_zvfbfmin -mabi=ilp32f" } */ int foo() { } diff --git a/gcc/testsuite/gcc.target/riscv/arch-32.c b/gcc/testsuite/gcc.target/riscv/arch-32.c index 496168325129..49a3db794892 100644 --- a/gcc/testsuite/gcc.target/riscv/arch-32.c +++ b/gcc/testsuite/gcc.target/riscv/arch-32.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv64iv_zvfbfmin -mabi=lp64d" } */ +/* { dg-options "-march=rv64imv_zvfbfmin -mabi=lp64d" } */ int foo() { } diff --git a/gcc/testsuite/gcc.target/riscv/compare-debug-1.c b/gcc/testsuite/gcc.target/riscv/compare-debug-1.c index d65bb287b9a7..c22e967f03d0 100644 --- a/gcc/testsuite/gcc.target/riscv/compare-debug-1.c +++ b/gcc/testsuite/gcc.target/riscv/compare-debug-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fno-tree-ch --param=max-completely-peel-times=0 -march=rv64iv -mabi=lp64d -fcompare-debug" } */ +/* { dg-options "-O -fno-tree-ch --param=max-completely-peel-times=0 -march=rv64imv -mabi=lp64d -fcompare-debug" } */ void diff --git a/gcc/testsuite/gcc.target/riscv/compare-debug-2.c b/gcc/testsuite/gcc.target/riscv/compare-debug-2.c index d87758475e46..be9bda17b59a 100644 --- a/gcc/testsuite/gcc.target/riscv/compare-debug-2.c +++ b/gcc/testsuite/gcc.target/riscv/compare-debug-2.c @@ -1,3 +1,3 @@ /* { dg-do compile } */ -/* { dg-options "-O -fno-tree-ch --param=max-completely-peel-times=0 -march=rv64iv -mabi=lp64d -fno-dce -fschedule-insns -fcompare-debug" } */ +/* { dg-options "-O -fno-tree-ch --param=max-completely-peel-times=0 -march=rv64imv -mabi=lp64d -fno-dce -fschedule-insns -fcompare-debug" } */ #include "compare-debug-1.c" diff --git a/gcc/testsuite/gcc.target/riscv/predef-14.c b/gcc/testsuite/gcc.target/riscv/predef-14.c index 4815150ddfae..138209a01695 100644 --- a/gcc/testsuite/gcc.target/riscv/predef-14.c +++ b/gcc/testsuite/gcc.target/riscv/predef-14.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv32iv -mabi=ilp32 -mcmodel=medlow -misa-spec=2.2" } */ +/* { dg-options "-march=rv32imv -mabi=ilp32 -mcmodel=medlow -misa-spec=2.2" } */ int main () { @@ -27,8 +27,8 @@ int main () { #error "__riscv_a" #endif -#if defined(__riscv_m) -#error "__riscv_m" +#if !defined(__riscv_mul) +#error "__riscv_mul" #endif #if !defined(__riscv_f) diff --git a/gcc/testsuite/gcc.target/riscv/predef-15.c b/gcc/testsuite/gcc.target/riscv/predef-15.c index dad14952ade0..fd119dc7492e 100644 --- a/gcc/testsuite/gcc.target/riscv/predef-15.c +++ b/gcc/testsuite/gcc.target/riscv/predef-15.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv64iv_zvl512b -mabi=lp64 -mcmodel=medlow -misa-spec=2.2" } */ +/* { dg-options "-march=rv64imv_zvl512b -mabi=lp64 -mcmodel=medlow -misa-spec=2.2" } */ int main () { @@ -27,7 +27,7 @@ int main () { #error "__riscv_a" #endif -#if defined(__riscv_m) +#if !defined(__riscv_m) #error "__riscv_m" #endif diff --git a/gcc/testsuite/gcc.target/riscv/predef-16.c b/gcc/testsuite/gcc.target/riscv/predef-16.c index faebc1ab4f25..d64b8dc56ebd 100644 --- a/gcc/testsuite/gcc.target/riscv/predef-16.c +++ b/gcc/testsuite/gcc.target/riscv/predef-16.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv64i_zve64f -mabi=lp64 -mcmodel=medlow -misa-spec=2.2" } */ +/* { dg-options "-march=rv64im_zve64f -mabi=lp64 -mcmodel=medlow -misa-spec=2.2" } */ int main () { @@ -27,7 +27,7 @@ int main () { #error "__riscv_a" #endif -#if defined(__riscv_m) +#if !defined(__riscv_m) #error "__riscv_m" #endif diff --git a/gcc/testsuite/gcc.target/riscv/predef-26.c b/gcc/testsuite/gcc.target/riscv/predef-26.c index 285f64bd6c0f..df0f05e45506 100644 --- a/gcc/testsuite/gcc.target/riscv/predef-26.c +++ b/gcc/testsuite/gcc.target/riscv/predef-26.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -march=rv64i_zvfhmin -mabi=lp64f -mcmodel=medlow -misa-spec=20191213" } */ +/* { dg-options "-O2 -march=rv64im_zvfhmin -mabi=lp64f -mcmodel=medlow -misa-spec=20191213" } */ int main () { @@ -15,6 +15,10 @@ int main () { #error "__riscv_i" #endif +#if !defined(__riscv_m) +#error "__riscv_m" +#endif + #if !defined(__riscv_f) #error "__riscv_f" #endif diff --git a/gcc/testsuite/gcc.target/riscv/predef-27.c b/gcc/testsuite/gcc.target/riscv/predef-27.c index 0f9ab4417a66..554acf36e5c5 100644 --- a/gcc/testsuite/gcc.target/riscv/predef-27.c +++ b/gcc/testsuite/gcc.target/riscv/predef-27.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -march=rv64i_zvfh -mabi=lp64f -mcmodel=medlow -misa-spec=20191213" } */ +/* { dg-options "-O2 -march=rv64im_zvfh -mabi=lp64f -mcmodel=medlow -misa-spec=20191213" } */ int main () { @@ -15,6 +15,10 @@ int main () { #error "__riscv_i" #endif +#if !defined(__riscv_m) +#error "__riscv_m" +#endif + #if !defined(__riscv_f) #error "__riscv_f" #endif diff --git a/gcc/testsuite/gcc.target/riscv/predef-32.c b/gcc/testsuite/gcc.target/riscv/predef-32.c index 7417e0d996f4..6d56f8fe6b8a 100644 --- a/gcc/testsuite/gcc.target/riscv/predef-32.c +++ b/gcc/testsuite/gcc.target/riscv/predef-32.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -march=rv32i_zvfbfmin -mabi=ilp32f -mcmodel=medlow -misa-spec=20191213" } */ +/* { dg-options "-O2 -march=rv32im_zvfbfmin -mabi=ilp32f -mcmodel=medlow -misa-spec=20191213" } */ int main () { @@ -15,6 +15,10 @@ int main () { #error "__riscv_i" #endif +#if !defined(__riscv_m) +#error "__riscv_m" +#endif + #if !defined(__riscv_f) #error "__riscv_f" #endif diff --git a/gcc/testsuite/gcc.target/riscv/predef-33.c b/gcc/testsuite/gcc.target/riscv/predef-33.c index 74d05bc9719d..f1da7e582af4 100644 --- a/gcc/testsuite/gcc.target/riscv/predef-33.c +++ b/gcc/testsuite/gcc.target/riscv/predef-33.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -march=rv64iv_zvfbfmin -mabi=lp64d -mcmodel=medlow -misa-spec=20191213" } */ +/* { dg-options "-O2 -march=rv64imv_zvfbfmin -mabi=lp64d -mcmodel=medlow -misa-spec=20191213" } */ int main () { @@ -15,6 +15,10 @@ int main () { #error "__riscv_i" #endif +#if !defined(__riscv_m) +#error "__riscv_m" +#endif + #if !defined(__riscv_f) #error "__riscv_f" #endif diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111486.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111486.c index 2ba2a3633995..483e9b931f68 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111486.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111486.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-march=rv64iv -mabi=lp64d -O2" } */ +/* { dg-options "-march=rv64imv -mabi=lp64d -O2" } */ typedef char __attribute__((__vector_size__ (1))) V; diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr116036.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr116036.c new file mode 100644 index 000000000000..a72209593f39 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr116036.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64idv -mabi=lp64d -O3" } */ + +int a[15][15]; +void init() { + for (int i_0 ; i_0 < 15 ; ++i_0) + for (int i_1 = 0; i_1 < 15; ++i_1) + a[i_0][i_1] = 1; +} + +/* { dg-excess-errors "sorry, unimplemented: GCC's current 'V' implementation requires the 'M' extension" } */