For the NEED_EQ_NE_P `riscv_emit_int_compare' is documented to only emit
EQ or NE comparisons against zero, however it does not catch incorrect
use where a non-equality comparison has been requested and falls through
to the general case then. Add a safety guard to catch such a case then.
Arguably the NEED_EQ_NE_P case would best be moved into a function of
its own, but let's leave it for a separate cleanup.
gcc/
* config/riscv/riscv.cc (riscv_emit_int_compare): Bail out if
NEED_EQ_NE_P but the comparison is neither EQ nor NE.
---
FWIW the structure of code here clearly shows the NEED_EQ_NE_P case has
been bolted on as an afterthought rather than how this piece would look
if written from scratch right away. Let's defer any further cleanups at
this stage of the development cycle though.
---
gcc/config/riscv/riscv.cc | 1 +
1 file changed, 1 insertion(+)
gcc-riscv-emit-int-compare-need-eq-ne.diff
Index: gcc/gcc/config/riscv/riscv.cc
===================================================================
--- gcc.orig/gcc/config/riscv/riscv.cc
+++ gcc/gcc/config/riscv/riscv.cc
@@ -3779,6 +3779,7 @@ riscv_emit_int_compare (enum rtx_code *c
*op1 = const0_rtx;
return;
}
+ gcc_unreachable ();
}
if (splittable_const_int_operand (*op1, VOIDmode))