On Tue, Sep 10, 2024 at 7:56 AM Jin Ma <ji...@linux.alibaba.com> wrote: > > 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;
While this looks obvious, ... > /* 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; > + ... this one looks like a hack (note ggc_free only poisons memory when checking is enabled). I'm curious why you ever get a ggc_freed decl here. > 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 >