aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdwin Lu <ewlu@rivosinc.com>2024-06-14 09:46:01 -0700
committerEdwin Lu <ewlu@rivosinc.com>2024-06-18 15:28:17 -0700
commitffe5141f30655e1889c8d0471a4f60fa4d64d1b0 (patch)
tree276c295b52334a40cdbc4b00dc19818dbca6fa5e
parent6638ba17eadc0f450faa3d8c2f77afe7fdb20614 (diff)
downloadgcc-ffe5141f30655e1889c8d0471a4f60fa4d64d1b0.zip
gcc-ffe5141f30655e1889c8d0471a4f60fa4d64d1b0.tar.gz
gcc-ffe5141f30655e1889c8d0471a4f60fa4d64d1b0.tar.bz2
RISC-V: Move mode assertion out of conditional branch in emit_insn
When emitting insns, we have an early assertion to ensure the input operand's mode and the expanded operand's mode are the same; however, it does not perform this check if the pattern does not have an explicit machine mode specifying the operand. In this scenario, it will always assume that mode = Pmode to correctly satisfy the maybe_legitimize_operand check, however, there may be problems when working in 32 bit environments. Make the assert unconditional and replace it with an internal error for more descriptive logging gcc/ChangeLog: * config/riscv/riscv-v.cc: Move assert out of conditional block Signed-off-by: Edwin Lu <ewlu@rivosinc.com> Co-authored-by: Robin Dapp <rdapp@ventanamicro.com>
-rw-r--r--gcc/config/riscv/riscv-v.cc25
1 files changed, 19 insertions, 6 deletions
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index 8911f57..5306711 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -50,6 +50,7 @@
#include "rtx-vector-builder.h"
#include "targhooks.h"
#include "predict.h"
+#include "errors.h"
using namespace riscv_vector;
@@ -290,11 +291,17 @@ public:
always Pmode. */
if (mode == VOIDmode)
mode = Pmode;
- else
- /* Early assertion ensures same mode since maybe_legitimize_operand
- will check this. */
- gcc_assert (GET_MODE (ops[opno]) == VOIDmode
- || GET_MODE (ops[opno]) == mode);
+
+ /* Early assertion ensures same mode since maybe_legitimize_operand
+ will check this. */
+ machine_mode required_mode = GET_MODE (ops[opno]);
+ if (required_mode != VOIDmode && required_mode != mode)
+ internal_error ("expected mode %s for operand %d of "
+ "insn %s but got mode %s.\n",
+ GET_MODE_NAME (mode),
+ opno,
+ insn_data[(int) icode].name,
+ GET_MODE_NAME (required_mode));
add_input_operand (ops[opno], mode);
}
@@ -346,7 +353,13 @@ public:
else if (m_insn_flags & VXRM_RDN_P)
add_rounding_mode_operand (VXRM_RDN);
- gcc_assert (insn_data[(int) icode].n_operands == m_opno);
+
+ if (insn_data[(int) icode].n_operands != m_opno)
+ internal_error ("invalid number of operands for insn %s, "
+ "expected %d but got %d.\n",
+ insn_data[(int) icode].name,
+ insn_data[(int) icode].n_operands, m_opno);
+
expand (icode, any_mem_p);
}