]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/118669 - fixup wrongly aligned loads/stores
authorRichard Biener <rguenther@suse.de>
Wed, 2 Jul 2025 07:30:05 +0000 (09:30 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 3 Jul 2025 07:30:53 +0000 (09:30 +0200)
The vectorizer tracks alignment of datarefs with dr_aligned
and dr_unaligned_supported but that's aligned with respect to
the target alignment which can be less aligned than the mode
used for the access.  The following fixes this discrepancy
for vectorizing loads and stores.  The issue is visible for
aarch64 SVE and risc-v where VLA vector modes have larger than
element alignment but the target handles element alignment
just fine.

PR tree-optimization/118669
* tree-vect-stmts.cc (vectorizable_load): Emit loads
with proper (element) alignment.
(vectorizable_store): Likewise.

gcc/tree-vect-stmts.cc

index 69f5f6758a15c265c85c1621d143771d8701ab12..95406b4e3a3c770ad6728f1bfe3399aa039fdec4 100644 (file)
@@ -9626,7 +9626,8 @@ vectorizable_store (vec_info *vinfo,
          data_ref = fold_build2 (MEM_REF, vectype, dataref_ptr,
                                  dataref_offset ? dataref_offset
                                  : build_int_cst (ref_type, 0));
-         if (alignment_support_scheme == dr_aligned)
+         if (alignment_support_scheme == dr_aligned
+             && align >= TYPE_ALIGN_UNIT (vectype))
            ;
          else
            TREE_TYPE (data_ref)
@@ -11659,7 +11660,8 @@ vectorizable_load (vec_info *vinfo,
                  {
                    data_ref = fold_build2 (MEM_REF, ltype,
                                            dataref_ptr, offset);
-                   if (alignment_support_scheme == dr_aligned)
+                   if (alignment_support_scheme == dr_aligned
+                       && align >= TYPE_ALIGN_UNIT (ltype))
                      ;
                    else
                      TREE_TYPE (data_ref)