aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index 6c3cd56..54985d9 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -645,10 +645,6 @@ update_life_info (blocks, extent, prop_flags)
&& (extent == UPDATE_LIFE_LOCAL || blocks))
abort ();
- /* Clear log links in case we are asked to (re)compute them. */
- if (prop_flags & PROP_LOG_LINKS)
- clear_log_links (blocks);
-
/* For a global update, we go through the relaxation process again. */
if (extent != UPDATE_LIFE_LOCAL)
{
@@ -685,6 +681,10 @@ update_life_info (blocks, extent, prop_flags)
count_or_remove_death_notes (blocks, 1);
}
+ /* Clear log links in case we are asked to (re)compute them. */
+ if (prop_flags & PROP_LOG_LINKS)
+ clear_log_links (blocks);
+
if (blocks)
{
EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i,
@@ -746,6 +746,31 @@ update_life_info (blocks, extent, prop_flags)
? TV_LIFE_UPDATE : TV_LIFE);
}
+/* Update life information in all blocks where BB_DIRTY is set. */
+
+void
+update_life_info_in_dirty_blocks (extent, prop_flags)
+ enum update_life_extent extent;
+ int prop_flags;
+{
+ sbitmap update_life_blocks = sbitmap_alloc (n_basic_blocks);
+ int block_num;
+ int n = 0;
+
+ sbitmap_zero (update_life_blocks);
+ for (block_num = 0; block_num < n_basic_blocks; block_num++)
+ if (BASIC_BLOCK (block_num)->flags & BB_DIRTY)
+ {
+ SET_BIT (update_life_blocks, block_num);
+ n++;
+ }
+
+ if (n)
+ update_life_info (update_life_blocks, extent, prop_flags);
+
+ sbitmap_free (update_life_blocks);
+}
+
/* Free the variables allocated by find_basic_blocks.
KEEP_HEAD_END_P is non-zero if basic_block_info is not to be freed. */