From 93d15c33318942014feda60caa687a96ecea2499 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 28 Nov 2007 20:48:19 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/20071128-1.c | 24 ++++++++++++++++++++++++ gcc/tree-if-conv.c | 10 +++++++++- 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20071128-1.c 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 + + 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 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 + + PR tree-optimization/34140 + * gcc.c-torture/compile/20071128-1.c: New test. + 2007-11-27 Jerry DeLisle 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 */ + +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) -- 2.7.4