]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/116791 - Elementwise SLP vectorization
authorRichard Biener <rguenther@suse.de>
Mon, 23 Sep 2024 08:13:17 +0000 (10:13 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 23 Sep 2024 09:52:27 +0000 (11:52 +0200)
The following restricts the elementwise SLP vectorization to the
single-lane case which is the reason I enabled it to avoid regressions
with non-SLP.  The PR shows that multi-line SLP loads with elementwise
accesses require work, I'll open a new bug to track this for the
future.

PR tree-optimization/116791
* tree-vect-stmts.cc (get_group_load_store_type): Only
fall back to elementwise access for single-lane SLP, restore
hard failure mode for other cases.

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

gcc/testsuite/gcc.dg/vect/pr116791.c [new file with mode: 0644]
gcc/tree-vect-stmts.cc

diff --git a/gcc/testsuite/gcc.dg/vect/pr116791.c b/gcc/testsuite/gcc.dg/vect/pr116791.c
new file mode 100644 (file)
index 0000000..d9700a8
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-mavx2" { target avx2 } } */
+
+struct nine_context {
+  unsigned tex_stage[8][33];
+};
+struct fvec4 {
+  float x[2];
+};
+void f(struct fvec4 *dst, struct nine_context *context)
+{
+  unsigned s;
+  for (s = 0; s < 8; ++s)
+    {
+      float *rgba = &dst[s].x[0];
+      unsigned color = context->tex_stage[s][0];
+      rgba[0] = (float)((color >> 16) & 0xFF) / 0xFF;
+      rgba[1] = (float)((color >> 8) & 0xFF) / 0xFF;
+    }
+}
index b72b54d666879d8485f8d972b4e8d9dc64bc86b3..ad08fbe55110ecea9df09ee05a96b5ed97f10212 100644 (file)
@@ -2190,12 +2190,23 @@ get_group_load_store_type (vec_info *vinfo, stmt_vec_info stmt_info,
              && single_element_p
              && maybe_gt (group_size, TYPE_VECTOR_SUBPARTS (vectype)))
            {
-             *memory_access_type = VMAT_ELEMENTWISE;
-             if (dump_enabled_p ())
-               dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-                                "single-element interleaving not supported "
-                                "for not adjacent vector loads, using "
-                                "elementwise access\n");
+             if (SLP_TREE_LANES (slp_node) == 1)
+               {
+                 *memory_access_type = VMAT_ELEMENTWISE;
+                 if (dump_enabled_p ())
+                   dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                                    "single-element interleaving not supported "
+                                    "for not adjacent vector loads, using "
+                                    "elementwise access\n");
+               }
+             else
+               {
+                 if (dump_enabled_p ())
+                   dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                                    "single-element interleaving not supported "
+                                    "for not adjacent vector loads\n");
+                 return false;
+               }
            }
        }
     }