diff mbox

PR 71439 - Only vectorize live PHIs that are inductions

Message ID D386D537.10263%alan.hayward@arm.com
State New
Headers show

Commit Message

Alan Hayward June 15, 2016, 8:49 a.m. UTC
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?

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



               /* 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 ())

Comments

Richard Biener June 15, 2016, 9:39 a.m. UTC | #1
On Wed, Jun 15, 2016 at 10:49 AM, Alan Hayward <alan.hayward@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 ())
>
>
>
>
diff mbox

Patch

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)
             {