cfgcleanup.c (outgoing_edges_match): Check REG_EH_REGION notes even if nehedges1...
authorJakub Jelinek <jakub@redhat.com>
Fri, 1 Aug 2003 23:15:55 +0000 (01:15 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 1 Aug 2003 23:15:55 +0000 (01:15 +0200)
* cfgcleanup.c (outgoing_edges_match): Check REG_EH_REGION notes
even if nehedges1 is 0.

* g++.dg/eh/crossjump1.C: New test.

From-SVN: r70080

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/eh/crossjump1.C [new file with mode: 0644]

index 3122423..ef94a7b 100644 (file)
@@ -1,3 +1,8 @@
+2003-08-01  Jakub Jelinek  <jakub@redhat.com>
+
+       * cfgcleanup.c (outgoing_edges_match): Check REG_EH_REGION notes
+       even if nehedges1 is 0.
+
 2003-08-01  Nathanael Nerode  <neroden@gcc.gnu.org>
 
        * fixinc/fixfixes.c, fixinc/fixlib.c, fixinc/fixlib.h,
index d03a16d..1937ad0 100644 (file)
@@ -1337,15 +1337,17 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
        return false;
     }
 
-  /* In case we do have EH edges, ensure we are in the same region.  */
-  if (nehedges1)
-    {
-      rtx n1 = find_reg_note (bb1->end, REG_EH_REGION, 0);
-      rtx n2 = find_reg_note (bb2->end, REG_EH_REGION, 0);
+  /* Ensure the same EH region.  */
+  {
+    rtx n1 = find_reg_note (bb1->end, REG_EH_REGION, 0);
+    rtx n2 = find_reg_note (bb2->end, REG_EH_REGION, 0);
 
-      if (XEXP (n1, 0) != XEXP (n2, 0))
-       return false;
-    }
+    if (!n1 && n2)
+      return false;
+
+    if (n1 && (!n2 || XEXP (n1, 0) != XEXP (n2, 0)))
+      return false;
+  }
 
   /* We don't need to match the rest of edges as above checks should be enough
      to ensure that they are equivalent.  */
index fef0f33..3bcb80f 100644 (file)
@@ -1,3 +1,7 @@
+2003-08-01  Jakub Jelinek  <jakub@redhat.com>
+
+       * g++.dg/eh/crossjump1.C: New test.
+
 2003-08-01  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/11697
diff --git a/gcc/testsuite/g++.dg/eh/crossjump1.C b/gcc/testsuite/g++.dg/eh/crossjump1.C
new file mode 100644 (file)
index 0000000..ccb0ffb
--- /dev/null
@@ -0,0 +1,31 @@
+// This testcase failed on s390, because cross-jumping merged 2 calls,
+// one with REG_EH_REGION note with no handlers (ie. termination)
+// and one without REG_EH_REGION note.
+// { dg-do run }
+// { dg-options "-O2" }
+
+#include <exception>
+#include <string>
+
+struct E : public std::exception
+{
+  std::string m;
+  E () : m ("test") { }
+  ~E () throw() { }
+};
+
+struct C : public E { };
+
+void foo ()
+{
+  throw C ();
+}
+
+int main ()
+{
+  try
+    {
+      foo ();
+    }
+  catch (...) { }
+}