RISC-V: Fix -msave-restore bug with sibcalls.

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.

	2017-11-29  Jim Wilson  <jimw@sifive.com>
	gcc/testsuite/
	* gcc.target/riscv/riscv.exp: New.

From-SVN: r256363
This commit is contained in:
Jim Wilson 2018-01-09 01:01:45 +00:00 committed by Jim Wilson
parent c9af7ef850
commit 603ceb882d
5 changed files with 91 additions and 17 deletions

View File

@ -1,3 +1,13 @@
2018-01-08 Jim Wilson <jimw@sifive.com>
Backport from mainline
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 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Backport from mainline

View File

@ -1,5 +1,5 @@
/* Subroutines used for code generation for RISC-V.
Copyright (C) 2011-2017 Free Software Foundation, Inc.
Copyright (C) 2011-2018 Free Software Foundation, Inc.
Contributed by Andrew Waterman (andrew@sifive.com).
Based on MIPS target for GNU compiler.
@ -177,9 +177,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;
};
@ -3994,26 +3991,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;
}

View File

@ -1,3 +1,15 @@
2018-01-08 Jim Wilson <jimw@sifive.com>
Backport from mainline
2018-01-08 Chih-Mao Chen <pkmx.tw@gmail.com>
Monk Chiang <sh.chiang04@gmail.com>
* gcc.target/riscv/save-restore-1.c: New.
2017-11-29 Jim Wilson <jimw@sifive.com>
* gcc.target/riscv/riscv.exp: New.
2018-01-08 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Backport from mainline

View File

@ -0,0 +1,41 @@
# Copyright (C) 2017-2018 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
# GCC testsuite that uses the `dg.exp' driver.
# Exit immediately if this isn't a RISC-V target.
if ![istarget riscv*-*-*] then {
return
}
# Load support procs.
load_lib gcc-dg.exp
# If a testcase doesn't have special options, use these.
global DEFAULT_CFLAGS
if ![info exists DEFAULT_CFLAGS] then {
set DEFAULT_CFLAGS " -ansi -pedantic-errors"
}
# Initialize `dg'.
dg-init
# Main loop.
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \
"" $DEFAULT_CFLAGS
# All done.
dg-finish

View File

@ -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();
}