mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-11 12:35:05 +08:00
tree-tailcall.c (find_tail_calls): Don't use tail-call recursion for built-in functions.
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
This commit is contained in:
parent
b114bfb455
commit
1602204161
@ -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.
|
||||
|
@ -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.
|
||||
|
10
gcc/testsuite/gcc.dg/torture/builtin-self.c
Normal file
10
gcc/testsuite/gcc.dg/torture/builtin-self.c
Normal file
@ -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" } } */
|
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user