2016-01-12 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Jan 2016 08:36:24 +0000 (08:36 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Jan 2016 08:36:24 +0000 (08:36 +0000)
PR tree-optimization/69168
* tree-vect-loop.c (vect_analyze_loop_2): Reset both main and
pattern stmt SLP type.
* tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Patterns may
end up unused so cope with that case.

* gcc.dg/torture/pr69168.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232261 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr69168.c [new file with mode: 0644]
gcc/tree-vect-loop.c
gcc/tree-vect-slp.c

index 6ccdbf8..96a6386 100644 (file)
@@ -1,5 +1,13 @@
 2016-01-12  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/69168
+       * tree-vect-loop.c (vect_analyze_loop_2): Reset both main and
+       pattern stmt SLP type.
+       * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Patterns may
+       end up unused so cope with that case.
+
+2016-01-12  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/69157
        * tree-vect-stmts.c (vectorizable_mask_load_store): Check
        stmts def type only during analyze phase.
index e19ea31..7829a4e 100644 (file)
@@ -1,5 +1,10 @@
 2016-01-12  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/69168
+       * gcc.dg/torture/pr69168.c: New testcase.
+
+2016-01-12  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/69157
        * gcc.dg/torture/pr69157.c: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr69168.c b/gcc/testsuite/gcc.dg/torture/pr69168.c
new file mode 100644 (file)
index 0000000..4f49000
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+
+long a, b, e;
+short *c;
+int *d;
+void fn1()
+{
+  int i;
+  for (; e; e--)
+    {
+      i = 2;
+      for (; i; i--)
+       a = b = *d++ / (1 << 9);
+      b = b ? 8 : a;
+      *c++ = *c++ = b;
+    }
+}
index a797f70..706a25d 100644 (file)
@@ -2189,10 +2189,11 @@ again:
           !gsi_end_p (si); gsi_next (&si))
        {
          stmt_vec_info stmt_info = vinfo_for_stmt (gsi_stmt (si));
+         STMT_SLP_TYPE (stmt_info) = loop_vect;
          if (STMT_VINFO_IN_PATTERN_P (stmt_info))
            {
-             gcc_assert (STMT_SLP_TYPE (stmt_info) == loop_vect);
              stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
+             STMT_SLP_TYPE (stmt_info) = loop_vect;
              for (gimple_stmt_iterator pi
                     = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info));
                   !gsi_end_p (pi); gsi_next (&pi))
@@ -2201,7 +2202,6 @@ again:
                  STMT_SLP_TYPE (vinfo_for_stmt (pstmt)) = loop_vect;
                }
            }
-         STMT_SLP_TYPE (stmt_info) = loop_vect;
        }
     }
   /* Free optimized alias test DDRS.  */
index d185838..7ad7c12 100644 (file)
@@ -2016,10 +2016,10 @@ vect_detect_hybrid_slp_stmts (slp_tree node, unsigned i, slp_vect_type stype)
     {
       /* Check if a pure SLP stmt has uses in non-SLP stmts.  */
       gcc_checking_assert (PURE_SLP_STMT (stmt_vinfo));
-      /* We always get the pattern stmt here, but for immediate
-        uses we have to use the LHS of the original stmt.  */
-      gcc_checking_assert (!STMT_VINFO_IN_PATTERN_P (stmt_vinfo));
-      if (STMT_VINFO_RELATED_STMT (stmt_vinfo))
+      /* If we get a pattern stmt here we have to use the LHS of the
+         original stmt for immediate uses.  */
+      if (! STMT_VINFO_IN_PATTERN_P (stmt_vinfo)
+         && STMT_VINFO_RELATED_STMT (stmt_vinfo))
        stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
       if (TREE_CODE (gimple_op (stmt, 0)) == SSA_NAME)
        FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, gimple_op (stmt, 0))