diff options
author | Jakub Jelinek <jakub@redhat.com> | 2003-08-02 01:15:55 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2003-08-02 01:15:55 +0200 |
commit | 5f77fbd46877af98e624b3b799c9ab4d49cc6891 (patch) | |
tree | 9670c06dfea2617837cb65f1ad57954f4d2e1ff7 | |
parent | f4dbf936c77b638c3e61a22cbc4f45f8ae0c0d87 (diff) | |
download | gcc-5f77fbd46877af98e624b3b799c9ab4d49cc6891.zip gcc-5f77fbd46877af98e624b3b799c9ab4d49cc6891.tar.gz gcc-5f77fbd46877af98e624b3b799c9ab4d49cc6891.tar.bz2 |
cfgcleanup.c (outgoing_edges_match): Check REG_EH_REGION notes even if nehedges1 is 0.
* 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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/eh/crossjump1.C | 31 |
4 files changed, 50 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3122423..ef94a7b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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, diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index d03a16d..1937ad0 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fef0f33..3bcb80f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..ccb0ffb --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/crossjump1.C @@ -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 (...) { } +} |