aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2016-10-13 12:06:35 +0200
committerMartin Liska <marxin@gcc.gnu.org>2016-10-13 10:06:35 +0000
commit27947670631d8a44fd8c2984da601154b614fa81 (patch)
tree0329ecc6fcb3f9d33cdd52bdf732c067b11528d4
parent3e0c9334e9f766749d1661745b320860ae4827ef (diff)
downloadgcc-27947670631d8a44fd8c2984da601154b614fa81.zip
gcc-27947670631d8a44fd8c2984da601154b614fa81.tar.gz
gcc-27947670631d8a44fd8c2984da601154b614fa81.tar.bz2
Do not merge BBs with a different EH landing pads (PR
PR tree-optimization/77943 * g++.dg/tree-ssa/pr77943.C: New test. PR tree-optimization/77943 * tree-ssa-tail-merge.c (merge_stmts_p): Do not merge BBs with a different EH landing pads. From-SVN: r241090
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr77943.C25
-rw-r--r--gcc/tree-ssa-tail-merge.c5
4 files changed, 41 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 843d06a..6b43103 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-10-13 Martin Liska <mliska@suse.cz>
+
+ PR tree-optimization/77943
+ * tree-ssa-tail-merge.c (merge_stmts_p): Do not merge BBs with
+ a different EH landing pads.
+
2016-10-13 Jakub Jelinek <jakub@redhat.com>
PR target/77957
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e5c3e63..c059a1d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-10-13 Martin Liska <mliska@suse.cz>
+
+ PR tree-optimization/77943
+ * g++.dg/tree-ssa/pr77943.C: New test.
+
2016-10-13 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/72832
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 0000000..ef7954a
--- /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 5e815ec..c292ee7 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -204,6 +204,7 @@ along with GCC; see the file COPYING3. If not see
#include "params.h"
#include "tree-ssa-sccvn.h"
#include "cfgloop.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.
@@ -1222,6 +1223,10 @@ merge_stmts_p (gimple *stmt1, gimple *stmt2)
if (is_tm_ending (stmt1))
return false;
+ /* Verify EH landing pads. */
+ if (lookup_stmt_eh_lp_fn (cfun, stmt1) != lookup_stmt_eh_lp_fn (cfun, stmt2))
+ return false;
+
if (is_gimple_call (stmt1)
&& gimple_call_internal_p (stmt1))
switch (gimple_call_internal_fn (stmt1))