On Fri, Mar 27, 2020 at 11:07 AM Kito Cheng <kito.ch...@sifive.com> wrote:
>
>  - The alignment for local variable was adjust during 
> estimate_stack_frame_size,
>    however it seems wrong spot to adjust that, expand phase will adjust that
>    but it little too late to some gimple optimization, which rely on certain
>    target hooks need to check alignment, forwprop is an example for
>    that, result of simplify_builtin_call rely on the alignment on some
>    target like ARM or RISC-V.
>
>  - So we must adjust at some point, and here is already a pass to adjust
>    alignment, which is ipa-increase-alignment, used for tree vectorization.
>
>  - This patch fix gfortran.dg/pr45636.f90 for arm and riscv.
>
>  - Regression test on riscv32/riscv64 and x86_64-linux-gnu, no new fail
>    introduced.
>
> gcc/ChangeLog
>
>         PR target/90811
>         * ipa-increase-alignment.cc (increase_alignment_local_var): New.
>         (increase_alignment_global_var): New.
>         (pass_ipa_increase_alignment::gate): Remove.
> ---
>  gcc/ipa-increase-alignment.cc | 45 ++++++++++++++++++++++++++++-------
>  1 file changed, 36 insertions(+), 9 deletions(-)
>
> diff --git a/gcc/ipa-increase-alignment.cc b/gcc/ipa-increase-alignment.cc
> index 6e34124bc03..8f28ad83349 100644
> --- a/gcc/ipa-increase-alignment.cc
> +++ b/gcc/ipa-increase-alignment.cc
> @@ -148,10 +148,35 @@ get_vec_alignment_for_type (tree type)
>    return (alignment > TYPE_ALIGN (type)) ? alignment : 0;
>  }
>
> -/* Entry point to increase_alignment pass.  */
> -static unsigned int
> -increase_alignment (void)
> +/* Adjust alignment for local variable.  */
> +static void
> +increase_alignment_local_var (void)
> +{
> +  size_t i;
> +  tree var;
> +  struct cgraph_node *node;
> +  unsigned int align;
> +
> +  FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
> +    {
> +      function *fun = node->get_fun ();
> +      FOR_EACH_LOCAL_DECL (fun, i, var)
> +       {
> +         align = LOCAL_DECL_ALIGNMENT (var);
> +
> +         SET_DECL_ALIGN (var, align);


I think this is wrong if the user has set the alignment already.
You need to check DECL_USER_ALIGN.

Thanks,
Andrew Pinski

> +       }
> +    }
> +}
> +
> +/* Adjust alignment for global variable, only used for tree vectorization
> +   currently.  */
> +static void
> +increase_alignment_global_var (void)
>  {
> +  if (!(flag_section_anchors && flag_tree_loop_vectorize))
> +    return;
> +
>    varpool_node *vnode;
>
>    vect_location = dump_user_location_t ();
> @@ -178,6 +203,14 @@ increase_alignment (void)
>      }
>
>    delete type_align_map;
> +}
> +
> +/* Entry point to increase_alignment pass.  */
> +static unsigned int
> +increase_alignment (void)
> +{
> +  increase_alignment_local_var ();
> +  increase_alignment_global_var ();
>    return 0;
>  }
>
> @@ -204,12 +237,6 @@ public:
>      : simple_ipa_opt_pass (pass_data_ipa_increase_alignment, ctxt)
>    {}
>
> -  /* opt_pass methods: */
> -  virtual bool gate (function *)
> -    {
> -      return flag_section_anchors && flag_tree_loop_vectorize;
> -    }
> -
>    virtual unsigned int execute (function *) { return increase_alignment (); }
>
>  }; // class pass_ipa_increase_alignment
> --
> 2.25.2
>

Reply via email to