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
This commit is contained in:
Jakub Jelinek 2004-10-13 13:27:01 +02:00 committed by Jakub Jelinek
parent 13c62176e5
commit 69d4980288
9 changed files with 178 additions and 0 deletions

View File

@ -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(()).

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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;
}