diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17697-1.C | 32 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17697-2.C | 32 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr17697-3.C | 28 | ||||
-rw-r--r-- | gcc/tree-ssa-ccp.c | 8 |
6 files changed, 113 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95c7d04..96721da 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-09-29 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/17697 + * tree-ssa-ccp.c (execute_fold_all_builtins): Update eh and cleanup + cfg if needed. + 2004-09-28 Per Bothner <per@bothner.com> * profile.c (branch_prob): Pass correct value to output_location, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1b59e73..dd80cf5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2004-09-29 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/17697 + * g++.dg/opt/pr17697-1.C: New test. + * g++.dg/opt/pr17697-2.C: New test. + * g++.dg/opt/pr17697-3.C: New test. + 2004-09-28 Joseph S. Myers <jsm@polyomino.org.uk> PR c/16409 diff --git a/gcc/testsuite/g++.dg/opt/pr17697-1.C b/gcc/testsuite/g++.dg/opt/pr17697-1.C new file mode 100644 index 0000000..0e2f671 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17697-1.C @@ -0,0 +1,32 @@ +// PR tree-optimization/17697 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" +{ + extern int strcmp (const char *s, const char *t) throw () + __attribute__ ((pure)); +} + +namespace A +{ + extern int strcmp (const char *s, const char *t); +} + +inline int +A::strcmp (const char *s, const char *t) +{ + return ::strcmp (s, t); +} + +int +foo (char *x) throw () +{ + return A::strcmp ("", x); +} + +int +main () +{ + return foo ("") != 0 || foo ("a") == 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17697-2.C b/gcc/testsuite/g++.dg/opt/pr17697-2.C new file mode 100644 index 0000000..11def66 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17697-2.C @@ -0,0 +1,32 @@ +// PR tree-optimization/17697 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" +{ + extern int strcmp (const char *s, const char *t) throw () + __attribute__ ((pure)); +} + +namespace A +{ + extern int strcmp (const char *s, const char *t) throw (); +} + +inline int +A::strcmp (const char *s, const char *t) throw () +{ + return ::strcmp (s, t); +} + +int +foo (char *x) throw () +{ + return A::strcmp ("", x); +} + +int +main () +{ + return foo ("") != 0 || foo ("a") == 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17697-3.C b/gcc/testsuite/g++.dg/opt/pr17697-3.C new file mode 100644 index 0000000..b1369d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17697-3.C @@ -0,0 +1,28 @@ +// PR tree-optimization/17697 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" extern int strcmp (const char *s, const char *t); + +namespace A +{ + extern int strcmp (const char *s, const char *t); +} + +inline int +A::strcmp (const char *s, const char *t) +{ + return ::strcmp (s, t); +} + +int +foo (char *x) +{ + return A::strcmp ("", x); +} + +int +main () +{ + return foo ("") != 0 || foo ("a") == 0; +} diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index d3ad956..3e8fa7b 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -2143,6 +2143,7 @@ convert_to_gimple_builtin (block_stmt_iterator *si_p, tree expr) static void execute_fold_all_builtins (void) { + bool cfg_changed = false; basic_block bb; FOR_EACH_BB (bb) { @@ -2187,6 +2188,9 @@ execute_fold_all_builtins (void) abort (); } modify_stmt (*stmtp); + if (maybe_clean_eh_stmt (*stmtp) + && tree_purge_dead_eh_edges (bb)) + cfg_changed = true; if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -2196,6 +2200,10 @@ execute_fold_all_builtins (void) } } } + + /* Delete unreachable blocks. */ + if (cfg_changed) + cleanup_tree_cfg (); } |