[gcc r17-2514] [PATCH] RISC-V: Fix the LRA crashing triggered by TLSDESC clobber updates

Jeff Law via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:ed1cb8abdbf61d86c4b85b3b69d375fdefae2e21

commit r17-2514-ged1cb8abdbf61d86c4b85b3b69d375fdefae2e21
Author: Luke Zhuang <[email protected]>
Date:   Sat Jul 18 14:29:18 2026 -0600

    [PATCH] RISC-V: Fix the LRA crashing triggered by TLSDESC clobber updates
    
    An LRA crashing is found by fuzz-testing, and is triggered by
    <0748d2c83fc>. We can avoid it by replacing RVVM8QI with RVVM1QI,
    and may need to fix the LRA later.
    
    A reduced test is appended as well, demonstrating the crash.
    
    gcc/ChangeLog:
    
            * config/riscv/riscv.md (@tlsdesc<mode>): Use individual
            RVVM1QI clobbers instead of four RVVM8QI.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/riscv/tlsdesc_clobber_lra.c: New test.
    
    Co-authored-by: Kito Cheng <[email protected]>

Diff:
---
 gcc/config/riscv/riscv.md                          | 36 +++++++++++++++++++---
 .../gcc.target/riscv/tlsdesc_clobber_lra.c         | 16 ++++++++++
 2 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index 5e7117f77473..9140a0ce6fe7 100644
--- a/gcc/config/riscv/riscv.md
+++ b/gcc/config/riscv/riscv.md
@@ -2480,10 +2480,38 @@
 	    [(match_operand:P 0 "symbolic_operand" "")]
 	    UNSPEC_TLSDESC))
    (clobber (reg:P T0_REGNUM))
-   (clobber (reg:RVVM8QI 96))
-   (clobber (reg:RVVM8QI 104))
-   (clobber (reg:RVVM8QI 112))
-   (clobber (reg:RVVM8QI 120))
+   (clobber (reg:RVVM1QI 96))
+   (clobber (reg:RVVM1QI 97))
+   (clobber (reg:RVVM1QI 98))
+   (clobber (reg:RVVM1QI 99))
+   (clobber (reg:RVVM1QI 100))
+   (clobber (reg:RVVM1QI 101))
+   (clobber (reg:RVVM1QI 102))
+   (clobber (reg:RVVM1QI 103))
+   (clobber (reg:RVVM1QI 104))
+   (clobber (reg:RVVM1QI 105))
+   (clobber (reg:RVVM1QI 106))
+   (clobber (reg:RVVM1QI 107))
+   (clobber (reg:RVVM1QI 108))
+   (clobber (reg:RVVM1QI 109))
+   (clobber (reg:RVVM1QI 110))
+   (clobber (reg:RVVM1QI 111))
+   (clobber (reg:RVVM1QI 112))
+   (clobber (reg:RVVM1QI 113))
+   (clobber (reg:RVVM1QI 114))
+   (clobber (reg:RVVM1QI 115))
+   (clobber (reg:RVVM1QI 116))
+   (clobber (reg:RVVM1QI 117))
+   (clobber (reg:RVVM1QI 118))
+   (clobber (reg:RVVM1QI 119))
+   (clobber (reg:RVVM1QI 120))
+   (clobber (reg:RVVM1QI 121))
+   (clobber (reg:RVVM1QI 122))
+   (clobber (reg:RVVM1QI 123))
+   (clobber (reg:RVVM1QI 124))
+   (clobber (reg:RVVM1QI 125))
+   (clobber (reg:RVVM1QI 126))
+   (clobber (reg:RVVM1QI 127))
    (clobber (reg:SI VL_REGNUM))
    (clobber (reg:SI VTYPE_REGNUM))
    (clobber (reg:SI VXRM_REGNUM))
diff --git a/gcc/testsuite/gcc.target/riscv/tlsdesc_clobber_lra.c b/gcc/testsuite/gcc.target/riscv/tlsdesc_clobber_lra.c
new file mode 100644
index 000000000000..307a42d8ec0e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/tlsdesc_clobber_lra.c
@@ -0,0 +1,16 @@
+/* Verify we don't ICE on the following test case.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-options "-O -fpic -mtls-dialect=desc -march=rv64gcv -mabi=lp64d" } */
+/* { dg-require-effective-target fpic } */
+
+extern __thread int x;
+extern int bar(int);
+
+int f(int id) {
+  x = id * 1000;
+  bar(0);
+  if (x != id * 1000) return bar(x);
+  return 0;
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.