From: Jan Hubicka Date: Mon, 8 Jun 2009 19:21:33 +0000 (+0200) Subject: re PR middle-end/39834 (verify_cgraph_node failed with -O3 -Winline) X-Git-Tag: releases/gcc-4.5.0~5307 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=21ecdec5dbc85bab4d266ad40bcb60e0d5d28b11;p=thirdparty%2Fgcc.git re PR middle-end/39834 (verify_cgraph_node failed with -O3 -Winline) PR debug/39834 * gcc.dg/torture/pr39834.c PR middle-end/39834 * cgraphunit.c (save_inline_function_body): Do not copy transform hooks for saved inline bodies. * ipa-passes.c (do_per_function): Do not add the hoks multiple times for given function. From-SVN: r148292 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 594c0a6e84f5..233028faa068 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2009-06-08 Jan Hubicka + + PR middle-end/39834 + * cgraphunit.c (save_inline_function_body): Do not copy transform hooks + for saved inline bodies. + * ipa-passes.c (do_per_function): Do not add the hoks multiple times + for given function. + 2009-06-08 Adam Nemet * jump.c (returnjump_p): Handle delayed branches. Add missing diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 70b2682449fe..907488c1431c 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1688,6 +1688,9 @@ save_inline_function_body (struct cgraph_node *node) DECL_ONE_ONLY (first_clone->decl) = 0; TREE_PUBLIC (first_clone->decl) = 0; DECL_COMDAT (first_clone->decl) = 0; + VEC_free (ipa_opt_pass, heap, + DECL_STRUCT_FUNCTION (first_clone->decl)->ipa_transforms_to_apply); + DECL_STRUCT_FUNCTION (first_clone->decl)->ipa_transforms_to_apply = NULL; #ifdef ENABLE_CHECKING verify_cgraph_node (first_clone); diff --git a/gcc/passes.c b/gcc/passes.c index 2408668c0830..f146670efd1c 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -844,7 +844,8 @@ do_per_function (void (*callback) (void *data), void *data) { struct cgraph_node *node; for (node = cgraph_nodes; node; node = node->next) - if (node->analyzed && gimple_has_body_p (node->decl)) + if (node->analyzed && gimple_has_body_p (node->decl) + && (!node->clone_of || node->decl != node->clone_of->decl)) { push_cfun (DECL_STRUCT_FUNCTION (node->decl)); current_function_decl = node->decl; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 56dc2bc11896..e20679a9ba36 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-06-08 Jan Hubicka + + PR debug/39834 + * gcc.dg/torture/pr39834.c + 2009-06-08 Jan Hubicka PR middle-end/40102 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr39834.c b/gcc/testsuite/gcc.c-torture/compile/pr39834.c new file mode 100644 index 000000000000..ecc3977a1f0b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr39834.c @@ -0,0 +1,13 @@ +/* { dg-options "-O1 -Winline" } */ +void quit_mined (); +void bottom_line (); +typedef enum { False, True } FLAG; +inline void +nextfile (FLAG exitiflast) +{ + if (exitiflast) + quit_mined (); + else + bottom_line (); + nextfile (True); +}