From 6c5ed3f18ce31e71dc1089e8298c70fd2a0a08c2 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 21 Jan 2015 22:51:43 +0100 Subject: [PATCH] re PR rtl-optimization/62078 (ICE: verify_flow_info failed: missing REG_EH_REGION note at the end of bb 2 with -fdelete-dead-exceptions) PR rtl-optimization/62078 * dse.c: Include cfgcleanup.h. (rest_of_handle_dse): For -fnon-call-exceptions, if DSE removed anything call purge_all_dead_edges and cleanup_cfg at the end of the pass. * g++.dg/opt/pr62078.C: New test. From-SVN: r219970 --- gcc/ChangeLog | 8 +++++++ gcc/dse.c | 9 ++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/opt/pr62078.C | 36 ++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/pr62078.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f3cc89fae6..af86a4d7993 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-01-21 Jakub Jelinek + + PR rtl-optimization/62078 + * dse.c: Include cfgcleanup.h. + (rest_of_handle_dse): For -fnon-call-exceptions, if DSE removed + anything call purge_all_dead_edges and cleanup_cfg at the end + of the pass. + 2015-01-21 Jan Hubicka * ipa-utils.c (ipa_merge_profiles): Avoid ICE on mismatch in indirect diff --git a/gcc/dse.c b/gcc/dse.c index a7d46b85dc4..ea6f24585c5 100644 --- a/gcc/dse.c +++ b/gcc/dse.c @@ -81,6 +81,7 @@ along with GCC; see the file COPYING3. If not see #include "gimple.h" #include "gimple-ssa.h" #include "rtl-iter.h" +#include "cfgcleanup.h" /* This file contains three techniques for performing Dead Store Elimination (dse). @@ -3746,6 +3747,14 @@ rest_of_handle_dse (void) if (dump_file) fprintf (dump_file, "dse: local deletions = %d, global deletions = %d, spill deletions = %d\n", locally_deleted, globally_deleted, spill_deleted); + + /* DSE can eliminate potentially-trapping MEMs. + Remove any EH edges associated with them. */ + if ((locally_deleted || globally_deleted) + && cfun->can_throw_non_call_exceptions + && purge_all_dead_edges ()) + cleanup_cfg (0); + return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 784ce467f86..057f0ca297d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2015-01-21 Jakub Jelinek + PR rtl-optimization/62078 + * g++.dg/opt/pr62078.C: New test. + PR c/63307 * c-c++-common/cilk-plus/CK/pr63307.c: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr62078.C b/gcc/testsuite/g++.dg/opt/pr62078.C new file mode 100644 index 00000000000..8730432d3b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr62078.C @@ -0,0 +1,36 @@ +/* PR rtl-optimization/62078 */ +/* { dg-do compile } */ +/* { dg-options "-Og -fdelete-dead-exceptions -fnon-call-exceptions" } */ + +struct A { virtual ~A (); }; +struct B : A {}; +struct C : B {}; +struct D : C {}; +struct E : D {}; +struct F : E {}; +struct G : F {}; +struct H : G {}; +struct I : H {}; +struct J : I {}; +struct K : J {}; +struct L : K {}; +struct M : L {}; +struct N : M {}; +struct O : N {}; +struct P : O {}; +struct Q : P {}; +struct R : Q {}; +struct S : R {}; +struct T : S {}; +struct U : T {}; +struct V : U {}; +struct W : V {}; +struct X : W {}; +struct Y : X {}; +struct Z : Y {}; + +void +foo () +{ + Z z; +} -- 2.30.2