Hi.

Following patch adds code that is already present in IPA ICF.
Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.

Ready to be installed?
Martin
>From 542c318af84ca561661b42baca3da7c340971dd8 Mon Sep 17 00:00:00 2001
From: marxin <mli...@suse.cz>
Date: Wed, 12 Oct 2016 16:38:31 +0200
Subject: [PATCH] Do not merge BBs with a different EH landing pads (PR
 tree-optimization/77943)

gcc/testsuite/ChangeLog:

2016-10-12  Martin Liska  <mli...@suse.cz>

	PR tree-optimization/77943
	* g++.dg/tree-ssa/pr77943.C: New test.

gcc/ChangeLog:

2016-10-12  Martin Liska  <mli...@suse.cz>

	PR tree-optimization/77943
	* tree-ssa-tail-merge.c (merge_stmts_p): Do not merge BBs with
	a different EH landing pads.
---
 gcc/testsuite/g++.dg/tree-ssa/pr77943.C | 25 +++++++++++++++++++++++++
 gcc/tree-ssa-tail-merge.c               |  5 +++++
 2 files changed, 30 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr77943.C

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))
-- 
2.9.2

Reply via email to