Hi,

This fixes the alignment on the memory access type for neon loads & stores in the gimple lowering. Bootstrap ubsan on aarch64 builds again with this change.


2021-10-25  Andre Vieira  <andre.simoesdiasvie...@arm.com>

gcc/ChangeLog:

        * config/aarch64/aarch64-builtins.c (aarch64_general_gimple_fold_builtin): Fix memory access
        type alignment.


Is this OK for trunk?

Kind regards,
Andre
diff --git a/gcc/config/aarch64/aarch64-builtins.c 
b/gcc/config/aarch64/aarch64-builtins.c
index 
a815e4cfbccab692ca688ba87c71b06c304abbfb..f5436baf5f8a65c340e05faa491d86a7847c37d3
 100644
--- a/gcc/config/aarch64/aarch64-builtins.c
+++ b/gcc/config/aarch64/aarch64-builtins.c
@@ -2490,12 +2490,16 @@ aarch64_general_gimple_fold_builtin (unsigned int 
fcode, gcall *stmt,
            gimple_seq stmts = NULL;
            tree base = gimple_convert (&stmts, elt_ptr_type,
                                        args[0]);
+           /* Use element type alignment.  */
+           tree access_type
+             = build_aligned_type (simd_type.itype,
+                                   TYPE_ALIGN (TREE_TYPE (simd_type.itype)));
            if (stmts)
              gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
            new_stmt
              = gimple_build_assign (gimple_get_lhs (stmt),
                                     fold_build2 (MEM_REF,
-                                                 simd_type.itype,
+                                                 access_type,
                                                  base, zero));
          }
        break;
@@ -2512,13 +2516,16 @@ aarch64_general_gimple_fold_builtin (unsigned int 
fcode, gcall *stmt,
            gimple_seq stmts = NULL;
            tree base = gimple_convert (&stmts, elt_ptr_type,
                                        args[0]);
+           /* Use element type alignment.  */
+           tree access_type
+             = build_aligned_type (simd_type.itype,
+                                   TYPE_ALIGN (TREE_TYPE (simd_type.itype)));
            if (stmts)
              gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
            new_stmt
-             = gimple_build_assign (fold_build2 (MEM_REF,
-                                    simd_type.itype,
-                                    base,
-                                    zero), args[1]);
+             = gimple_build_assign (fold_build2 (MEM_REF, access_type,
+                                                 base, zero),
+                                    args[1]);
          }
        break;
 

Reply via email to