Commit 78422fb1 by Richard Biener Committed by Richard Biener

re PR ipa/60911 (wrong code with -O2 -flto -fipa-pta)

2014-04-25  Richard Biener  <rguenther@suse.de>

	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
parent 9490b8da
2014-04-25 Richard Biener <rguenther@suse.de>
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 <congh@google.com> 2014-04-24 Cong Hou <congh@google.com>
PR tree-optimization/60896 PR tree-optimization/60896
......
...@@ -2039,20 +2039,6 @@ execute_all_ipa_transforms (void) ...@@ -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 /* Check if PASS is explicitly disabled or enabled and return
the gate status. FUNC is the function to be processed, and the gate status. FUNC is the function to be processed, and
GATE_STATUS is the gate status determined by pass manager by GATE_STATUS is the gate status determined by pass manager by
...@@ -2124,8 +2110,26 @@ execute_one_pass (opt_pass *pass) ...@@ -2124,8 +2110,26 @@ execute_one_pass (opt_pass *pass)
Apply all trnasforms first. */ Apply all trnasforms first. */
if (pass->type == SIMPLE_IPA_PASS) if (pass->type == SIMPLE_IPA_PASS)
{ {
struct cgraph_node *node;
bool applied = false; 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) if (applied)
symtab_remove_unreachable_nodes (true, dump_file); symtab_remove_unreachable_nodes (true, dump_file);
/* Restore current_pass. */ /* Restore current_pass. */
......
2014-04-25 Richard Biener <rguenther@suse.de>
PR ipa/60911
* gcc.dg/lto/pr60911_0.c: New testcase.
2014-04-24 Cong Hou <congh@google.com> 2014-04-24 Cong Hou <congh@google.com>
PR tree-optimization/60896 PR tree-optimization/60896
......
// { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment