diff options
author | Michael Matz <matz@suse.de> | 2009-12-08 13:56:06 +0000 |
---|---|---|
committer | Michael Matz <matz@gcc.gnu.org> | 2009-12-08 13:56:06 +0000 |
commit | 5d7cefe516e70313d60ce9f620eb4eb3f5bfc6f9 (patch) | |
tree | c537ebdbca988616de7016720b46a6181b211688 /gcc/function.c | |
parent | 41a394bbf8d47ae58aad6b9068cd6f0f27cc2f2f (diff) | |
download | gcc-5d7cefe516e70313d60ce9f620eb4eb3f5bfc6f9.zip gcc-5d7cefe516e70313d60ce9f620eb4eb3f5bfc6f9.tar.gz gcc-5d7cefe516e70313d60ce9f620eb4eb3f5bfc6f9.tar.bz2 |
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/gcc/function.c b/gcc/function.c index b8042d0..ac5ba94 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--; } |