summaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorCong Hou <congh@google.com>2013-10-15 13:17:43 -0400
committerCong Hou <congh@gcc.gnu.org>2013-10-15 13:17:43 -0400
commit69b8f2f943c302fcf0623d6b78d367d95d5450fd (patch)
treea07346fb868983cc9fc591849d368b7924535e15 /gcc/tree-vect-loop.c
parent09560e7f4dadaa207f8bc94a848811ae0bbf948f (diff)
downloadgcc-69b8f2f943c302fcf0623d6b78d367d95d5450fd.tar.gz
tree-vect-loop.c (vect_is_simple_reduction_1): Relax the requirement of the reduction pattern so that one operand of the ...
2013-10-15 Cong Hou <congh@google.com> * tree-vect-loop.c (vect_is_simple_reduction_1): Relax the requirement of the reduction pattern so that one operand of the reduction operation can come from outside of the loop. 2013-10-15 Cong Hou <congh@google.com> * gcc.dg/vect/vect-reduc-pattern-3.c: New test. From-SVN: r203625
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r--gcc/tree-vect-loop.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 638b981d5e7..d9125f690d2 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -2091,6 +2091,13 @@ vect_is_slp_reduction (loop_vec_info loop_info, gimple phi, gimple first_stmt)
a3 = ...
a2 = operation (a3, a1)
+ or
+
+ a3 = ...
+ loop_header:
+ a1 = phi < a0, a2 >
+ a2 = operation (a3, a1)
+
such that:
1. operation is commutative and associative and it is safe to
change the order of the computation (if CHECK_REDUCTION is true)
@@ -2451,6 +2458,7 @@ vect_is_simple_reduction_1 (loop_vec_info loop_info, gimple phi,
if (def2 && def2 == phi
&& (code == COND_EXPR
|| !def1 || gimple_nop_p (def1)
+ || !flow_bb_inside_loop_p (loop, gimple_bb (def1))
|| (def1 && flow_bb_inside_loop_p (loop, gimple_bb (def1))
&& (is_gimple_assign (def1)
|| is_gimple_call (def1)
@@ -2469,6 +2477,7 @@ vect_is_simple_reduction_1 (loop_vec_info loop_info, gimple phi,
if (def1 && def1 == phi
&& (code == COND_EXPR
|| !def2 || gimple_nop_p (def2)
+ || !flow_bb_inside_loop_p (loop, gimple_bb (def2))
|| (def2 && flow_bb_inside_loop_p (loop, gimple_bb (def2))
&& (is_gimple_assign (def2)
|| is_gimple_call (def2)