re PR target/65753 ([i386] Incorrect tail call inhibition logic on i386 (32-bit))
authorAlexander Monakov <amonakov@ispras.ru>
Mon, 11 May 2015 16:10:24 +0000 (19:10 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Mon, 11 May 2015 16:10:24 +0000 (19:10 +0300)
PR target/65753
* config/i386/i386.c (ix86_function_ok_for_sibcall): Allow PIC sibcalls
via function pointers.

testsuite:
* gcc.target/i386/pr65753.c: New test.

From-SVN: r223005

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr65753.c [new file with mode: 0644]

index 38f929bd19dbcc37110ee26222a48468dbc03360..7640c5b50aa042537f2c990796019021ee297bc9 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-11  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR target/65753
+       * config/i386/i386.c (ix86_function_ok_for_sibcall): Allow PIC sibcalls
+       via function pointers.
+
 2015-05-11  Alexander Monakov  <amonakov@ispras.ru>
 
        * calls.c (prepare_call_address): Transform PLT call to GOT lookup and
index 7bd9ff307b6470a68791c98ff14efcb1b0d12114..fb7977f4d65bf76d6b8d02b2de0aed57754e7038 100644 (file)
@@ -5473,12 +5473,12 @@ ix86_function_ok_for_sibcall (tree decl, tree exp)
   rtx a, b;
 
   /* If we are generating position-independent code, we cannot sibcall
-     optimize any indirect call, or a direct call to a global function,
-     as the PLT requires %ebx be live. (Darwin does not have a PLT.)  */
+     optimize direct calls to global functions, as the PLT requires
+     %ebx be live. (Darwin does not have a PLT.)  */
   if (!TARGET_MACHO
       && !TARGET_64BIT
       && flag_pic
-      && (!decl || !targetm.binds_local_p (decl)))
+      && decl && !targetm.binds_local_p (decl))
     return false;
 
   /* If we need to align the outgoing stack, then sibcalling would
index 3b327b75b7f241ce1e73f031976aac16fe50d7b1..e5fda8b9f3dfae333d9fa084d067181c812999b5 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-11  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR target/65753
+       * gcc.target/i386/pr65753.c: New test.
+
 2015-05-11  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR rtl-optimization/66076
diff --git a/gcc/testsuite/gcc.target/i386/pr65753.c b/gcc/testsuite/gcc.target/i386/pr65753.c
new file mode 100644 (file)
index 0000000..70061e2
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-fPIC -O" } */
+/* { dg-final { scan-assembler-not "call" } } */
+
+void foo(void (*bar)(void))
+{
+  bar();
+}