Commit 69b8f2f9 by Cong Hou Committed by Cong Hou

tree-vect-loop.c (vect_is_simple_reduction_1): Relax the requirement of the…

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
parent 09560e7f
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 James Greenhalgh <james.greenhalgh@arm.com> 2013-10-15 James Greenhalgh <james.greenhalgh@arm.com>
* config/arm/neon-schedgen.ml: Remove. * config/arm/neon-schedgen.ml: Remove.
......
2013-10-15 Cong Hou <congh@google.com>
* gcc.dg/vect/vect-reduc-pattern-3.c: New test.
2013-10-15 Paolo Carlini <paolo.carlini@oracle.com> 2013-10-15 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58707 PR c++/58707
......
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 10
#define RES 1024
/* A reduction pattern in which there is no data ref in
the loop and one operand is defined outside of the loop. */
__attribute__ ((noinline)) int
foo (int v)
{
int i;
int result = 1;
++v;
for (i = 0; i < N; i++)
result *= v;
return result;
}
int
main (void)
{
int res;
check_vect ();
res = foo (1);
if (res != RES)
abort ();
return 0;
}
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
...@@ -2091,6 +2091,13 @@ vect_is_slp_reduction (loop_vec_info loop_info, gimple phi, gimple first_stmt) ...@@ -2091,6 +2091,13 @@ vect_is_slp_reduction (loop_vec_info loop_info, gimple phi, gimple first_stmt)
a3 = ... a3 = ...
a2 = operation (a3, a1) a2 = operation (a3, a1)
or
a3 = ...
loop_header:
a1 = phi < a0, a2 >
a2 = operation (a3, a1)
such that: such that:
1. operation is commutative and associative and it is safe to 1. operation is commutative and associative and it is safe to
change the order of the computation (if CHECK_REDUCTION is true) 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, ...@@ -2451,6 +2458,7 @@ vect_is_simple_reduction_1 (loop_vec_info loop_info, gimple phi,
if (def2 && def2 == phi if (def2 && def2 == phi
&& (code == COND_EXPR && (code == COND_EXPR
|| !def1 || gimple_nop_p (def1) || !def1 || gimple_nop_p (def1)
|| !flow_bb_inside_loop_p (loop, gimple_bb (def1))
|| (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_assign (def1)
|| is_gimple_call (def1) || is_gimple_call (def1)
...@@ -2469,6 +2477,7 @@ vect_is_simple_reduction_1 (loop_vec_info loop_info, gimple phi, ...@@ -2469,6 +2477,7 @@ vect_is_simple_reduction_1 (loop_vec_info loop_info, gimple phi,
if (def1 && def1 == phi if (def1 && def1 == phi
&& (code == COND_EXPR && (code == COND_EXPR
|| !def2 || gimple_nop_p (def2) || !def2 || gimple_nop_p (def2)
|| !flow_bb_inside_loop_p (loop, gimple_bb (def2))
|| (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_assign (def2)
|| is_gimple_call (def2) || is_gimple_call (def2)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment