On Tue, 8 Dec 2015, Jakub Jelinek wrote:

> Hi!
> 
> As written in the PR, with MASK_{LOAD,STORE} ifns we lose info on the
> alignment of the point, unless the referenced SSA_NAME has pointer info
> with alignment mask, but that is just an optimization issue rather than
> requirement.
> 
> As the second argument to these builtins is always 0 (used just to hold
> the pointer type for aliasing purposes), this patch uses the value of
> the second arg to hold alignment info.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2015-12-08  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/68786
>       * tree-if-conv.c: Include builtins.h.
>       (predicate_mem_writes): Put result of get_object_alignment (ref)
>       into second argument's value.
>       * tree-vect-stmts.c (vectorizable_mask_load_store): Put minimum
>       pointer alignment into second argument's value.
>       * tree-data-ref.c (get_references_in_stmt): Use value of second
>       argument for build_aligned_type, and only the type to build
>       a zero second argument for MEM_REF.
>       * internal-fn.c (expand_mask_load_optab_fn,
>       expand_mask_store_optab_fn): Likewise.
> 
> --- gcc/tree-if-conv.c.jj     2015-11-30 13:40:38.000000000 +0100
> +++ gcc/tree-if-conv.c        2015-12-08 17:29:18.139186787 +0100
> @@ -111,6 +111,7 @@ along with GCC; see the file COPYING3.
>  #include "dbgcnt.h"
>  #include "tree-hash-traits.h"
>  #include "varasm.h"
> +#include "builtins.h"
>  
>  /* List of basic blocks in if-conversion-suitable order.  */
>  static basic_block *ifc_bbs;
> @@ -2093,7 +2094,8 @@ predicate_mem_writes (loop_p loop)
>               vect_sizes.safe_push (bitsize);
>               vect_masks.safe_push (mask);
>             }
> -         ptr = build_int_cst (reference_alias_ptr_type (ref), 0);
> +         ptr = build_int_cst (reference_alias_ptr_type (ref),
> +                              get_object_alignment (ref));
>           /* Copy points-to info if possible.  */
>           if (TREE_CODE (addr) == SSA_NAME && !SSA_NAME_PTR_INFO (addr))
>             copy_ref_info (build2 (MEM_REF, TREE_TYPE (ref), addr, ptr),
> --- gcc/tree-vect-stmts.c.jj  2015-12-02 20:26:59.000000000 +0100
> +++ gcc/tree-vect-stmts.c     2015-12-08 17:10:47.226768560 +0100
> @@ -2058,10 +2058,11 @@ vectorizable_mask_load_store (gimple *st
>           misalign = DR_MISALIGNMENT (dr);
>         set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
>                                 misalign);
> +       tree ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)),
> +                                 misalign ? misalign & -misalign : align);
>         new_stmt
>           = gimple_build_call_internal (IFN_MASK_STORE, 4, dataref_ptr,
> -                                       gimple_call_arg (stmt, 1),
> -                                       vec_mask, vec_rhs);
> +                                       ptr, vec_mask, vec_rhs);
>         vect_finish_stmt_generation (stmt, new_stmt, gsi);
>         if (i == 0)
>           STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt;
> @@ -2107,10 +2108,11 @@ vectorizable_mask_load_store (gimple *st
>           misalign = DR_MISALIGNMENT (dr);
>         set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
>                                 misalign);
> +       tree ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)),
> +                                 misalign ? misalign & -misalign : align);
>         new_stmt
>           = gimple_build_call_internal (IFN_MASK_LOAD, 3, dataref_ptr,
> -                                       gimple_call_arg (stmt, 1),
> -                                       vec_mask);
> +                                       ptr, vec_mask);
>         gimple_call_set_lhs (new_stmt, make_ssa_name (vec_dest));
>         vect_finish_stmt_generation (stmt, new_stmt, gsi);
>         if (i == 0)
> --- gcc/tree-data-ref.c.jj    2015-11-09 13:39:32.000000000 +0100
> +++ gcc/tree-data-ref.c       2015-12-08 17:38:55.199094723 +0100
> @@ -3872,6 +3872,8 @@ get_references_in_stmt (gimple *stmt, ve
>    else if (stmt_code == GIMPLE_CALL)
>      {
>        unsigned i, n;
> +      tree ptr, type;
> +      unsigned int align;
>  
>        ref.is_read = false;
>        if (gimple_call_internal_p (stmt))
> @@ -3882,12 +3884,16 @@ get_references_in_stmt (gimple *stmt, ve
>             break;
>           ref.is_read = true;
>         case IFN_MASK_STORE:
> -         ref.ref = fold_build2 (MEM_REF,
> -                                ref.is_read
> -                                ? TREE_TYPE (gimple_call_lhs (stmt))
> -                                : TREE_TYPE (gimple_call_arg (stmt, 3)),
> -                                gimple_call_arg (stmt, 0),
> -                                gimple_call_arg (stmt, 1));
> +         ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
> +         align = tree_to_shwi (gimple_call_arg (stmt, 1));
> +         if (ref.is_read)
> +           type = TREE_TYPE (gimple_call_lhs (stmt));
> +         else
> +           type = TREE_TYPE (gimple_call_arg (stmt, 3));
> +         if (TYPE_ALIGN (type) != align)
> +           type = build_aligned_type (type, align);
> +         ref.ref = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
> +                                ptr);
>           references->safe_push (ref);
>           return false;
>         default:
> --- gcc/internal-fn.c.jj      2015-12-02 20:26:56.000000000 +0100
> +++ gcc/internal-fn.c 2015-12-08 17:21:40.602605916 +0100
> @@ -1911,16 +1911,20 @@ static void
>  expand_mask_load_optab_fn (internal_fn, gcall *stmt, convert_optab optab)
>  {
>    struct expand_operand ops[3];
> -  tree type, lhs, rhs, maskt;
> +  tree type, lhs, rhs, maskt, ptr;
>    rtx mem, target, mask;
> +  unsigned align;
>  
>    maskt = gimple_call_arg (stmt, 2);
>    lhs = gimple_call_lhs (stmt);
>    if (lhs == NULL_TREE)
>      return;
>    type = TREE_TYPE (lhs);
> -  rhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
> -                  gimple_call_arg (stmt, 1));
> +  ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
> +  align = tree_to_shwi (gimple_call_arg (stmt, 1));
> +  if (TYPE_ALIGN (type) != align)
> +    type = build_aligned_type (type, align);
> +  rhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0), ptr);
>  
>    mem = expand_expr (rhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
>    gcc_assert (MEM_P (mem));
> @@ -1940,14 +1944,18 @@ static void
>  expand_mask_store_optab_fn (internal_fn, gcall *stmt, convert_optab optab)
>  {
>    struct expand_operand ops[3];
> -  tree type, lhs, rhs, maskt;
> +  tree type, lhs, rhs, maskt, ptr;
>    rtx mem, reg, mask;
> +  unsigned align;
>  
>    maskt = gimple_call_arg (stmt, 2);
>    rhs = gimple_call_arg (stmt, 3);
>    type = TREE_TYPE (rhs);
> -  lhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
> -                  gimple_call_arg (stmt, 1));
> +  ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
> +  align = tree_to_shwi (gimple_call_arg (stmt, 1));
> +  if (TYPE_ALIGN (type) != align)
> +    type = build_aligned_type (type, align);
> +  lhs = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0), ptr);
>  
>    mem = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
>    gcc_assert (MEM_P (mem));
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to