+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(()).
+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
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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; }
+}
--- /dev/null
+// 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; }
+}
--- /dev/null
+// 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; }
+}
--- /dev/null
+// 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; }
+}
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;
}