tree-optimization/97139 - fix BB SLP live lane extraction
authorRichard Biener <rguenther@suse.de>
Mon, 21 Sep 2020 14:51:33 +0000 (16:51 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 21 Sep 2020 14:54:04 +0000 (16:54 +0200)
This fixes SLP live lane extraction with pattern stmts.

2020-09-21  Richard Biener  <rguenther@suse.de>

PR tree-optimization/97139
* tree-vect-slp.c (vect_bb_slp_mark_live_stmts): Only mark the
pattern root, track visited vectorized stmts.

* gcc.dg/vect/pr97139.c: New testcase.

gcc/testsuite/gcc.dg/vect/pr97139.c [new file with mode: 0644]
gcc/tree-vect-slp.c

diff --git a/gcc/testsuite/gcc.dg/vect/pr97139.c b/gcc/testsuite/gcc.dg/vect/pr97139.c
new file mode 100644 (file)
index 0000000..1b9f31c
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-require-effective-target vect_int } */
+
+#include "tree-vect.h"
+
+int pix[4];
+
+int __attribute__((noipa)) foo (void)
+{
+  pix[0] = pix[0] / 4;
+  pix[1] = pix[1] / 4;
+  pix[2] = pix[2] / 4;
+  pix[3] = pix[3] / 4;
+  return pix[0] + pix[1] + pix[2] + pix[3];
+}
+
+int main ()
+{
+  check_vect ();
+
+  pix[0] = 8;
+  pix[1] = 16;
+  pix[2] = 32;
+  pix[3] = 64;
+  if (foo () != 30)
+    __builtin_abort ();
+  return 0;
+}
index ef62c2dff2e16c46e8ec892483dc47db9c9050b4..c44fd396bf0b69a4153e46026c545bebb3797551 100644 (file)
@@ -3021,10 +3021,14 @@ vect_bb_slp_mark_live_stmts (bb_vec_info bb_vinfo, slp_tree node,
   bool all_visited = true;
   FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, stmt_info)
     {
-      stmt_vec_info orig_stmt_info = vect_orig_stmt (stmt_info);
-      if (svisited.contains (orig_stmt_info))
+      if (svisited.contains (stmt_info))
        continue;
       all_visited = false;
+      stmt_vec_info orig_stmt_info = vect_orig_stmt (stmt_info);
+      if (STMT_VINFO_IN_PATTERN_P (orig_stmt_info)
+         && STMT_VINFO_RELATED_STMT (orig_stmt_info) != stmt_info)
+       /* Only the pattern root stmt computes the original scalar value.  */
+       continue;
       bool mark_visited = true;
       gimple *orig_stmt = orig_stmt_info->stmt;
       ssa_op_iter op_iter;
@@ -3091,7 +3095,7 @@ vect_bb_slp_mark_live_stmts (bb_vec_info bb_vinfo, slp_tree node,
                }
        }
       if (mark_visited)
-       svisited.add (orig_stmt_info);
+       svisited.add (stmt_info);
     }
   if (all_visited)
     return;