When configuring GCC for RV32EC with:
./configure \
--target=riscv32-none-elf \
--with-multilib-generator="rv32ec-ilp32e--" \
--with-abi=ilp32e \
--with-arch=rv32ec
Then the build fails because division is erroneously left enabled:
cc1: error: '-mdiv' requires '-march' to subsume the 'M' extension
-fself-test: 8412281 pass(es) in 0.647173 seconds
Fix by disabling MASK_DIV if multiplication is not available and -mdiv
option has not been explicitly passed.
Tested the above RV32EC-only toolchain using the GNU simulator:
=== gcc Summary ===
# of expected passes 211635
# of unexpected failures 3004
# of expected failures 1061
# of unresolved testcases 5651
# of unsupported tests 18958
The high number of failures is due to unrelated testsuite issue PR117603.
Ok for trunk once CI is green?
gcc/ChangeLog:
* config/riscv/riscv.cc (riscv_override_options_internal):
Set division option's default to disabled if multiplication
is not available.
Signed-off-by: Dimitar Dimitrov <[email protected]>
---
Changes in v2:
- Do not forcefully tie MUL and DIV in riscv_ext_flag_table. That
causes the gcc.target/riscv/predef-7.c case to fail when M
extension is available but -mno-div option is explicitly set:
... -march=rv32em -mabi=ilp32e -mno-div ...
gcc/config/riscv/riscv.cc | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 2e1e3a97eff..b016c078dba 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -10301,9 +10301,13 @@ riscv_override_options_internal (struct gcc_options
*opts)
const struct riscv_tune_info *cpu;
/* The presence of the M extension implies that division instructions
- are present, so include them unless explicitly disabled. */
+ are present, so include them unless explicitly disabled.
+ Similarly, if the M extension is not available, then disable
+ division instructions, unless they are explicitly enabled. */
if (TARGET_MUL_OPTS_P (opts) && (target_flags_explicit & MASK_DIV) == 0)
opts->x_target_flags |= MASK_DIV;
+ else if (!TARGET_MUL_OPTS_P (opts) && (target_flags_explicit & MASK_DIV) ==
0)
+ opts->x_target_flags &= ~MASK_DIV;
else if (!TARGET_MUL_OPTS_P (opts) && TARGET_DIV_OPTS_P (opts))
error ("%<-mdiv%> requires %<-march%> to subsume the %<M%> extension");
--
2.47.0