From: Michael Matz Date: Tue, 8 Dec 2009 13:56:06 +0000 (+0000) Subject: re PR middle-end/38474 (compile time explosion in dataflow_set_preserve_mem_locs... X-Git-Tag: releases/gcc-4.5.0~1733 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5d7cefe516e70313d60ce9f620eb4eb3f5bfc6f9;p=thirdparty%2Fgcc.git re PR middle-end/38474 (compile time explosion in dataflow_set_preserve_mem_locs at -O3) PR middle-end/38474 * function.c (free_temp_slots): Only walk the temp slot addresses and combine slots if we actually changes something. (pop_temp_slots): Ditto. From-SVN: r155087 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 22fd5cce7839..186fe581d47b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-12-08 Michael Matz + + PR middle-end/38474 + * function.c (free_temp_slots): Only walk the temp slot + addresses and combine slots if we actually changes something. + (pop_temp_slots): Ditto. + 2009-12-08 Olga Golovanevsky PR middle-end/41843 diff --git a/gcc/function.c b/gcc/function.c index b8042d085518..ac5ba94f9d1a 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -1164,17 +1164,24 @@ void free_temp_slots (void) { struct temp_slot *p, *next; + bool some_available = false; for (p = *temp_slots_at_level (temp_slot_level); p; p = next) { next = p->next; if (!p->keep) - make_slot_available (p); + { + make_slot_available (p); + some_available = true; + } } - remove_unused_temp_slot_addresses (); - combine_temp_slots (); + if (some_available) + { + remove_unused_temp_slot_addresses (); + combine_temp_slots (); + } } /* Push deeper into the nesting level for stack temporaries. */ @@ -1192,15 +1199,20 @@ void pop_temp_slots (void) { struct temp_slot *p, *next; + bool some_available = false; for (p = *temp_slots_at_level (temp_slot_level); p; p = next) { next = p->next; make_slot_available (p); + some_available = true; } - remove_unused_temp_slot_addresses (); - combine_temp_slots (); + if (some_available) + { + remove_unused_temp_slot_addresses (); + combine_temp_slots (); + } temp_slot_level--; }