]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/43635 (ICE in s390_emit_call, at config/s390/s390.c:9484)
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Tue, 20 Apr 2010 07:51:14 +0000 (07:51 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Tue, 20 Apr 2010 07:51:14 +0000 (07:51 +0000)
2010-04-20  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

PR target/43635
* config/s390/s390.c (s390_emit_call): Turn direct into indirect
calls for -fpic -m31 if they have been sibcall optimized.

2010-04-20  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

PR target/43635
* gcc.c-torture/compile/pr43635.c: New testcase.

From-SVN: r158540

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr43635.c [new file with mode: 0644]

index bd99d7bea83ba458c5ef154f44a5e9fcf0d6a244..5397101de3f896db8da98d92fb3c2425c6f8c68c 100644 (file)
@@ -1,3 +1,9 @@
+2010-04-20  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       PR target/43635
+       * config/s390/s390.c (s390_emit_call): Turn direct into indirect
+       calls for -fpic -m31 if they have been sibcall optimized.
+
 2010-04-19  James E. Wilson  <wilson@codesourcery.com>
 
        PR rtl-optimization/43520
index c3820e580123eb19b9ffd3f7f6dc82c1edede06f..858aac9f08494db1350e41696acb4899ac48888c 100644 (file)
@@ -9539,11 +9539,25 @@ s390_emit_call (rtx addr_location, rtx tls_call, rtx result_reg,
          replace the symbol itself with the PLT stub.  */
       if (flag_pic && !SYMBOL_REF_LOCAL_P (addr_location))
         {
-         addr_location = gen_rtx_UNSPEC (Pmode,
-                                         gen_rtvec (1, addr_location),
-                                         UNSPEC_PLT);
-         addr_location = gen_rtx_CONST (Pmode, addr_location);
-         plt_call = true;
+         if (retaddr_reg != NULL_RTX)
+           {
+             addr_location = gen_rtx_UNSPEC (Pmode,
+                                             gen_rtvec (1, addr_location),
+                                             UNSPEC_PLT);
+             addr_location = gen_rtx_CONST (Pmode, addr_location);
+             plt_call = true;
+           }
+         else
+           /* For -fpic code the PLT entries might use r12 which is
+              call-saved.  Therefore we cannot do a sibcall when
+              calling directly using a symbol ref.  When reaching
+              this point we decided (in s390_function_ok_for_sibcall)
+              to do a sibcall for a function pointer but one of the
+              optimizers was able to get rid of the function pointer
+              by propagating the symbol ref into the call.  This
+              optimization is illegal for S/390 so we turn the direct
+              call into a indirect call again.  */
+           addr_location = force_reg (Pmode, addr_location);
         }
 
       /* Unless we can use the bras(l) insn, force the
index dbde6351fac0f9b2fae635648e8d23e3eacf97bc..73295fcd1a3225dc2145432881959b8f82e245da 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-20  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       PR target/43635
+       * gcc.c-torture/compile/pr43635.c: New testcase.
+
 2010-04-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/43339
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr43635.c b/gcc/testsuite/gcc.c-torture/compile/pr43635.c
new file mode 100644 (file)
index 0000000..4039fa7
--- /dev/null
@@ -0,0 +1,7 @@
+extern void d (void);
+
+void (*foo (void)) (float)
+{
+  void (*(*x) (void)) (float) = d;
+  return (*x) ();
+}