diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-18 15:17:37 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-18 15:17:37 +0000 |
commit | 1cf1c684b4582ba7ef4a96050bb7e4d98c0b2ffa (patch) | |
tree | 0b9c6efd0afebdf99e231fea3735c3c4b775243a /gcc | |
parent | fe6524b0e7659e243f2e13abf846477f0bf96456 (diff) | |
download | gcc-1cf1c684b4582ba7ef4a96050bb7e4d98c0b2ffa.tar.gz |
2010-11-18 Richard Guenther <rguenther@suse.de>
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166908 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr46172.c | 13 | ||||
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 35 |
4 files changed, 60 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1fbec11aef5..7aa714c802f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-18 Richard Guenther <rguenther@suse.de> + + 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 <law@redhat.com> PR middle-end-optimization/46297 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3a6e36a3fe1..9eace4d767a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-18 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/46172 + * gcc.dg/torture/pr46172.c: New testcase. + 2010-11-18 Jeff Law <law@redhat.com> 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 00000000000..c8d1b475967 --- /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 f006182f1ad..eb7eada03c0 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); |