]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
RISC-V: Fix testcase failed when default -mcmodel=medany
authorLehua Ding <lehua.ding@rivai.ai>
Tue, 18 Jul 2023 07:34:40 +0000 (15:34 +0800)
committerLehua Ding <lehua.ding@rivai.ai>
Wed, 19 Jul 2023 07:04:55 +0000 (15:04 +0800)
This patch fix testcase failed when I build RISC-V GCC with -mcmodel=medany
as default. If set to medany, stack_save_restore.c testcase will fail because of
the reduced use of s3 registers in assembly (thus calling __riscv_save/store_3
instead of __riscv_save/store_4). So relax assert from
`__riscv_save/restore_4` to `__riscv_save/restore_(3|4)` to let this
testcase not brittle on any -mcmodel and add another testcase that use
-march=rv64imafc.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/stack_save_restore.c: Moved to...
* gcc.target/riscv/stack_save_restore_2.c: ...here.
* gcc.target/riscv/stack_save_restore_1.c: New test.

gcc/testsuite/gcc.target/riscv/stack_save_restore_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/stack_save_restore_2.c [moved from gcc/testsuite/gcc.target/riscv/stack_save_restore.c with 90% similarity]

diff --git a/gcc/testsuite/gcc.target/riscv/stack_save_restore_1.c b/gcc/testsuite/gcc.target/riscv/stack_save_restore_1.c
new file mode 100644 (file)
index 0000000..255ce5f
--- /dev/null
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64imafc -mabi=lp64f -msave-restore -O2 -fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops -fno-peel-loops -fno-lto" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+char my_getchar();
+float getf();
+
+/*
+** bar:
+**     call    t0,__riscv_save_(3|4)
+**     addi    sp,sp,-2032
+**     ...
+**     li      t0,-12288
+**     add     sp,sp,t0
+**     ...
+**     li      t0,12288
+**     add     sp,sp,t0
+**     ...
+**     addi    sp,sp,2032
+**     tail    __riscv_restore_(3|4)
+*/
+int bar()
+{
+  float volatile farray[3568];
+
+  float sum = 0;
+  float f1 = getf();
+  float f2 = getf();
+  float f3 = getf();
+  float f4 = getf();
+
+  for (int i = 0; i < 3568; i++)
+  {
+    farray[i] = my_getchar() * 1.2;
+    sum += farray[i];
+  }
+
+  return sum + f1 + f2 + f3 + f4;
+}
+
similarity index 90%
rename from gcc/testsuite/gcc.target/riscv/stack_save_restore.c
rename to gcc/testsuite/gcc.target/riscv/stack_save_restore_2.c
index 522e706cfbf4e742b0354eaba9c1dad9a3db4791..4ce5e0118a499136f625c0333c71e98417014851 100644 (file)
@@ -6,8 +6,8 @@ char my_getchar();
 float getf();
 
 /*
-**bar:
-**     call    t0,__riscv_save_4
+** bar:
+**     call    t0,__riscv_save_(3|4)
 **     addi    sp,sp,-2032
 **     ...
 **     li      t0,-12288
@@ -17,7 +17,7 @@ float getf();
 **     add     sp,sp,t0
 **     ...
 **     addi    sp,sp,2032
-**     tail    __riscv_restore_4
+**     tail    __riscv_restore_(3|4)
 */
 int bar()
 {