aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17697-1.C32
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17697-2.C32
-rw-r--r--gcc/testsuite/g++.dg/opt/pr17697-3.C28
-rw-r--r--gcc/tree-ssa-ccp.c8
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 ();
}