The following fixes a bug in outer loop reduction vectorization which
happens to use a bogus vectorized stmt for the inner loop exit PHI.

Bootstrap and regtest in progress on x86_64-unknown-linux-gnu.

Richard.

2015-01-13  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/64493
        PR tree-optimization/64495
        * tree-vect-loop.c (vect_finalize_reduction): For double-reductions
        assign the proper vectorized PHI to the inner loop exit PHIs.

        * gcc.dg/vect/pr64493.c: New testcase.
        * gcc.dg/vect/pr64495.c: Likewise.

Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c        (revision 219520)
+++ gcc/tree-vect-loop.c        (working copy)
@@ -4580,7 +4580,10 @@ vect_finalize_reduction:
                            && !STMT_VINFO_LIVE_P (exit_phi_vinfo))
                           || double_reduc);
 
-              STMT_VINFO_VEC_STMT (exit_phi_vinfo) = epilog_stmt;
+             if (double_reduc)
+               STMT_VINFO_VEC_STMT (exit_phi_vinfo) = inner_phi;
+             else
+               STMT_VINFO_VEC_STMT (exit_phi_vinfo) = epilog_stmt;
               if (!double_reduc
                   || STMT_VINFO_DEF_TYPE (exit_phi_vinfo)
                       != vect_double_reduction_def)
Index: gcc/testsuite/gcc.dg/vect/pr64493.c
===================================================================
--- gcc/testsuite/gcc.dg/vect/pr64493.c (revision 0)
+++ gcc/testsuite/gcc.dg/vect/pr64493.c (working copy)
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+
+#include "tree-vect.h"
+
+int a, b, c, d, e, f, g, h;
+
+int
+main ()
+{
+  check_vect ();
+
+  for (; a; a--)
+    for (d = 1; d <= 0; d++)
+      for (; d;)
+       if (h)
+         {
+           if (!g) __builtin_abort ();
+           if (!0) __builtin_abort ();
+         }
+
+  for (f = 4; f; f--)
+    {
+      for (b = 0; b < 2; b++)
+       c |= 1;
+      e |= c;
+    }
+
+  return 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
Index: gcc/testsuite/gcc.dg/vect/pr64495.c
===================================================================
--- gcc/testsuite/gcc.dg/vect/pr64495.c (revision 0)
+++ gcc/testsuite/gcc.dg/vect/pr64495.c (working copy)
@@ -0,0 +1,35 @@
+/* { dg-do run } */
+
+#include <assert.h>
+#include "tree-vect.h"
+
+int a, b, c, d, e, f, g, i, j;
+static int *h = &e;
+
+int
+main ()
+{
+  check_vect ();
+
+  for (; a;)
+    for (; g; g++)
+      for (; f; f++)
+       if (j)
+         {
+           assert(b); 
+           assert(0);
+         }
+  for (i = 24; i; i--)
+    {
+      for (c = 0; c < 6; c++)
+       d |= 1;
+      *h |= d;
+    }
+
+  if (e != 1) 
+    __builtin_abort (); 
+
+  return 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */

Reply via email to