aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-11-28 20:48:19 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-28 20:48:19 +0100
commit93d15c33318942014feda60caa687a96ecea2499 (patch)
treebc3381be110ff36127771fa97b896f92ce969b52
parenteae645b69a75b68ff2e4ccc1ad64bcbca23e3073 (diff)
downloadgcc-93d15c33318942014feda60caa687a96ecea2499.zip
gcc-93d15c33318942014feda60caa687a96ecea2499.tar.gz
gcc-93d15c33318942014feda60caa687a96ecea2499.tar.bz2
re PR tree-optimization/34140 (ICE in is_hidden_global_store, at tree-ssa-sink.c:207)
PR tree-optimization/34140 * tree-if-conv.c (if_convertible_phi_p): Fail if BB other than loop->header has virtual phi nodes. * gcc.c-torture/compile/20071128-1.c: New test. From-SVN: r130494
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20071128-1.c24
-rw-r--r--gcc/tree-if-conv.c10
4 files changed, 44 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 34f3453..c57bc49 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-28 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/34140
+ * tree-if-conv.c (if_convertible_phi_p): Fail if BB other than
+ loop->header has virtual phi nodes.
+
2007-11-28 Richard Sandiford <rsandifo@nildram.co.uk>
PR target/32406
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b8ee3a3..b1a58b8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-28 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/34140
+ * gcc.c-torture/compile/20071128-1.c: New test.
+
2007-11-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/32928
diff --git a/gcc/testsuite/gcc.c-torture/compile/20071128-1.c b/gcc/testsuite/gcc.c-torture/compile/20071128-1.c
new file mode 100644
index 0000000..14b3f93
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20071128-1.c
@@ -0,0 +1,24 @@
+/* PR tree-optimization/34140 */
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+
+struct S
+{
+ unsigned int s;
+};
+struct T
+{
+ struct S t[2];
+ unsigned int u : 1;
+};
+
+void
+foo (int x, int y, int z)
+{
+ int i;
+ struct T t;
+
+ t.u = t.u;
+ for (i = 0; i < x; i++)
+ if (z != 1)
+ t.t[i].s = y || t.u;
+}
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 324fc93..ec34929 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -302,7 +302,8 @@ tree_if_convert_cond_expr (struct loop *loop, tree stmt, tree cond,
and it belongs to basic block BB.
PHI is not if-convertible
- if it has more than 2 arguments.
- - Virtual PHI is immediately used in another PHI node. */
+ - Virtual PHI is immediately used in another PHI node.
+ - Virtual PHI on BB other than header. */
static bool
if_convertible_phi_p (struct loop *loop, basic_block bb, tree phi)
@@ -324,6 +325,13 @@ if_convertible_phi_p (struct loop *loop, basic_block bb, tree phi)
{
imm_use_iterator imm_iter;
use_operand_p use_p;
+
+ if (bb != loop->header)
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, "Virtual phi not on loop header.\n");
+ return false;
+ }
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, PHI_RESULT (phi))
{
if (TREE_CODE (USE_STMT (use_p)) == PHI_NODE)