gcc/ChangeLog:
* config/riscv/riscv-vector-builtins.cc
(function_builder::add_function):
Check the final DECl to make sure it is valid.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/base/bug-10.c: New test.
---
gcc/config/riscv/riscv-vector-builtins.cc | 9 +++++++--
.../gcc.target/riscv/rvv/base/bug-10.c | 17 +++++++++++++++++
2 files changed, 24 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/bug-10.c
diff --git a/gcc/config/riscv/riscv-vector-builtins.cc
b/gcc/config/riscv/riscv-vector-builtins.cc
index 41730c483ee1..0176670fbdf2 100644
--- a/gcc/config/riscv/riscv-vector-builtins.cc
+++ b/gcc/config/riscv/riscv-vector-builtins.cc
@@ -79,7 +79,7 @@ public:
function_instance GTY ((skip)) instance;
/* The decl itself. */
- tree GTY ((skip)) decl;
+ tree decl;
/* The overload hash of non-overloaded intrinsic is determined by
the overload name and argument list. Adding the overload name to
@@ -3771,7 +3771,6 @@ function_builder::add_function (const function_instance
&instance,
{
unsigned int code = vec_safe_length (registered_functions);
code = (code << RISCV_BUILTIN_SHIFT) + RISCV_BUILTIN_VECTOR;
-
/* We need to be able to generate placeholders to ensure that we have a
consistent numbering scheme for function codes between the C and C++
frontends, so that everything ties up in LTO.
@@ -3790,6 +3789,12 @@ function_builder::add_function (const function_instance
&instance,
: simulate_builtin_function_decl (input_location, name, fntype,
code, NULL, attrs);
+ /* If the code of DECL is ERROR_MARK or invalid code, usually "ggc_freed", we
+ use integer_zero_node instead of it. This will be very helpful for the
+ ggc_free. */
+ if (TREE_CODE (decl) == ERROR_MARK || TREE_CODE (decl) >= MAX_TREE_CODES)
+ decl = integer_zero_node;
+
registered_function &rfn = *ggc_alloc<registered_function> ();
rfn.instance = instance;
rfn.decl = decl;
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/bug-10.c
b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-10.c
new file mode 100644
index 000000000000..f685792a2c65
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-10.c
@@ -0,0 +1,17 @@
+/* Test that we do not have ice when compile */
+/* { dg-do link } */
+/* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d -O2 -flto" { target { rv64 }
} } */
+/* { dg-options "-march=rv32gcv_zvfh -mabi=ilp32d -O2 -flto" { target { rv32
} } } */
+
+ #include <riscv_vector.h>
+
+int
+main ()
+{
+ size_t vl = 8;
+ vint32m1_t vs1 = {};
+ vint32m1_t vs2 = {};
+ vint32m1_t vd = __riscv_vadd_vv_i32m1(vs1, vs2, vl);
+
+ return *(int*)&vd;
+}
--
2.17.1