"Andre Vieira (lists)" <andre.simoesdiasvie...@arm.com> writes:
> And second (also added a test):
>
> [AArch64] Fix TBAA information when lowering NEON loads and stores to gimple
>
> This patch fixes the wrong TBAA information when lowering NEON loads and 
> stores
> to gimple that showed up when bootstrapping with UBSAN.
>
> gcc/ChangeLog:
>
>          * config/aarch64/aarch64-builtins.c 
> (aarch64_general_gimple_fold_builtin): Change pointer alignment and alias.
>
> gcc/testsuite/ChangeLog:
>
>          * gcc.target/aarch64/simd/lowering_tbaa.c: New test.

OK, thanks.

Richard

> diff --git a/gcc/config/aarch64/aarch64-builtins.c 
> b/gcc/config/aarch64/aarch64-builtins.c
> index 
> a815e4cfbccab692ca688ba87c71b06c304abbfb..e06131a7c61d31c1be3278dcdccc49c3053c78cb
>  100644
> --- a/gcc/config/aarch64/aarch64-builtins.c
> +++ b/gcc/config/aarch64/aarch64-builtins.c
> @@ -2485,18 +2485,18 @@ aarch64_general_gimple_fold_builtin (unsigned int 
> fcode, gcall *stmt,
>             = get_mem_type_for_load_store(fcode);
>           aarch64_simd_type_info simd_type
>             = aarch64_simd_types[mem_type];
> -         tree elt_ptr_type = build_pointer_type (simd_type.eltype);
> +         tree elt_ptr_type = build_pointer_type_for_mode (simd_type.eltype,
> +                                                          VOIDmode, true);
>           tree zero = build_zero_cst (elt_ptr_type);
> -         gimple_seq stmts = NULL;
> -         tree base = gimple_convert (&stmts, elt_ptr_type,
> -                                     args[0]);
> -         if (stmts)
> -           gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
> +         /* Use element type alignment.  */
> +         tree access_type
> +           = build_aligned_type (simd_type.itype,
> +                                 TYPE_ALIGN (simd_type.eltype));
>           new_stmt
>             = gimple_build_assign (gimple_get_lhs (stmt),
>                                    fold_build2 (MEM_REF,
> -                                               simd_type.itype,
> -                                               base, zero));
> +                                               access_type,
> +                                               args[0], zero));
>         }
>       break;
>  
> @@ -2507,18 +2507,17 @@ aarch64_general_gimple_fold_builtin (unsigned int 
> fcode, gcall *stmt,
>             = get_mem_type_for_load_store(fcode);
>           aarch64_simd_type_info simd_type
>             = aarch64_simd_types[mem_type];
> -         tree elt_ptr_type = build_pointer_type (simd_type.eltype);
> +         tree elt_ptr_type = build_pointer_type_for_mode (simd_type.eltype,
> +                                                          VOIDmode, true);
>           tree zero = build_zero_cst (elt_ptr_type);
> -         gimple_seq stmts = NULL;
> -         tree base = gimple_convert (&stmts, elt_ptr_type,
> -                                     args[0]);
> -         if (stmts)
> -           gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
> +         /* Use element type alignment.  */
> +         tree access_type
> +           = build_aligned_type (simd_type.itype,
> +                                 TYPE_ALIGN (simd_type.eltype));
>           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,
> +                                               args[0], zero),
> +                                  args[1]);
>         }
>       break;
>  
> diff --git a/gcc/testsuite/gcc.target/aarch64/simd/lowering_tbaa.c 
> b/gcc/testsuite/gcc.target/aarch64/simd/lowering_tbaa.c
> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..eaeae21f19c7d2d8d4e032f2f8b1b22bb96b7ca4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/simd/lowering_tbaa.c
> @@ -0,0 +1,30 @@
> +/* Tests the TBAA information of lowered AArch64 SIMD loads.  */
> +/* { dg-do run } */
> +/* { dg-options "-save-temps -O2" } */
> +
> +#include <arm_neon.h>
> +
> +void __attribute__((noipa))
> +g (float *)
> +{
> +}
> +
> +int32x4_t __attribute__((noipa))
> +f (void)
> +{
> +  float a[4] = { 1, 2, 3, 4 };
> +  g (a);
> +  a[0] = a[1] = a[2] = a[3] = 0;
> +  void *volatile ptr = a;
> +  return vld1q_s32 ((int32_t *) ptr);
> +}
> +
> +int
> +main (void)
> +{
> +  int32x4_t x = f ();
> +  int32x4_t y = vdupq_n_s32 (0);
> +  if (__builtin_memcmp (&x, &y, 16) != 0)
> +    __builtin_abort ();
> +  return 0;
> +}

Reply via email to