]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-tailcall.c (find_tail_calls): Don't use tail-call recursion for built-in functions.
authorRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 15 Oct 2013 18:24:30 +0000 (18:24 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 15 Oct 2013 18:24:30 +0000 (18:24 +0000)
gcc/
2013-10-15  Richard Biener  <rguenther@suse.de>

* tree-tailcall.c (find_tail_calls): Don't use tail-call recursion
for built-in functions.

gcc/testsuite/
* gcc.dg/torture/builtin-self.c: New file.

libgcc/
* sync.c: Remove static aliases and define each function directly
under its real name.

From-SVN: r203628

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/builtin-self.c [new file with mode: 0644]
gcc/tree-tailcall.c
libgcc/ChangeLog
libgcc/sync.c

index dd10a5fc8663c1ca10d5ee92eda7e3bb0e38c24b..c3c209d13b217cb03e0ec9e37bd57ea11c0a93fe 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-15  Richard Biener  <rguenther@suse.de>
+
+       * tree-tailcall.c (find_tail_calls): Don't use tail-call recursion
+       for built-in functions.
+
 2013-10-15  Zhenqiang Chen  <zhenqiang.chen@arm.com>
 
        * tree-ssa-reassoc.c: Include rtl.h and tm_p.h.
index d59cc4f5ad7724d223cda74123d05f719ac07b09..11099e190b15b3cd993c3c9d865cd6f2dc1d2769 100644 (file)
@@ -1,3 +1,7 @@
+2013-10-15  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gcc.dg/torture/builtin-self.c: New file.
+
 2013-10-15  Zhenqiang Chen  <zhenqiang.chen@arm.com>
 
        * gcc.dg/tree-ssa/reassoc-32.c: New test case.
diff --git a/gcc/testsuite/gcc.dg/torture/builtin-self.c b/gcc/testsuite/gcc.dg/torture/builtin-self.c
new file mode 100644 (file)
index 0000000..6d1719f
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* Check that we can use this idiom to define out-of-line copies of built-in
+   functions.  This is used by libgcc/sync.c, for example.  */
+void __sync_synchronize (void)
+{
+  __sync_synchronize ();
+}
+/* { dg-final { scan-assembler "__sync_synchronize" } } */
+/* { dg-final { scan-assembler "\t(lock|mfence)" } } */
+/* { dg-final { scan-assembler-not "\tcall" } } */
index 721c8314b4a44da74ad3b945730cd01f9afb8caf..415d19acbbbb549f0d79c42f1a44d07f0ef00e25 100644 (file)
@@ -446,7 +446,9 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
   /* We found the call, check whether it is suitable.  */
   tail_recursion = false;
   func = gimple_call_fndecl (call);
-  if (func && recursive_call_p (current_function_decl, func))
+  if (func
+      && !DECL_BUILT_IN (func)
+      && recursive_call_p (current_function_decl, func))
     {
       tree arg;
 
index 40fcdba3c768b09a848755b92988860423e6310c..867155a24d55039687d6ffdf1d624011c0236086 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-15  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * sync.c: Remove static aliases and define each function directly
+       under its real name.
+
 2013-10-02  John David Anglin  <danglin@gcc.gnu.org>
 
        * config.host (hppa*64*-*-linux*): Define extra_parts.
index edb985eae2616745d3c4380abdc3424805a58d62..17158c902171ea0ca4a95f7dfde4aadaab909c4c 100644 (file)
@@ -67,27 +67,26 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #if defined FN
 
-/* Define macros for each __sync_* function type.  Each macro defines a
-   local function called <NAME>_<UNITS> that acts like __<NAME>_<UNITS>.
-   TYPE is a type that has UNITS bytes.  */
+/* Define functions called __sync_<NAME>_<UNITS>, with one macro per
+   signature.  TYPE is a type that has UNITS bytes.  */
 
 #define DEFINE_V_PV(NAME, UNITS, TYPE)                                 \
-  static TYPE                                                          \
-  NAME##_##UNITS (TYPE *ptr, TYPE value)                               \
+  TYPE                                                                 \
+  __##NAME##_##UNITS (TYPE *ptr, TYPE value)                           \
   {                                                                    \
     return __##NAME (ptr, value);                                      \
   }
 
-#define DEFINE_V_PVV(NAME, UNITS, TYPE)                                \
-  static TYPE                                                          \
-  NAME##_##UNITS (TYPE *ptr, TYPE value1, TYPE value2)                 \
+#define DEFINE_V_PVV(NAME, UNITS, TYPE)                                        \
+  TYPE                                                                 \
+  __##NAME##_##UNITS (TYPE *ptr, TYPE value1, TYPE value2)             \
   {                                                                    \
     return __##NAME (ptr, value1, value2);                             \
   }
 
 #define DEFINE_BOOL_PVV(NAME, UNITS, TYPE)                             \
-  static _Bool                                                         \
-  NAME##_##UNITS (TYPE *ptr, TYPE value1, TYPE value2)                 \
+  _Bool                                                                        \
+  __##NAME##_##UNITS (TYPE *ptr, TYPE value1, TYPE value2)             \
   {                                                                    \
     return __##NAME (ptr, value1, value2);                             \
   }
@@ -118,9 +117,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define DEFINE1(NAME, UNITS, TYPE) \
   static int unused[sizeof (TYPE) == UNITS ? 1 : -1]   \
     __attribute__((unused));                           \
-  local_##NAME (NAME, UNITS, TYPE);                    \
-  typeof (NAME##_##UNITS) __##NAME##_##UNITS           \
-    __attribute__((alias (#NAME "_" #UNITS)));
+  local_##NAME (NAME, UNITS, TYPE);
 
 /* As above, but performing macro expansion on the arguments.  */
 #define DEFINE(NAME, UNITS, TYPE) DEFINE1 (NAME, UNITS, TYPE)
@@ -167,13 +164,11 @@ DEFINE (FN, 8, UOItype)
 
 #if defined Lsync_synchronize
 
-static void
-sync_synchronize (void)
+void
+__sync_synchronize (void)
 {
   __sync_synchronize ();
 }
-typeof (sync_synchronize) __sync_synchronize \
-  __attribute__((alias ("sync_synchronize")));
 
 #endif