The following disables a sanity check that BB SLP partitioning correctly
partitioned the SLP graph.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        PR tree-optimization/125124
        * tree-vect-slp.cc (vect_bb_slp_scalar_cost): Disable
        BB SLP partitioning sanity-check.

        * gcc.dg/torture/pr125124.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr125124.c | 23 +++++++++++++++++++++++
 gcc/tree-vect-slp.cc                    |  9 ++++++++-
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr125124.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr125124.c 
b/gcc/testsuite/gcc.dg/torture/pr125124.c
new file mode 100644
index 00000000000..dd087a899b6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr125124.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-ftree-vectorize" } */
+
+char ff_rv60_idct16x16_add_dst_1, ff_rv60_idct16x16_add___trans_tmp_1;
+short ff_rv60_idct16x16_add_tmp[56];
+void ff_rv60_idct16x16_add() {
+  for (int y; y; y++) {
+    int tmp00 = 31 * ff_rv60_idct16x16_add_tmp[y * 16] -
+                7 * ff_rv60_idct16x16_add_tmp[y * 16 + 1] -
+                6 * ff_rv60_idct16x16_add_tmp[y * 16 + 10] -
+                20 * ff_rv60_idct16x16_add_tmp[y * 16 + 4],
+        tmp02 = 20 * ff_rv60_idct16x16_add_tmp[y * 16] -
+                6 * ff_rv60_idct16x16_add_tmp[y * 16 + 1] +
+                7 * ff_rv60_idct16x16_add_tmp[y * 16 + 10] +
+                31 * ff_rv60_idct16x16_add_tmp[y * 16 + 4];
+    ff_rv60_idct16x16_add_dst_1 = (tmp00 >> 7) + (tmp02 >> 7);
+    {
+      if (ff_rv60_idct16x16_add_dst_1)
+        ff_rv60_idct16x16_add___trans_tmp_1 = ff_rv60_idct16x16_add_dst_1;
+    }
+    ff_rv60_idct16x16_add_dst_1 = ff_rv60_idct16x16_add___trans_tmp_1;
+  }
+}
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 17b8dc5b9dc..40ddae3526b 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -9452,7 +9452,14 @@ vect_bb_slp_scalar_cost (bb_vec_info vinfo,
            continue;
        }
 
-      gcc_assert (!gimple_visited_p (stmt->stmt));
+      /* The following assert verifies that vect_bb_partition_graph
+        partitions the SLP graph in a way that each scalar stmt of
+        the coverage of the SLP graph belongs to exactly one subgraph.
+        ???  This is currently not guaranteed since the function
+        works purely on SLP_TREE_SCALAR_STMTS, resulting in the assert
+        tripping or scalar stmts costed multiple times, making vectorization
+        more profitable than it really is.  */
+      /* gcc_checking_assert (!gimple_visited_p (stmt->stmt)); */
 
       if (vect_nop_conversion_p (stmt))
        ;
-- 
2.51.0

Reply via email to