diff options
author | Kaz Kojima <kkojima@gcc.gnu.org> | 2005-11-11 02:12:42 +0000 |
---|---|---|
committer | Kaz Kojima <kkojima@gcc.gnu.org> | 2005-11-11 02:12:42 +0000 |
commit | f2d186905aff4e0225e37b69a089f334290e806d (patch) | |
tree | 0b563d56025cd02e2b9c54a6bde629270c77a6e2 | |
parent | 253109d2ee930390bf762172ba7ae25007496704 (diff) | |
download | gcc-f2d186905aff4e0225e37b69a089f334290e806d.zip gcc-f2d186905aff4e0225e37b69a089f334290e806d.tar.gz gcc-f2d186905aff4e0225e37b69a089f334290e806d.tar.bz2 |
re PR target/24445 ("unable to find a register to spill in class 'R0_REGS")
PR target/24445
* calls.c (expand_call): Copy a return value to a plain register
if needed.
* gcc.dg/pr24445.c: New test.
From-SVN: r106774
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/calls.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr24445.c | 9 |
4 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c5f5bba..ec775d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-11-11 Kaz Kojima <kkojima@gcc.gnu.org> + + PR target/24445 + * calls.c (expand_call): Copy a return value to a plain register + if needed. + 2005-11-10 Alexandre Oliva <aoliva@redhat.com> PR target/24778 diff --git a/gcc/calls.c b/gcc/calls.c index 1a680ae..920c815 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2857,6 +2857,14 @@ expand_call (tree exp, rtx target, int ignore) && GET_MODE (target) == TYPE_MODE (TREE_TYPE (exp)) && GET_MODE (target) == GET_MODE (valreg)) { + /* We have to copy a return value in a CLASS_LIKELY_SPILLED hard + reg to a plain register. */ + if (REG_P (valreg) + && HARD_REGISTER_P (valreg) + && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (valreg))) + && !(REG_P (target) && !HARD_REGISTER_P (target))) + valreg = copy_to_reg (valreg); + /* TARGET and VALREG cannot be equal at this point because the latter would not have REG_FUNCTION_VALUE_P true, while the former would if it were referring to the same register. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ac89480..e2557a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-11-11 Kaz Kojima <kkojima@gcc.gnu.org> + + PR target/24445 + * gcc.dg/pr24445.c: New test. + 2005-11-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/24655 diff --git a/gcc/testsuite/gcc.dg/pr24445.c b/gcc/testsuite/gcc.dg/pr24445.c new file mode 100644 index 0000000..e001be6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr24445.c @@ -0,0 +1,9 @@ +/* { dg-do compile { target fpic } } */ +/* { dg-options "-O1 -fpic" } */ +extern int bar (void) __attribute__ ((__pure__)); +extern char *baz; +void +foo (void) +{ + baz = (char *) bar (); +} |