diff options
author | Jakub Jelinek <jakub@redhat.com> | 2004-10-13 13:27:01 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2004-10-13 13:27:01 +0200 |
commit | 69d49802885945913a7b5234f2b0f5268f3f9369 (patch) | |
tree | fa8170e4b018a7e1d96192ed02d002385003798e /gcc | |
parent | 13c62176e5659bb66597ec395d24741eab6970a7 (diff) | |
download | gcc-69d49802885945913a7b5234f2b0f5268f3f9369.zip gcc-69d49802885945913a7b5234f2b0f5268f3f9369.tar.gz gcc-69d49802885945913a7b5234f2b0f5268f3f9369.tar.bz2 |
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 <dvorakz@suse.cz>
From-SVN: r88979
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17724-1.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17724-2.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17724-3.C | 24 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17724-4.C | 24 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17724-5.C | 24 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17724-6.C | 24 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 20 |
9 files changed, 178 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 815a79d..d868de4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-10-13 Jakub Jelinek <jakub@redhat.com> + Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/17724 + * tree-cfg.c (tree_purge_dead_eh_edges): Free dominance info. + 2004-10-13 Dorit Naishlos <dorit@il.ibm.com> * rs6000.c (altivec_builtin_mask_for_load): Made static GTY(()). diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 766dcec..d08d005 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2004-10-13 Jakub Jelinek <jakub@redhat.com> + + 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 <jsm@polyomino.org.uk> 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 0000000..79de663 --- /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 0000000..c9c7f2a --- /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 0000000..212ab47 --- /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 0000000..7828a25 --- /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 0000000..5ce3038 --- /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 0000000..f95c4d0 --- /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 2de38f7..293b24e 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; } |