From: Cong Hou Date: Tue, 15 Oct 2013 17:17:43 +0000 (-0400) Subject: tree-vect-loop.c (vect_is_simple_reduction_1): Relax the requirement of the reduction... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=69b8f2f943c302fcf0623d6b78d367d95d5450fd;p=gcc.git 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 * 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 * gcc.dg/vect/vect-reduc-pattern-3.c: New test. From-SVN: r203625 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 09e2494edcd..7a7033aa542 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-10-15 Cong Hou + + * 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 * config/arm/neon-schedgen.ml: Remove. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f290da8ac78..eb5eea2c80d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-10-15 Cong Hou + + * gcc.dg/vect/vect-reduc-pattern-3.c: New test. + 2013-10-15 Paolo Carlini PR c++/58707 diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-3.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-3.c new file mode 100644 index 00000000000..06a94168cd0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-3.c @@ -0,0 +1,41 @@ +/* { dg-require-effective-target vect_int } */ + +#include +#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" } } */ + 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)