aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2009-10-01 13:48:24 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2009-10-01 13:48:24 +0200
commit6096017ee3a043a7d813a9291196cd6838338c04 (patch)
tree8886f0e8934210d9bcc586890b5986c4b0124661
parent34f9cdb582eeec5c2f489d9ade0f00d03abc9db5 (diff)
downloadgcc-6096017ee3a043a7d813a9291196cd6838338c04.zip
gcc-6096017ee3a043a7d813a9291196cd6838338c04.tar.gz
gcc-6096017ee3a043a7d813a9291196cd6838338c04.tar.bz2
re PR middle-end/12392 (very long optimized compile)
2009-10-01 Martin Jambor <mjambor@suse.cz> PR middle-end/12392 * tree-sra.c (convert_callers): Do not call compute_inline_parameters on one caller more than once. From-SVN: r152368
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-sra.c14
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2540134..19a52e3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-10-01 Martin Jambor <mjambor@suse.cz>
+
+ PR middle-end/12392
+ * tree-sra.c (convert_callers): Do not call
+ compute_inline_parameters on one caller more than once.
+
2009-10-01 Nick Clifton <nickc@redhat.com>
* config/vax/netbsd-elf.h (NETBSD_CC1_AND_CC1PLUS_SPEC): Define as
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index e5b141f..3922c22 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -3646,6 +3646,7 @@ convert_callers (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
tree old_cur_fndecl = current_function_decl;
struct cgraph_edge *cs;
basic_block this_block;
+ bitmap recomputed_callers = BITMAP_ALLOC (NULL);
for (cs = node->callers; cs; cs = cs->next_caller)
{
@@ -3653,15 +3654,24 @@ convert_callers (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
push_cfun (DECL_STRUCT_FUNCTION (cs->caller->decl));
if (dump_file)
- fprintf (dump_file, "Adjusting call %s -> %s\n",
+ fprintf (dump_file, "Adjusting call (%i -> %i) %s -> %s\n",
+ cs->caller->uid, cs->callee->uid,
cgraph_node_name (cs->caller),
cgraph_node_name (cs->callee));
ipa_modify_call_arguments (cs, cs->call_stmt, adjustments);
- compute_inline_parameters (cs->caller);
pop_cfun ();
}
+
+ for (cs = node->callers; cs; cs = cs->next_caller)
+ if (!bitmap_bit_p (recomputed_callers, cs->caller->uid))
+ {
+ compute_inline_parameters (cs->caller);
+ bitmap_set_bit (recomputed_callers, cs->caller->uid);
+ }
+ BITMAP_FREE (recomputed_callers);
+
current_function_decl = old_cur_fndecl;
FOR_EACH_BB (this_block)
{