From b6a712d1e31fd145a43176474eb323421eafc151 Mon Sep 17 00:00:00 2001
From: Kuan-Lin Chen <rufus@atccpl09.andestech.com>
Date: Mon, 21 Oct 2024 15:21:55 +0800
Subject: [PATCH 1/3] RISC-V: Remove skip of decl in registered_function.

The GTY skip makes GGC clean the registered functions wrongly in lto.

Example:
riscv64-unknown-elf-gcc -flto gcc/testsuite/gcc.target/riscv/rvv/base/bug-10.c
-O2 -march=rv64gcv

In file included from bug-10.c:2: internal compiler error: Segmentation fault

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins.cc (registered_function):
	Remove skip at decl.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/bug-10.c: New test.
---
 gcc/config/riscv/riscv-vector-builtins.cc     |  2 +-
 .../gcc.target/riscv/rvv/base/bug-10.c        | 22 +++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)
 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 458d9b0886e..084aad89733 100644
--- a/gcc/config/riscv/riscv-vector-builtins.cc
+++ b/gcc/config/riscv/riscv-vector-builtins.cc
@@ -80,7 +80,7 @@ public:
   function_instance GTY ((skip)) instance;
 
   /* The decl itself.  */
-  tree GTY ((skip)) decl;
+  tree GTY (()) decl;
 
   /* The overload hash of non-overloaded intrinsic is determined by
      the overload name and argument list. Adding the overload name to
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 00000000000..ef4f7551294
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-10.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -flto" } */
+
+#include "riscv_vector.h"
+#include <stdio.h>
+
+int main()
+{
+  int32_t a = 1;
+  int32_t b[1] = {3};
+  int32_t c[1] = {10};
+  int32_t d[1] = {0};
+  vint32m1_t vb = __riscv_vle32_v_i32m1 (b, 1);
+  vint32m1_t vc = __riscv_vle32_v_i32m1 (c, 1);
+  vint32m1_t vd = __riscv_vnmsub_vx_i32m1 (vb, a, vc, 1);
+  __riscv_vse32_v_i32m1 (d, vd, 1);
+  if (d[0] != 7){
+      printf("d[0] should be 7, but got %d\n", d[0]);
+      __builtin_abort ();
+  }
+  return 0;
+}
-- 
2.43.5

