aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2004-10-13 13:27:01 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2004-10-13 13:27:01 +0200
commit69d49802885945913a7b5234f2b0f5268f3f9369 (patch)
treefa8170e4b018a7e1d96192ed02d002385003798e /gcc
parent13c62176e5659bb66597ec395d24741eab6970a7 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17724-1.C23
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17724-2.C23
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17724-3.C24
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17724-4.C24
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17724-5.C24
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17724-6.C24
-rw-r--r--gcc/tree-cfg.c20
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;
}