diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/builtin-self.c | 10 | ||||
-rw-r--r-- | gcc/tree-tailcall.c | 4 |
4 files changed, 22 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd10a5fc866..c3c209d13b2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d59cc4f5ad7..11099e190b1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 00000000000..6d1719f7517 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/builtin-self.c @@ -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" } } */ diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c index 721c8314b4a..415d19acbbb 100644 --- a/gcc/tree-tailcall.c +++ b/gcc/tree-tailcall.c @@ -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; |