diff options
author | Steven Bosscher <stevenb@suse.de> | 2004-06-04 12:31:26 +0000 |
---|---|---|
committer | Steven Bosscher <steven@gcc.gnu.org> | 2004-06-04 12:31:26 +0000 |
commit | f698d2175aa01ae5be342ac6ea6d09366b8b36a4 (patch) | |
tree | e04c020e220e3d0c79856e9ab76432e2e9ba87ed /gcc/tree-cfg.c | |
parent | 72fab006113a72f011e261cb291602195726f7d5 (diff) | |
download | gcc-f698d2175aa01ae5be342ac6ea6d09366b8b36a4.zip gcc-f698d2175aa01ae5be342ac6ea6d09366b8b36a4.tar.gz gcc-f698d2175aa01ae5be342ac6ea6d09366b8b36a4.tar.bz2 |
except.c (for_each_eh_region): New function.
* except.c (for_each_eh_region): New function.
* except.h (for_each_eh_region): Add a prototype for it.
* tree-cfg.c (update_eh_labels): New function, callback for
for_each_eh_region.
(label_for_bb): Make global static, unfortunately.
(cleanup_dead_labels): Also update label references for
exception regions.
From-SVN: r82622
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 21277d8..d6823cb 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -762,13 +762,38 @@ cleanup_tree_cfg (void) } -/* Cleanup useless labels from the flow graph. */ +/* Cleanup useless labels in basic blocks. This is something we wish + to do early because it allows us to group case labels before creating + the edges for the CFG, and it speeds up block statement iterators in + all passes later on. + We only run this pass once, running it more than once is probably not + profitable. */ + +/* A map from basic block index to the leading label of that block. */ +static tree *label_for_bb; + +/* Callback for for_each_eh_region. Helper for cleanup_dead_labels. */ +static void +update_eh_label (struct eh_region *region) +{ + tree old_label = get_eh_region_tree_label (region); + if (old_label) + { + tree new_label = label_for_bb[label_to_block (old_label)->index]; + set_eh_region_tree_label (region, new_label); + } +} + +/* Cleanup redundant labels. This is a three-steo process: + 1) Find the leading label for each block. + 2) Redirect all references to labels to the leading labels. + 3) Cleanup all useless labels. */ static void cleanup_dead_labels (void) { basic_block bb; - tree *label_for_bb = xcalloc (last_basic_block, sizeof (tree)); + label_for_bb = xcalloc (last_basic_block, sizeof (tree)); /* Find a suitable label for each block. We use the first user-defined label is there is one, or otherwise just the first label we see. */ @@ -805,7 +830,8 @@ cleanup_dead_labels (void) } } - /* Now redirect all jumps/branches to the selected label for each block. */ + /* Now redirect all jumps/branches to the selected label. + First do so for each block ending in a control statement. */ FOR_EACH_BB (bb) { tree stmt = last_stmt (bb); @@ -864,6 +890,8 @@ cleanup_dead_labels (void) } } + for_each_eh_region (update_eh_label); + /* Finally, purge dead labels. All user-defined labels and labels that can be the target of non-local gotos are preserved. */ FOR_EACH_BB (bb) |