RISC-V: Fix -msave-restore bug with sibcalls.
authorJim Wilson <wilson@gcc.gnu.org>
Tue, 9 Jan 2018 00:45:46 +0000 (16:45 -0800)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 9 Jan 2018 00:45:46 +0000 (16:45 -0800)
2018-01-08  Monk Chiang  <sh.chiang04@gmail.com>
    Kito Cheng  <kito.cheng@gmail.com>

gcc/
* config/riscv/riscv.c (machine_function::is_leaf): Remove field.
(riscv_leaf_function_p): Delete.
(riscv_function_ok_for_sibcall): Return false when TARGET_SAVE_RESTORE.

2018-01-08  Chih-Mao Chen <pkmx.tw@gmail.com>
    Monk Chiang  <sh.chiang04@gmail.com>

gcc/testsuite/
* gcc.target/riscv/save-restore-1.c: New.

From-SVN: r256362

gcc/ChangeLog
gcc/config/riscv/riscv.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/riscv/save-restore-1.c [new file with mode: 0644]

index 292d62de4f4913066ea4bba36b67665fd08b0327..d8e84c57aacbadd9f75d62c37ec2c0e80a64fa64 100644 (file)
@@ -1,3 +1,10 @@
+2018-01-08  Monk Chiang  <sh.chiang04@gmail.com>
+           Kito Cheng  <kito.cheng@gmail.com>
+
+       * config/riscv/riscv.c (machine_function::is_leaf): Remove field.
+       (riscv_leaf_function_p): Delete.
+       (riscv_function_ok_for_sibcall): Return false when TARGET_SAVE_RESTORE.
+
 2018-01-08  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        PR target/83677
index 39e12507e6811250ac0c20ea4c192f82da90c05c..b6270f7bfd7ff30659d7238941171af8bd2dcb00 100644 (file)
@@ -127,9 +127,6 @@ struct GTY(())  machine_function {
      This area is allocated by the callee at the very top of the frame.  */
   int varargs_size;
 
-  /* Memoized return value of leaf_function_p.  <0 if false, >0 if true.  */
-  int is_leaf;
-
   /* The current frame information, calculated by riscv_compute_frame_info.  */
   struct riscv_frame_info frame;
 };
@@ -4176,26 +4173,15 @@ riscv_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
   emit_insn (gen_clear_cache (addr, end_addr));
 }
 
-/* Return leaf_function_p () and memoize the result.  */
-
-static bool
-riscv_leaf_function_p (void)
-{
-  if (cfun->machine->is_leaf == 0)
-    cfun->machine->is_leaf = leaf_function_p () ? 1 : -1;
-
-  return cfun->machine->is_leaf > 0;
-}
-
 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL.  */
 
 static bool
 riscv_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
                               tree exp ATTRIBUTE_UNUSED)
 {
-  /* When optimzing for size, don't use sibcalls in non-leaf routines */
+  /* Don't use sibcalls when use save-restore routine.  */
   if (TARGET_SAVE_RESTORE)
-    return riscv_leaf_function_p ();
+    return false;
 
   return true;
 }
index 847f1b937b16d0bf737c5aa1b5e0084f63d9d186..9b0f827349fa63cefeaa49949ddde7a75c5bcfaa 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-08  Chih-Mao Chen <pkmx.tw@gmail.com>
+           Monk Chiang  <sh.chiang04@gmail.com>
+
+       * gcc.target/riscv/save-restore-1.c: New.
+
 2018-01-08  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        PR target/83677
diff --git a/gcc/testsuite/gcc.target/riscv/save-restore-1.c b/gcc/testsuite/gcc.target/riscv/save-restore-1.c
new file mode 100644 (file)
index 0000000..35b08b9
--- /dev/null
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -msave-restore -fomit-frame-pointer" } */
+
+#include <stdlib.h>
+
+__attribute__((noinline)) int g(void) { return 42; }
+
+__attribute__((noinline)) int f(void) {
+  asm volatile ("li s0, 0x87654321" ::: "s0");
+  return g();
+}
+
+int main(void) {
+  asm volatile ("li s0, 0x12345678" ::: "s0");
+
+  f();
+
+  long s0;
+  asm volatile ("mv %0, s0" : "=r"(s0));
+
+  if (s0 == 0x12345678)
+    exit (0);
+  else
+    abort();
+}