summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-18 15:17:37 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-18 15:17:37 +0000
commit1cf1c684b4582ba7ef4a96050bb7e4d98c0b2ffa (patch)
tree0b9c6efd0afebdf99e231fea3735c3c4b775243a /gcc
parentfe6524b0e7659e243f2e13abf846477f0bf96456 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr46172.c13
-rw-r--r--gcc/tree-vect-loop-manip.c35
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);