aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-eh.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-11-28 22:02:27 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-11-28 22:02:27 +0100
commit99d8763e19ee7949d3afee72f07612ebb3bf37f8 (patch)
treebb8a862dbfe8dc6771f668944332fe22797539f2 /gcc/tree-eh.c
parent62bad7cd053b0f139bb46ae54976ed97d6dc0811 (diff)
downloadgcc-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.c23
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. */