]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/115640 - outer loop vect with inner SLP permute
authorRichard Biener <rguenther@suse.de>
Wed, 26 Jun 2024 12:07:51 +0000 (14:07 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 28 Jun 2024 11:43:28 +0000 (13:43 +0200)
The following fixes wrong-code when using outer loop vectorization
and an inner loop SLP access with permutation.  A wrong adjustment
to the IV increment is then applied on GCN.

PR tree-optimization/115640
* tree-vect-stmts.cc (vectorizable_load): With an inner
loop SLP access to not apply a gap adjustment.

gcc/tree-vect-stmts.cc

index 0b0761bf799b1411f5a8802720c75e5fad239eb4..7b889f31645d4b91f50fe7c800f49e8d65587d01 100644 (file)
@@ -10512,9 +10512,14 @@ vectorizable_load (vec_info *vinfo,
             whole group, not only the number of vector stmts the
             permutation result fits in.  */
          unsigned scalar_lanes = SLP_TREE_LANES (slp_node);
-         if (slp_perm
-             && (group_size != scalar_lanes 
-                 || !multiple_p (nunits, group_size)))
+         if (nested_in_vect_loop)
+           /* We do not support grouped accesses in a nested loop,
+              instead the access is contiguous but it might be
+              permuted.  No gap adjustment is needed though.  */
+           vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
+         else if (slp_perm
+                  && (group_size != scalar_lanes
+                      || !multiple_p (nunits, group_size)))
            {
              /* We don't yet generate such SLP_TREE_LOAD_PERMUTATIONs for
                 variable VF; see vect_transform_slp_perm_load.  */