aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr46398.c24
-rw-r--r--gcc/tree-ssa-sccvn.c17
4 files changed, 50 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 939e03a..ff1ef62 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-10 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/46398
+ * tree-ssa-sccvn.c (process_scc): Iterate for all PHIs.
+
2010-11-10 Joern Rennecke <amylaar@spamcop.net>
PR target/44760
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 52e7693..e4ae2ac 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,10 +1,16 @@
+2010-11-10 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/46398
+ * gcc.dg/torture/pr46398.c: New testcase.
+
2010-11-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
* gfortran.dg/open_dev_null.f90: New test.
2010-11-09 Jan Hubicka <jh@suse.cz>
- * testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c: Update for loop unrolling.
+ * testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c: Update for loop
+ unrolling.
2010-11-09 Joseph Myers <joseph@codesourcery.com>
diff --git a/gcc/testsuite/gcc.dg/torture/pr46398.c b/gcc/testsuite/gcc.dg/torture/pr46398.c
new file mode 100644
index 0000000..9110bbbb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr46398.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+
+int __attribute__((noinline))
+test (int token)
+{
+ int done = 0;
+ int virtual_p = 0;
+ while (!done)
+ {
+ if (token == 42)
+ virtual_p = 1;
+ else
+ done = 1;
+ }
+ return virtual_p;
+}
+extern void abort (void);
+int
+main()
+{
+ if (test (0) != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 02613aa..994e945 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -3108,9 +3108,20 @@ process_scc (VEC (tree, heap) *scc)
if (VEC_length (tree, scc) == 1)
{
tree use = VEC_index (tree, scc, 0);
- if (!VN_INFO (use)->use_processed)
- visit_use (use);
- return;
+ if (VN_INFO (use)->use_processed)
+ return;
+ /* We need to make sure it doesn't form a cycle itself, which can
+ happen for self-referential PHI nodes. In that case we would
+ end up inserting an expression with VN_TOP operands into the
+ valid table which makes us derive bogus equivalences later.
+ The cheapest way to check this is to assume it for all PHI nodes. */
+ if (gimple_code (SSA_NAME_DEF_STMT (use)) == GIMPLE_PHI)
+ /* Fallthru to iteration. */ ;
+ else
+ {
+ visit_use (use);
+ return;
+ }
}
/* Iterate over the SCC with the optimistic table until it stops