From cfaa55890b6f9fb5fde5c84fc51326427dc48259 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 18 Nov 2010 15:17:37 +0000 Subject: [PATCH] re PR tree-optimization/46172 (ICE: in expand_widen_pattern_expr, at optabs.c:522 with -ftree-vectorize -fno-tree-dce) 2010-11-18 Richard Guenther PR tree-optimization/46172 * tree-vect-loop-manip.c (remove_dead_stmts_from_loop): New function. (slpeel_tree_peel_loop_to_edge): Call it. * gcc.dg/torture/pr46172.c: New testcase. From-SVN: r166908 --- gcc/ChangeLog | 7 ++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/torture/pr46172.c | 13 ++++++++++ gcc/tree-vect-loop-manip.c | 35 ++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr46172.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1fbec11aef52..7aa714c802f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-18 Richard Guenther + + PR tree-optimization/46172 + * tree-vect-loop-manip.c (remove_dead_stmts_from_loop): New + function. + (slpeel_tree_peel_loop_to_edge): Call it. + 2010-11-18 Jeff Law PR middle-end-optimization/46297 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3a6e36a3fe19..9eace4d767ac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-18 Richard Guenther + + PR tree-optimization/46172 + * gcc.dg/torture/pr46172.c: New testcase. + 2010-11-18 Jeff Law PR middle-end-optimization/46297 diff --git a/gcc/testsuite/gcc.dg/torture/pr46172.c b/gcc/testsuite/gcc.dg/torture/pr46172.c new file mode 100644 index 000000000000..c8d1b4759678 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr46172.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-tree-dce -ftree-vectorize" } */ + +extern short X[]; + +int foo (int len) +{ + int i; + int s = 0; + for (i = 0; i < len; i++) + s += X[i] * X[i]; + return s; +} diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index f006182f1ade..eb7eada03c0c 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -1107,6 +1107,34 @@ set_prologue_iterations (basic_block bb_before_first_loop, } +/* Remove dead assignments from loop NEW_LOOP. */ + +static void +remove_dead_stmts_from_loop (struct loop *new_loop) +{ + basic_block *bbs = get_loop_body (new_loop); + unsigned i; + for (i = 0; i < new_loop->num_nodes; ++i) + { + gimple_stmt_iterator gsi; + for (gsi = gsi_start_bb (bbs[i]); !gsi_end_p (gsi);) + { + gimple stmt = gsi_stmt (gsi); + if (is_gimple_assign (stmt) + && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME + && has_zero_uses (gimple_assign_lhs (stmt))) + { + gsi_remove (&gsi, true); + release_defs (stmt); + } + else + gsi_next (&gsi); + } + } + free (bbs); +} + + /* Function slpeel_tree_peel_loop_to_edge. Peel the first (last) iterations of LOOP into a new prolog (epilog) loop @@ -1415,6 +1443,13 @@ slpeel_tree_peel_loop_to_edge (struct loop *loop, if (update_first_loop_count) slpeel_make_loop_iterate_ntimes (first_loop, first_niters); + /* Remove all pattern statements from the loop copy. They will confuse + the expander if DCE is disabled. + ??? The pattern recognizer should be split into an analysis and + a transformation phase that is then run only on the loop that is + going to be transformed. */ + remove_dead_stmts_from_loop (new_loop); + adjust_vec_debug_stmts (); BITMAP_FREE (definitions);