From e16f01428dec7112931b5de80a37dd1f0328e28c Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 17 Oct 2016 15:19:04 +0200 Subject: [PATCH] Do not merge BBs with a different EH landing pads (PR Backported from mainline 2016-10-13 Martin Liska PR tree-optimization/77943 * g++.dg/tree-ssa/pr77943.C: New test. Backported from mainline 2016-10-13 Martin Liska PR tree-optimization/77943 * tree-ssa-tail-merge.c (merge_stmts_p): Do not merge BBs with a different EH landing pads. From-SVN: r241240 --- gcc/ChangeLog | 9 +++++++++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/tree-ssa/pr77943.C | 25 +++++++++++++++++++++++++ gcc/tree-ssa-tail-merge.c | 6 ++++++ 4 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr77943.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8317108bfb62..fd9138d1c6e8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-10-17 Martin Liska + + Backported from mainline + 2016-10-13 Martin Liska + + PR tree-optimization/77943 + * tree-ssa-tail-merge.c (merge_stmts_p): Do not merge BBs with + a different EH landing pads. + 2016-10-16 Eric Botcazou * config/sparc/sparc.c (sparc_expand_vector_init): Only accept literal diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3432792aa177..f4f957203edf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-10-17 Martin Liska + + Backported from mainline + 2016-10-13 Martin Liska + + PR tree-optimization/77943 + * g++.dg/tree-ssa/pr77943.C: New test. + 2016-10-15 Eric Botcazou * gcc.target/sparc/bmaskbshuf.c: Rename to... diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr77943.C b/gcc/testsuite/g++.dg/tree-ssa/pr77943.C new file mode 100644 index 000000000000..ef7954a98d2b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr77943.C @@ -0,0 +1,25 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -std=c++11" } */ + +void thrower[[gnu::noinline]]() { + throw 1; +} + +inline void fatal() noexcept {thrower();} +inline void notFatal() {thrower();} + +void func(bool callFatal) { + if (callFatal) { + fatal(); + } else { + notFatal(); + } +} + +int main(int argc, const char* argv[]) { + try { + bool callFatal = argc > 1; + func(callFatal); + } catch (...) { + } +} diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index 6b4b589330dd..adcd9d42e90c 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -237,6 +237,7 @@ along with GCC; see the file COPYING3. If not see #include "trans-mem.h" #include "stringpool.h" #include "tree-ssanames.h" +#include "tree-eh.h" /* Describes a group of bbs with the same successors. The successor bbs are cached in succs, and the successor edge flags are cached in succ_flags. @@ -1273,6 +1274,11 @@ find_duplicate (same_succ same_succ, basic_block bb1, basic_block bb2) || is_tm_ending (stmt2)) return; + /* Verify EH landing pads. */ + if (lookup_stmt_eh_lp_fn (cfun, stmt1) + != lookup_stmt_eh_lp_fn (cfun, stmt2)) + return; + if (!gimple_equal_p (same_succ, stmt1, stmt2)) return; -- 2.47.2