From 496a4ef59d7830dbedecb7718cb2b4c0a7377528 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 25 Apr 2009 11:02:05 +0200 Subject: tree-eh.c (tree_remove_unreachable_handlers): Handle shared labels. * tree-eh.c (tree_remove_unreachable_handlers): Handle shared labels. (tree_empty_eh_handler_p): Allow non-EH predecestors; allow region to be reached by different label than left. (update_eh_edges): Update comment; remove edge_to_remove if possible and return true if suceeded. (cleanup_empty_eh): Accept sharing map; handle shared regions. (cleanup_eh): Compute sharing map. * except.c (remove_eh_handler_and_replace): Add argument if we should update regions. (remove_unreachable_regions): Update for label sharing. (label_to_region_map): Likewise. (get_next_region_sharing_label): New function. (remove_eh_handler_and_replace): Add update_catch_try parameter; update prev_try pointers. (remove_eh_handler): Update. (remove_eh_region_and_replace_by_outer_of): New function. * except.h (struct eh_region): Add next_region_sharing_label. (remove_eh_region_and_replace_by_outer_of, get_next_region_sharing_label): Declare. * tree-cfgcleanup.c (tree_forwarder_block_p): Simplify. * tree-cfg.c (split_critical_edges): Split also edges where we can't insert code even if they are not critical. * tree-cfg.c (gimple_can_merge_blocks_p): EH edges are unmergable. (gimple_can_remove_branch_p): EH edges won't remove branch by redirection. * tree-inline.c (update_ssa_across_abnormal_edges): Do handle updating of non-abnormal EH edges. * tree-cfg.c (gimple_can_merge_blocks_p): EH edges are unmergable. (gimple_can_remove_branch_p): EH edges are unremovable by redirection. (split_critical_edges): Split also edges where emitting code on them will lead to splitting later. From-SVN: r146763 --- gcc/except.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'gcc/except.h') diff --git a/gcc/except.h b/gcc/except.h index ba75d30..14a263a 100644 --- a/gcc/except.h +++ b/gcc/except.h @@ -34,6 +34,9 @@ struct GTY(()) eh_region struct eh_region *inner; struct eh_region *next_peer; + /* List of regions sharing label. */ + struct eh_region *next_region_sharing_label; + /* An identifier for this region. */ int region_number; @@ -155,7 +158,8 @@ extern void init_eh (void); extern void init_eh_for_function (void); extern rtx reachable_handlers (rtx); -void remove_eh_region (int); +extern void remove_eh_region (int); +extern void remove_eh_region_and_replace_by_outer_of (int, int); extern void convert_from_eh_region_ranges (void); extern unsigned int convert_to_eh_region_ranges (void); @@ -274,3 +278,4 @@ extern void set_eh_throw_stmt_table (struct function *, struct htab *); extern void remove_unreachable_regions (sbitmap, sbitmap); extern VEC(int,heap) * label_to_region_map (void); extern int num_eh_regions (void); +extern int get_next_region_sharing_label (int); -- cgit v1.1