]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
RISC-V: Move mode assertion out of conditional branch in emit_insn
authorEdwin Lu <ewlu@rivosinc.com>
Fri, 14 Jun 2024 16:46:01 +0000 (09:46 -0700)
committerEdwin Lu <ewlu@rivosinc.com>
Tue, 18 Jun 2024 22:28:17 +0000 (15:28 -0700)
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>
gcc/config/riscv/riscv-v.cc

index 8911f5783c883b3ee2e0cd7e51652e75b7b2ec2e..5306711c1b73855c9e7b3b1564cf9557e6cc5889 100644 (file)
@@ -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);
   }