https://gcc.gnu.org/g:37bf13adcda564dfdb28c3aa736f2cac71c73d09

commit r16-1918-g37bf13adcda564dfdb28c3aa736f2cac71c73d09
Author: Richard Biener <rguent...@suse.de>
Date:   Wed Jul 2 09:30:05 2025 +0200

    tree-optimization/118669 - fixup wrongly aligned loads/stores
    
    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.

Diff:
---
 gcc/tree-vect-stmts.cc | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 69f5f6758a15..95406b4e3a3c 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -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)

Reply via email to