RISC-V: Fix ICE on riscv_gpr_save_operation_p [PR95683]
authorKito Cheng <kito.cheng@sifive.com>
Tue, 16 Jun 2020 02:14:13 +0000 (10:14 +0800)
committerKito Cheng <kito.cheng@sifive.com>
Tue, 16 Jun 2020 02:14:13 +0000 (10:14 +0800)
 - riscv_gpr_save_operation_p might try to match parallel on other
   patterns like inline asm pattern, and then it might trigger ther
   assertion checking there, so we could trun it into a early exit check.

gcc/ChangeLog:

PR target/95683
* config/riscv/riscv.c (riscv_gpr_save_operation_p): Remove
assertion and turn it into a early exit check.

gcc/testsuite/ChangeLog

PR target/95683
* gcc.target/riscv/pr95683.c: New.

gcc/config/riscv/riscv.c
gcc/testsuite/gcc.target/riscv/pr95683.c [new file with mode: 0644]

index 328c0c823a39ae918ac7137c38f9aaab3d9981f3..bfb3885ed081304748461c798afc831afb1bd8b0 100644 (file)
@@ -5216,7 +5216,10 @@ bool
 riscv_gpr_save_operation_p (rtx op)
 {
   unsigned len = XVECLEN (op, 0);
-  gcc_assert (len <= ARRAY_SIZE (gpr_save_reg_order));
+
+  if (len > ARRAY_SIZE (gpr_save_reg_order))
+    return false;
+
   for (unsigned i = 0; i < len; i++)
     {
       rtx elt = XVECEXP (op, 0, i);
diff --git a/gcc/testsuite/gcc.target/riscv/pr95683.c b/gcc/testsuite/gcc.target/riscv/pr95683.c
new file mode 100644 (file)
index 0000000..00cfbdc
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR target/95683 */
+/* { dg-options "-Os" } */
+/* { dg-do compile } */
+void a() {
+  asm(""
+      :
+      :
+      : "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3",
+        "t4", "t5", "t6", "ra");
+}