From 99d8763e19ee7949d3afee72f07612ebb3bf37f8 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 28 Nov 2011 22:02:27 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr50682.C | 39 ++++++++++++++++++++++++++++++++++++++ gcc/tree-eh.c | 23 ++++++++++++++++++++++ gcc/tree-flow.h | 1 + gcc/tree-optimize.c | 1 + 6 files changed, 76 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/pr50682.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d37a441..a2b33de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-11-28 Jakub Jelinek + + 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. + 2011-11-28 Georg-Johann Lay * doc/extend.texi (AVR Built-in Functions): Add documentation for diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a6a077c..72c3fac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-28 Jakub Jelinek + + PR tree-optimization/50682 + * g++.dg/opt/pr50682.C: New test. + 2011-11-28 Tobias Burnus PR fortran/51308 diff --git a/gcc/testsuite/g++.dg/opt/pr50682.C b/gcc/testsuite/g++.dg/opt/pr50682.C new file mode 100644 index 0000000..b7e91f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr50682.C @@ -0,0 +1,39 @@ +// PR tree-optimization/50682 +// { dg-do compile } +// { dg-options "-O2 -fnon-call-exceptions -ftracer -fno-tree-ccp -fno-tree-copy-prop -fno-tree-dce" } + +void foo () __attribute__ ((__noreturn__)); +int baz (); + +const int & +bar (const int &x, const int &y) +{ + if (x >= y) + return y; + return x; +} + +int a, b; + +struct S +{ + ~S (); + bool m () + { + int l = bar (a, b); + int r = baz (); + if (r) + r = l; + return r; + } +}; + +void +test () +{ + S s; + if (!s.m ()) + foo (); + if (!s.m ()) + foo (); +} 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. */ diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 211c107..ded7a3f 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -789,6 +789,7 @@ extern bool maybe_duplicate_eh_stmt_fn (struct function *, gimple, extern bool maybe_duplicate_eh_stmt (gimple, gimple); extern bool verify_eh_edges (gimple); extern bool verify_eh_dispatch_edge (gimple); +extern void maybe_remove_unreachable_handlers (void); /* In tree-ssa-pre.c */ struct pre_expr_d; diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c index 5479d90..2f6b394 100644 --- a/gcc/tree-optimize.c +++ b/gcc/tree-optimize.c @@ -159,6 +159,7 @@ static unsigned int execute_cleanup_cfg_post_optimizing (void) { cleanup_tree_cfg (); + maybe_remove_unreachable_handlers (); cleanup_dead_labels (); group_case_labels (); if ((flag_compare_debug_opt || flag_compare_debug) -- 2.7.4