On Mon, 2 Nov 2020, Bernd Edlinger wrote:

> On 11/2/20 3:07 PM, Richard Biener wrote:
> > On Mon, 2 Nov 2020, Bernd Edlinger wrote:
> > 
> >> Hi,
> >>
> >> this makes sure that stack allocated SSA_NAMEs are
> >> at least MODE_ALIGNED.  Also increase the MEM_ALIGN
> >> for the corresponding rtl objects.
> >>
> >>
> >> Tested on x86_64-pc-linux-gnu and arm-none-eabi.
> >>
> >> OK for trunk?
> > 
> > 
> > @@ -1022,6 +1030,14 @@ expand_one_stack_var_at (tree decl, rtx base,
> > unsigned base_align,
> >      }
> >  
> >    set_rtl (decl, x);
> > +
> > +  if (TREE_CODE (decl) == SSA_NAME
> > +      && GET_MODE (x) != BLKmode
> > +      && MEM_ALIGN (x) < GET_MODE_ALIGNMENT (GET_MODE (x)))
> > +    {
> > +      gcc_checking_assert (GET_MODE_ALIGNMENT (GET_MODE (x)) <=
> > base_align);
> > +      set_mem_align (x, GET_MODE_ALIGNMENT (GET_MODE (x)));
> > +    }
> >  }
> >  
> > 
> > I wonder whether we cannot "fix" set_rtl to not call
> > set_mem_attributes in this path, maybe directly call
> > set_mem_align there instead?  That is, the preceeding
> > code for ! SSA_NAME already tries to adjust alignment
> > to honor that of the actual stack slot - IMHO the
> > non-SSA and SSA cases should be merged after this
> > patch, but maybe simply by calling set_mem_align
> > instead of doing the DECL_ALIGN frobbing and do
> > the alignment compute also for SSA_NAMEs?
> > 
> > The other pieces look OK but the above is a bit ugly
> > at the moment.
> > 
> 
> Hmm, how about this?

That would work for me.  Guess removing the DECL_ALIGN frobbing
in the != SSA_NAME path didn't work out or you didn't try out
of caution?

Richard.

> --- a/gcc/cfgexpand.c
> +++ b/gcc/cfgexpand.c
> @@ -1007,20 +1007,21 @@ expand_one_stack_var_at (tree decl, rtx base, 
> unsigned base_align,
>    x = plus_constant (Pmode, base, offset);
>    x = gen_rtx_MEM (TREE_CODE (decl) == SSA_NAME
>                    ? TYPE_MODE (TREE_TYPE (decl))
> -                  : DECL_MODE (SSAVAR (decl)), x);
> +                  : DECL_MODE (decl), x);
> +
> +  /* Set alignment we actually gave this decl if it isn't an SSA name.
> +     If it is we generate stack slots only accidentally so it isn't as
> +     important, we'll simply set the alignment directly on the MEM_P.  */
> +
> +  if (base == virtual_stack_vars_rtx)
> +    offset -= frame_phase;
> +  align = known_alignment (offset);
> +  align *= BITS_PER_UNIT;
> +  if (align == 0 || align > base_align)
> +    align = base_align;
>  
>    if (TREE_CODE (decl) != SSA_NAME)
>      {
> -      /* Set alignment we actually gave this decl if it isn't an SSA name.
> -         If it is we generate stack slots only accidentally so it isn't as
> -        important, we'll simply use the alignment that is already set.  */
> -      if (base == virtual_stack_vars_rtx)
> -       offset -= frame_phase;
> -      align = known_alignment (offset);
> -      align *= BITS_PER_UNIT;
> -      if (align == 0 || align > base_align)
> -       align = base_align;
> -
>        /* One would think that we could assert that we're not decreasing
>          alignment here, but (at least) the i386 port does exactly this
>          via the MINIMUM_ALIGNMENT hook.  */
> @@ -1031,13 +1032,7 @@ expand_one_stack_var_at (tree decl, rtx base, unsigned 
> base_align,
>  
>    set_rtl (decl, x);
>  
> -  if (TREE_CODE (decl) == SSA_NAME
> -      && GET_MODE (x) != BLKmode
> -      && MEM_ALIGN (x) < GET_MODE_ALIGNMENT (GET_MODE (x)))
> -    {
> -      gcc_checking_assert (GET_MODE_ALIGNMENT (GET_MODE (x)) <= base_align);
> -      set_mem_align (x, GET_MODE_ALIGNMENT (GET_MODE (x)));
> -    }
> +  set_mem_align (x, align);
>  }
>  
>  class stack_vars_data
> 
> 
> Is it OK if it passes bootstrap and regtesting ?
> 
> Thanks
> Bernd.
> 
> > Thanks,
> > Richard,
> > 
> >>
> >>
> >> Thanks
> >> Bernd.
> >>
> > 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imend

Reply via email to