Commit 566f27e4 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/42508 (wrong code with "-O1 -fipa-sra")

	PR tree-optimization/42508
	* tree-sra.c (convert_callers): Check for recursive call
	by comparing cgraph nodes instead of decls.
	(modify_function): Call ipa_modify_formal_parameters also
	on all same_body aliases.

	* g++.dg/opt/pr42508.C: New test.

	* cgraphunit.c (cgraph_materialize_all_clones): Compare
	cgraph nodes when checking for same_body aliases.

From-SVN: r155640
parent 11492349
2010-01-05 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/42508
* tree-sra.c (convert_callers): Check for recursive call
by comparing cgraph nodes instead of decls.
(modify_function): Call ipa_modify_formal_parameters also
on all same_body aliases.
* cgraphunit.c (cgraph_materialize_all_clones): Compare
cgraph nodes when checking for same_body aliases.
2010-01-05 Richard Guenther <rguenther@suse.de> 2010-01-05 Richard Guenther <rguenther@suse.de>
* tree-ssa-pre.c (get_or_alloc_expr_for_name): Avoid redundant * tree-ssa-pre.c (get_or_alloc_expr_for_name): Avoid redundant
......
/* Callgraph based interprocedural optimizations. /* Callgraph based interprocedural optimizations.
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Jan Hubicka Contributed by Jan Hubicka
...@@ -2323,20 +2323,9 @@ cgraph_materialize_all_clones (void) ...@@ -2323,20 +2323,9 @@ cgraph_materialize_all_clones (void)
gimple new_stmt; gimple new_stmt;
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
if (e->callee->same_body) if (cgraph_get_node (decl) == cgraph_get_node (e->callee->decl))
{ /* Don't update call from same body alias to the real function. */
struct cgraph_node *alias; continue;
for (alias = e->callee->same_body;
alias;
alias = alias->next)
if (decl == alias->decl)
break;
/* Don't update call from same body alias to the real
function. */
if (alias)
continue;
}
if (cgraph_dump_file) if (cgraph_dump_file)
{ {
......
2010-01-05 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/42508
* g++.dg/opt/pr42508.C: New test.
2010-01-05 Tobias Burnus <burnus@net-b.de> 2010-01-05 Tobias Burnus <burnus@net-b.de>
PR fortran/41872 PR fortran/41872
......
// PR tree-optimization/42508
// { dg-do run }
// { dg-options "-O1 -fipa-sra" }
extern "C" void abort ();
int v[10], vidx;
struct A
{
A *prev;
int i;
~A()
{
v[vidx++] = i;
delete prev;
}
};
int
main ()
{
A *a1 = new A ();
A *a2 = new A ();
a1->prev = 0;
a1->i = 1;
a2->prev = a1;
a2->i = 2;
delete a2;
if (vidx != 2 || v[0] != 2 || v[1] != 1)
abort ();
return 0;
}
...@@ -3800,8 +3800,11 @@ convert_callers (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments) ...@@ -3800,8 +3800,11 @@ convert_callers (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
for (gsi = gsi_start_bb (this_block); !gsi_end_p (gsi); gsi_next (&gsi)) for (gsi = gsi_start_bb (this_block); !gsi_end_p (gsi); gsi_next (&gsi))
{ {
gimple stmt = gsi_stmt (gsi); gimple stmt = gsi_stmt (gsi);
if (gimple_code (stmt) == GIMPLE_CALL tree call_fndecl;
&& gimple_call_fndecl (stmt) == node->decl) if (gimple_code (stmt) != GIMPLE_CALL)
continue;
call_fndecl = gimple_call_fndecl (stmt);
if (call_fndecl && cgraph_get_node (call_fndecl) == node)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Adjusting recursive call"); fprintf (dump_file, "Adjusting recursive call");
...@@ -3819,6 +3822,11 @@ convert_callers (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments) ...@@ -3819,6 +3822,11 @@ convert_callers (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
static void static void
modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments) modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
{ {
struct cgraph_node *alias;
for (alias = node->same_body; alias; alias = alias->next)
ipa_modify_formal_parameters (alias->decl, adjustments, "ISRA");
/* current_function_decl must be handled last, after same_body aliases,
as following functions will use what it computed. */
ipa_modify_formal_parameters (current_function_decl, adjustments, "ISRA"); ipa_modify_formal_parameters (current_function_decl, adjustments, "ISRA");
scan_function (sra_ipa_modify_expr, sra_ipa_modify_assign, scan_function (sra_ipa_modify_expr, sra_ipa_modify_assign,
replace_removed_params_ssa_names, false, adjustments); replace_removed_params_ssa_names, false, adjustments);
......
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