re PR target/24445 ("unable to find a register to spill in class 'R0_REGS")
authorKaz Kojima <kkojima@gcc.gnu.org>
Fri, 11 Nov 2005 02:12:42 +0000 (02:12 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Fri, 11 Nov 2005 02:12:42 +0000 (02:12 +0000)
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

gcc/ChangeLog
gcc/calls.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr24445.c [new file with mode: 0644]

index c5f5bbae1666de8add833333a590c7fa162c0dc9..ec775d21c539d8fe5cf978aeb31f7ec2a933114b 100644 (file)
@@ -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
index 1a680ae5159cd2391758f3be7e24a41f35cb9214..920c81575e0a1830cc1d40c43277d4e8bea6e832 100644 (file)
@@ -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.
index ac89480809b0a17fca6b2cd5d66db1d629b11a28..e2557a7991b545cd26bdf6d8d262c85c96931733 100644 (file)
@@ -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 (file)
index 0000000..e001be6
--- /dev/null
@@ -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 ();
+}