From 52c307baffef3b8742fce4ae431359d89ac529b1 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Sun, 2 May 2010 18:10:53 +0000 Subject: [PATCH] re PR tree-optimization/43879 (-fipa-pta causes various miscompilations) 2010-05-02 Richard Guenther PR tree-optimization/43879 * tree-tailcall.c (find_tail_calls): Clobbers also prevent tail calls. * gcc.dg/torture/pr43879-3.c: New testcase. From-SVN: r158977 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/torture/pr43879-3.c | 41 ++++++++++++++++++++++++ gcc/tree-tailcall.c | 3 +- 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr43879-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4cb8a344826..88aa4b038c3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-05-02 Richard Guenther + + PR tree-optimization/43879 + * tree-tailcall.c (find_tail_calls): Clobbers also prevent + tail calls. + 2010-05-02 Bruno Haible * doc/extend.texi (Function Attributes): Fix a typo. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 39a8d977d6e..ff2b62c9164 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-05-02 Richard Guenther + + PR tree-optimization/43879 + * gcc.dg/torture/pr43879-3.c: New testcase. + 2010-05-01 Richard Guenther PR tree-optimization/43949 diff --git a/gcc/testsuite/gcc.dg/torture/pr43879-3.c b/gcc/testsuite/gcc.dg/torture/pr43879-3.c new file mode 100644 index 00000000000..5ee80d5188d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr43879-3.c @@ -0,0 +1,41 @@ +/* { dg-do run } */ +/* { dg-options "-fipa-pta" } */ + +typedef unsigned long ulong; + +int __attribute__((noinline, noclone)) +f4 (int a, int b, int c, int d, int e) +{ + return a + b + c + d + e; +} + +void __attribute__((noinline, noclone)) +f3 (int *p) +{ + *p = f4(1, 2, 3, 4, 5); +} + +void __attribute__((noinline, noclone)) +f2 () +{ + int unused; + f3 (&unused); +} + +void __attribute__((noinline, noclone)) +f1 (ulong e, ulong f) +{ + if (e > 5 || f > 5) __builtin_abort(); + f2 (); +} + + +int main() +{ + ulong e, f; + for (e = 5; e > 0; e--) + for (f = 5; f > 0; f--) + f1(e, f); + return 0; +} + diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c index a9f01919b4d..ec6d2fdff68 100644 --- a/gcc/tree-tailcall.c +++ b/gcc/tree-tailcall.c @@ -460,7 +460,8 @@ find_tail_calls (basic_block bb, struct tailcall **ret) { if (TREE_CODE (var) != PARM_DECL && auto_var_in_fn_p (var, cfun->decl) - && ref_maybe_used_by_stmt_p (call, var)) + && (ref_maybe_used_by_stmt_p (call, var) + || call_may_clobber_ref_p (call, var))) return; } -- 2.30.2