aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2009-12-08 13:56:06 +0000
committerMichael Matz <matz@gcc.gnu.org>2009-12-08 13:56:06 +0000
commit5d7cefe516e70313d60ce9f620eb4eb3f5bfc6f9 (patch)
treec537ebdbca988616de7016720b46a6181b211688 /gcc
parent41a394bbf8d47ae58aad6b9068cd6f0f27cc2f2f (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/function.c22
2 files changed, 24 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 22fd5cc..186fe58 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2009-12-08 Michael Matz <matz@suse.de>
+
+ 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 <olga@il.ibm.com>
PR middle-end/41843
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--;
}