From 69d49802885945913a7b5234f2b0f5268f3f9369 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 13 Oct 2004 13:27:01 +0200 Subject: [PATCH] re PR tree-optimization/17724 (wrong dominator (eh/fold all builtins) related) PR tree-optimization/17724 * tree-cfg.c (tree_purge_dead_eh_edges): Free dominance info. * g++.dg/opt/pr17724-1.C: New test. * g++.dg/opt/pr17724-2.C: New test. * g++.dg/opt/pr17724-3.C: New test. * g++.dg/opt/pr17724-4.C: New test. * g++.dg/opt/pr17724-5.C: New test. * g++.dg/opt/pr17724-6.C: New test. Co-Authored-By: Zdenek Dvorak From-SVN: r88979 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 10 ++++++++++ gcc/testsuite/g++.dg/opt/pr17724-1.C | 23 +++++++++++++++++++++++ gcc/testsuite/g++.dg/opt/pr17724-2.C | 23 +++++++++++++++++++++++ gcc/testsuite/g++.dg/opt/pr17724-3.C | 24 ++++++++++++++++++++++++ gcc/testsuite/g++.dg/opt/pr17724-4.C | 24 ++++++++++++++++++++++++ gcc/testsuite/g++.dg/opt/pr17724-5.C | 24 ++++++++++++++++++++++++ gcc/testsuite/g++.dg/opt/pr17724-6.C | 24 ++++++++++++++++++++++++ gcc/tree-cfg.c | 20 ++++++++++++++++++++ 9 files changed, 178 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/pr17724-1.C create mode 100644 gcc/testsuite/g++.dg/opt/pr17724-2.C create mode 100644 gcc/testsuite/g++.dg/opt/pr17724-3.C create mode 100644 gcc/testsuite/g++.dg/opt/pr17724-4.C create mode 100644 gcc/testsuite/g++.dg/opt/pr17724-5.C create mode 100644 gcc/testsuite/g++.dg/opt/pr17724-6.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 815a79d7000..d868de44cbc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-10-13 Jakub Jelinek + Zdenek Dvorak + + PR tree-optimization/17724 + * tree-cfg.c (tree_purge_dead_eh_edges): Free dominance info. + 2004-10-13 Dorit Naishlos * rs6000.c (altivec_builtin_mask_for_load): Made static GTY(()). diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 766dcecec23..d08d00545e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2004-10-13 Jakub Jelinek + + PR tree-optimization/17724 + * g++.dg/opt/pr17724-1.C: New test. + * g++.dg/opt/pr17724-2.C: New test. + * g++.dg/opt/pr17724-3.C: New test. + * g++.dg/opt/pr17724-4.C: New test. + * g++.dg/opt/pr17724-5.C: New test. + * g++.dg/opt/pr17724-6.C: New test. + 2004-10-12 Joseph S. Myers PR c/17301 diff --git a/gcc/testsuite/g++.dg/opt/pr17724-1.C b/gcc/testsuite/g++.dg/opt/pr17724-1.C new file mode 100644 index 00000000000..79de663b296 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-1.C @@ -0,0 +1,23 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +namespace N { char *strcpy (char *, const char *); } +extern "C" char *strcpy (char *, const char *) throw (); +inline char *N::strcpy (char *s, const char *t) { return ::strcpy (s, t); } + +struct S { ~S (); }; +int foo (); + +int +main () +{ + S s; + int a; + char b[64]; + N::strcpy (b, "ABCDEFGHIJKLM"); + while ((a = foo ()) != -1) + if (a) + return -1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-2.C b/gcc/testsuite/g++.dg/opt/pr17724-2.C new file mode 100644 index 00000000000..c9c7f2a40fb --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-2.C @@ -0,0 +1,23 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +namespace N { char *strcpy (char *, const char *); } +extern "C" char *strcpy (char *, const char *); +inline char *N::strcpy (char *s, const char *t) { return ::strcpy (s, t); } + +struct S { ~S (); }; +int foo (); + +int +main () +{ + S s; + int a; + char b[64]; + N::strcpy (b, "ABCDEFGHIJKLM"); + while ((a = foo ()) != -1) + if (a) + return -1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-3.C b/gcc/testsuite/g++.dg/opt/pr17724-3.C new file mode 100644 index 00000000000..212ab477077 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-3.C @@ -0,0 +1,24 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +extern "C" char *strcpy (char* d, const char* s) throw (); + +class A { public: A (); ~A (); }; + +inline char * B (char *s, const char *t) +{ return ::strcpy (s, t); } + +class C { int D (void); int E; }; + +int C::D (void) +{ + A a; + try + { + char z[22]; + if (this->E) B (z, ""); + return 0; + } + catch (int &f) { return -1; } +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-4.C b/gcc/testsuite/g++.dg/opt/pr17724-4.C new file mode 100644 index 00000000000..7828a25e730 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-4.C @@ -0,0 +1,24 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +extern "C" char *strcpy (char* d, const char* s); + +class A { public: A (); ~A (); }; + +inline char * B (char *s, const char *t) +{ return ::strcpy (s, t); } + +class C { int D (void); int E; }; + +int C::D (void) +{ + A a; + try + { + char z[22]; + if (this->E) B (z, ""); + return 0; + } + catch (int &f) { return -1; } +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-5.C b/gcc/testsuite/g++.dg/opt/pr17724-5.C new file mode 100644 index 00000000000..5ce303856db --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-5.C @@ -0,0 +1,24 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +extern char *strcpy (char* d, const char* s) throw (); + +class A { public: A (); ~A (); }; + +inline char * B (char *s, const char *t) +{ return ::strcpy (s, t); } + +class C { int D (void); int E; }; + +int C::D (void) +{ + A a; + try + { + char z[22]; + if (this->E) B (z, ""); + return 0; + } + catch (int &f) { return -1; } +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-6.C b/gcc/testsuite/g++.dg/opt/pr17724-6.C new file mode 100644 index 00000000000..f95c4d0efbb --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-6.C @@ -0,0 +1,24 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +extern char *strcpy (char* d, const char* s); + +class A { public: A (); ~A (); }; + +inline char * B (char *s, const char *t) +{ return ::strcpy (s, t); } + +class C { int D (void); int E; }; + +int C::D (void) +{ + A a; + try + { + char z[22]; + if (this->E) B (z, ""); + return 0; + } + catch (int &f) { return -1; } +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 2de38f7692e..293b24e1957 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -5016,6 +5016,26 @@ tree_purge_dead_eh_edges (basic_block bb) ei_next (&ei); } + /* Removal of dead EH edges might change dominators of not + just immediate successors. E.g. when bb1 is changed so that + it no longer can throw and bb1->bb3 and bb1->bb4 are dead + eh edges purged by this function in: + 0 + / \ + v v + 1-->2 + / \ | + v v | + 3-->4 | + \ v + --->5 + | + - + idom(bb5) must be recomputed. For now just free the dominance + info. */ + if (changed) + free_dominance_info (CDI_DOMINATORS); + return changed; }