On Wed, Jun 15, 2016 at 10:49 AM, Alan Hayward <alan.hayw...@arm.com> wrote:
> For a PHI to be used outside the loop it needs to be vectorized. However
> the
> vectorizer currently will only vectorize PHIs that are an induction.
>
> This patch fixes PR 71439 by only allowing a live PHI to be vectorized if
> it
> is an induction. In addition, live PHIs need to pass a
> vectorizable_live_operation check.
>
> Tested on x86 and aarch64.
> Ok to commit?

Ok.

Thanks,
Richard.

> Alan.
>
> gcc/
>         PR tree-optimization/71439
>         * tree-vect-loop.c (vect_analyze_loop_operations): Additional check 
> for
>         live PHIs.
>
> testsuite/
>         PR tree-optimization/71439
>         * gcc.dg/vect/pr71439.c: New
>
>
>
> diff --git a/gcc/testsuite/gcc.dg/vect/pr71439.c
> b/gcc/testsuite/gcc.dg/vect/pr71439.c
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..95e4763bad6e9f301d53c20ffa160b96b
> dad9a53
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr71439.c
> @@ -0,0 +1,17 @@
> +#include "tree-vect.h"
> +
> +int a, b, c;
> +short fn1(int p1, int p2) { return p1 + p2; }
> +
> +int main() {
> +  a = 0;
> +  for (; a < 30; a = fn1(a, 4)) {
> +    c = b;
> +    b = 6;
> +  }
> +
> +  if (c != 6)
> +    abort ();
> +
> +  return 0;
> +}
> diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
> index
> 1231b95f6a71337833e8c4b24884da9f96a7b5bf..90ade75bcd212b542ad680877a79df717
> 751ff4b 100644
> --- a/gcc/tree-vect-loop.c
> +++ b/gcc/tree-vect-loop.c
> @@ -1669,7 +1669,8 @@ vect_analyze_loop_operations (loop_vec_info
> loop_vinfo)
>
>            gcc_assert (stmt_info);
>
> -          if (STMT_VINFO_RELEVANT (stmt_info) == vect_used_in_scope
> +          if ((STMT_VINFO_RELEVANT (stmt_info) == vect_used_in_scope
> +               || STMT_VINFO_LIVE_P (stmt_info))
>                && STMT_VINFO_DEF_TYPE (stmt_info) != vect_induction_def)
>              {
>                /* A scalar-dependence cycle that we don't support.  */
> @@ -1686,6 +1687,9 @@ vect_analyze_loop_operations (loop_vec_info
> loop_vinfo)
>                  ok = vectorizable_induction (phi, NULL, NULL);
>              }
>
> +         if (ok && STMT_VINFO_LIVE_P (stmt_info))
> +           ok = vectorizable_live_operation (phi, NULL, NULL, -1, NULL);
> +
>            if (!ok)
>              {
>                if (dump_enabled_p ())
>
>
>
>

Reply via email to