]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PATCH v2] RISC-V: Fix type of CFA during stack probe [PR122114]
authorRaphael Moreira Zinsly <rzinsly@ventanamicro.com>
Sat, 4 Oct 2025 14:36:48 +0000 (08:36 -0600)
committerJeff Law <jlaw@ventanamicro.com>
Sat, 4 Oct 2025 14:36:48 +0000 (08:36 -0600)
Changes since v1:
- Limit test to rv64.

-->8--

frame.total_size may not be a constant, this patch changes the type of
the stored cfa offset to avoid errors trying to convert the frame size.

PR target/122114
gcc/ChangeLog:
* config/riscv/riscv.cc
(riscv_allocate_and_probe_stack_space): Change initial_cfa_offset
type.

gcc/testsuite/ChangeLog:
* gcc.target/riscv/pr122114.c: New test.

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

index bf3bcad4d73b6da35d05e6e9bbe2d320330d2edd..c81a2e4b49198659aba1f3a987d7f226942cd066 100644 (file)
@@ -9039,8 +9039,7 @@ riscv_allocate_and_probe_stack_space (rtx temp1, HOST_WIDE_INT size)
         from the top of the frame, as it might be lowered before.
         To consider the correct SP addresses for the CFA notes, it is needed
         to correct them with the initial offset value.  */
-      HOST_WIDE_INT initial_cfa_offset
-       = cfun->machine->frame.total_size.to_constant () - size;
+      poly_int64 initial_cfa_offset = cfun->machine->frame.total_size - size;
 
       if (!frame_pointer_needed)
        {
diff --git a/gcc/testsuite/gcc.target/riscv/pr122114.c b/gcc/testsuite/gcc.target/riscv/pr122114.c
new file mode 100644 (file)
index 0000000..ccb2ec9
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile { target { rv64 } } } */
+/* { dg-options "-O2 -fstack-clash-protection -march=rv64gcv_zvl256b -mabi=lp64d" } */
+
+int pk_gen_i, pk_gen_j;
+long pk_gen_buf[4];
+long pk_gen_t;
+
+void vec_mul(long *, long *, long *);
+void uint64_is_zero_declassify(long);
+
+void pk_gen() {
+  long consts[128][13], prod[128][13];
+
+  vec_mul(prod[pk_gen_j], prod[pk_gen_j], consts[pk_gen_j]);
+
+  for (; pk_gen_i;) {
+    for (; pk_gen_j; pk_gen_j++)
+      pk_gen_t |= pk_gen_buf[pk_gen_j];
+
+    uint64_is_zero_declassify(pk_gen_t);
+  }
+}