diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-11-28 22:02:27 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-11-28 22:02:27 +0100 |
commit | 99d8763e19ee7949d3afee72f07612ebb3bf37f8 (patch) | |
tree | bb8a862dbfe8dc6771f668944332fe22797539f2 /gcc/tree-eh.c | |
parent | 62bad7cd053b0f139bb46ae54976ed97d6dc0811 (diff) | |
download | gcc-99d8763e19ee7949d3afee72f07612ebb3bf37f8.zip gcc-99d8763e19ee7949d3afee72f07612ebb3bf37f8.tar.gz gcc-99d8763e19ee7949d3afee72f07612ebb3bf37f8.tar.bz2 |
re PR tree-optimization/50682 (ICE: SIGSEGV in main_block_label with -O2 -fnon-call-exceptions -ftracer)
PR tree-optimization/50682
* tree-eh.c (maybe_remove_unreachable_handlers): New function.
* tree-flow.h (maybe_remove_unreachable_handlers): New prototype.
* tree-optimize.c (execute_cleanup_cfg_post_optimizing): Call it.
* g++.dg/opt/pr50682.C: New test.
From-SVN: r181785
Diffstat (limited to 'gcc/tree-eh.c')
-rw-r--r-- | gcc/tree-eh.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 440ac0f..5faeefe 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -3473,6 +3473,29 @@ remove_unreachable_handlers (void) #endif } +/* Remove unreachable handlers if any landing pads have been removed after + last ehcleanup pass (due to gimple_purge_dead_eh_edges). */ + +void +maybe_remove_unreachable_handlers (void) +{ + eh_landing_pad lp; + int i; + + if (cfun->eh == NULL) + return; + + for (i = 1; VEC_iterate (eh_landing_pad, cfun->eh->lp_array, i, lp); ++i) + if (lp && lp->post_landing_pad) + { + if (label_to_block (lp->post_landing_pad) == NULL) + { + remove_unreachable_handlers (); + return; + } + } +} + /* Remove regions that do not have landing pads. This assumes that remove_unreachable_handlers has already been run, and that we've just manipulated the landing pads since then. */ |