s390.c (s390_can_use_return_insn): Check for call-saved FPRs on 31 bit.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Thu, 27 Mar 2014 15:38:29 +0000 (15:38 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Thu, 27 Mar 2014 15:38:29 +0000 (15:38 +0000)
2014-03-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* config/s390/s390.c (s390_can_use_return_insn): Check for
call-saved FPRs on 31 bit.

2014-03-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* gcc.target/s390/20140327-1.c: New testcase.

From-SVN: r208867

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/20140327-1.c [new file with mode: 0644]

index fb61812..674f3a4 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.c (s390_can_use_return_insn): Check for
+       call-saved FPRs on 31 bit.
+
 2014-03-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/60682
index 7a79286..bdb577c 100644 (file)
@@ -9225,6 +9225,13 @@ s390_can_use_return_insn (void)
     if (cfun_gpr_save_slot (i))
       return false;
 
+  /* For 31 bit this is not covered by the frame_size check below
+     since f4, f6 are saved in the register save area without needing
+     additional stack space.  */
+  if (!TARGET_64BIT
+      && (cfun_fpr_save_p (FPR4_REGNUM) || cfun_fpr_save_p (FPR6_REGNUM)))
+    return false;
+
   if (cfun->machine->base_reg
       && !call_really_used_regs[REGNO (cfun->machine->base_reg)])
     return false;
index c2a13d9..bcdaa3d 100644 (file)
@@ -1,3 +1,7 @@
+2014-03-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * gcc.target/s390/20140327-1.c: New testcase.
+
 2014-03-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/60682
diff --git a/gcc/testsuite/gcc.target/s390/20140327-1.c b/gcc/testsuite/gcc.target/s390/20140327-1.c
new file mode 100644 (file)
index 0000000..f71c38f
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -m31 -mzarch" } */
+
+void
+foo ()
+{
+  asm ("" ::: "%f4");
+}
+
+/* { dg-final { scan-assembler "ld" } } */