aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr47139.c18
-rw-r--r--gcc/tree-vect-loop.c17
4 files changed, 43 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f23274b..33945a3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-01-06 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/47139
+ * tree-vect-loop.c (vect_is_simple_reduction_1): Check that
+ only the last reduction value is used outside the loop. Update
+ documentation.
+
2011-01-05 Joseph Myers <joseph@codesourcery.com>
* config/rtems.opt: New.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ea5cac7..564be0f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-01-06 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/47139
+ * gcc.dg/vect/pr47139.c: New test.
+
2011-01-05 Janus Weil <janus@gcc.gnu.org>
PR fortran/47180
diff --git a/gcc/testsuite/gcc.dg/vect/pr47139.c b/gcc/testsuite/gcc.dg/vect/pr47139.c
new file mode 100644
index 0000000..9e9c751
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr47139.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+int d;
+
+void
+foo ()
+{
+ int a = 0;
+ unsigned char b;
+ for (b = 1; b; b++)
+ {
+ d = a;
+ a |= b;
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 1dc4ec0..d474688 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -1649,9 +1649,10 @@ report_vect_op (gimple stmt, const char *msg)
1. operation is commutative and associative and it is safe to
change the order of the computation (if CHECK_REDUCTION is true)
2. no uses for a2 in the loop (a2 is used out of the loop)
- 3. no uses of a1 in the loop besides the reduction operation.
+ 3. no uses of a1 in the loop besides the reduction operation
+ 4. no uses of a1 outside the loop.
- Condition 1 is tested here.
+ Conditions 1,4 are tested here.
Conditions 2,3 are tested in vect_mark_stmts_to_be_vectorized.
(2) Detect a cross-iteration def-use cycle in nested loops, i.e.,
@@ -1702,8 +1703,16 @@ vect_is_simple_reduction_1 (loop_vec_info loop_info, gimple phi,
gimple use_stmt = USE_STMT (use_p);
if (is_gimple_debug (use_stmt))
continue;
- if (flow_bb_inside_loop_p (loop, gimple_bb (use_stmt))
- && vinfo_for_stmt (use_stmt)
+
+ if (!flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)))
+ {
+ if (vect_print_dump_info (REPORT_DETAILS))
+ fprintf (vect_dump, "intermediate value used outside loop.");
+
+ return NULL;
+ }
+
+ if (vinfo_for_stmt (use_stmt)
&& !is_pattern_stmt_p (vinfo_for_stmt (use_stmt)))
nloop_uses++;
if (nloop_uses > 1)