diff options
author | Richard Guenther <rguenther@suse.de> | 2010-11-18 15:17:37 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-11-18 15:17:37 +0000 |
commit | cfaa55890b6f9fb5fde5c84fc51326427dc48259 (patch) | |
tree | 0b9c6efd0afebdf99e231fea3735c3c4b775243a /gcc/tree-vect-loop-manip.c | |
parent | 12c2b0adb1afc982d140aae47be336730e1484b1 (diff) | |
download | gcc-cfaa55890b6f9fb5fde5c84fc51326427dc48259.zip gcc-cfaa55890b6f9fb5fde5c84fc51326427dc48259.tar.gz gcc-cfaa55890b6f9fb5fde5c84fc51326427dc48259.tar.bz2 |
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 <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.
From-SVN: r166908
Diffstat (limited to 'gcc/tree-vect-loop-manip.c')
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index f006182..eb7eada 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); |