From 78422fb13c3f57b962d4c6cff7a9493ea3b12c14 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 25 Apr 2014 07:44:40 +0000 Subject: [PATCH] re PR ipa/60911 (wrong code with -O2 -flto -fipa-pta) 2014-04-25 Richard Biener PR ipa/60911 * passes.c (apply_ipa_transforms): Inline into only caller ... (execute_one_pass): ... here. Properly bring in function bodies for nodes we want to apply IPA transforms to. * gcc.dg/lto/pr60911_0.c: New testcase. From-SVN: r209779 --- gcc/ChangeLog | 7 ++++++ gcc/passes.c | 34 ++++++++++++++++------------ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/lto/pr60911_0.c | 21 +++++++++++++++++ 4 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/lto/pr60911_0.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3eb5c43f5a5..ec3c2e2f66b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-04-25 Richard Biener + + PR ipa/60911 + * passes.c (apply_ipa_transforms): Inline into only caller ... + (execute_one_pass): ... here. Properly bring in function + bodies for nodes we want to apply IPA transforms to. + 2014-04-24 Cong Hou PR tree-optimization/60896 diff --git a/gcc/passes.c b/gcc/passes.c index 2be7856f29b..fb60fc8fdd6 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -2039,20 +2039,6 @@ execute_all_ipa_transforms (void) } } -/* Callback for do_per_function to apply all IPA transforms. */ - -static void -apply_ipa_transforms (void *data) -{ - struct cgraph_node *node = cgraph_get_node (current_function_decl); - if (!node->global.inlined_to && node->ipa_transforms_to_apply.exists ()) - { - *(bool *)data = true; - execute_all_ipa_transforms (); - rebuild_cgraph_edges (); - } -} - /* Check if PASS is explicitly disabled or enabled and return the gate status. FUNC is the function to be processed, and GATE_STATUS is the gate status determined by pass manager by @@ -2124,8 +2110,26 @@ execute_one_pass (opt_pass *pass) Apply all trnasforms first. */ if (pass->type == SIMPLE_IPA_PASS) { + struct cgraph_node *node; bool applied = false; - do_per_function (apply_ipa_transforms, (void *)&applied); + FOR_EACH_DEFINED_FUNCTION (node) + if (node->analyzed + && cgraph_function_with_gimple_body_p (node) + && (!node->clone_of || node->decl != node->clone_of->decl)) + { + if (!node->global.inlined_to + && node->ipa_transforms_to_apply.exists ()) + { + cgraph_get_body (node); + push_cfun (DECL_STRUCT_FUNCTION (node->decl)); + execute_all_ipa_transforms (); + rebuild_cgraph_edges (); + free_dominance_info (CDI_DOMINATORS); + free_dominance_info (CDI_POST_DOMINATORS); + pop_cfun (); + applied = true; + } + } if (applied) symtab_remove_unreachable_nodes (true, dump_file); /* Restore current_pass. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 01912624d51..6d0fe01b414 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-25 Richard Biener + + PR ipa/60911 + * gcc.dg/lto/pr60911_0.c: New testcase. + 2014-04-24 Cong Hou PR tree-optimization/60896 diff --git a/gcc/testsuite/gcc.dg/lto/pr60911_0.c b/gcc/testsuite/gcc.dg/lto/pr60911_0.c new file mode 100644 index 00000000000..e4820a20497 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr60911_0.c @@ -0,0 +1,21 @@ +// { dg-lto-do run } +// { dg-lto-options { { -O2 -flto -fipa-pta } } } + +int __attribute__ ((__noinline__)) f (unsigned *p, int *x) +{ + int y = *p++ & 0xfff; + *x++ = y; + *x = *p; + return y; +} + +int +main () +{ + unsigned u[2] = { 0x3aad, 0x5ad1 }; + int x[2] = { 17689, 23456 }; + + if (f (u, x) != 0xaad || x[0] != 0xaad || x[1] != 0x5ad1) + __builtin_abort (); + return 0; +}