On Mon, Jan 2, 2012 at 8:00 PM, Richard Sandiford
<rdsandif...@googlemail.com> wrote:
> Eric Botcazou <ebotca...@adacore.com> writes:
>>> You are basically (but non-optimally) locally re-implementing
>>> what expr.c:get_object_or_type_alignment does, for the
>>> bare MEM_REF case (you don't consider offsets that
>>> do not change the alignment, nor alignment information
>>> present on the SSA name).
>>
>> Adjusted version attached, regression-tested on SPARC/Solaris.  I'll do a 
>> full
>> testing cycle if it is OK for mainline.
>>
>> get_object_or_type_alignment doesn't exist on the 4.6 branch, the expanders 
>> for
>> MEM_REF and TARGET_MEM_REF do:
>>
>>   MAX (TYPE_ALIGN (TREE_TYPE (exp)),
>>        get_object_alignment (exp, BIGGEST_ALIGNMENT)))
>>
>> instead, so I presume I should do the same for them in 
>> tree_non_aligned_mem_p?
>>
>>
>> 2011-12-07  Eric Botcazou  <ebotca...@adacore.com>
>>
>>         PR tree-optimization/51315
>>       * tree.h (get_object_or_type_alignment): Declare.
>>       * expr.c (get_object_or_type_alignment): Move to...
>>       * builtins.c (get_object_or_type_alignment): ...here.  Add assertion.
>>         * tree-sra.c (tree_non_mode_aligned_mem_p): Rename to...
>>         (tree_non_aligned_mem_p): ...this.  Add ALIGN parameter.  Look into
>>         MEM_REFs and use get_object_or_type_alignment for them.
>>         (build_accesses_from_assign): Adjust for above change.
>>         (access_precludes_ipa_sra_p): Likewise.
>
> Sorry for the late notice, but this regressed memcpy-1.c for n32 and n64
> on mips64-linux-gnu.  I realise memcpy-1.c isn't viewed as being a proper
> SRA test, but in this case I think it really is showing a genuine problem.
> We have:
>
>    struct a {int a,b,c;} a;
>    int test(struct a a)
>    {
>    struct a nasty_local;
>    __builtin_memcpy (&nasty_local,&a, sizeof(a));
>    return nasty_local.a;
>    }
>
> We apply LOCAL_ALIGNMENT to nasty_local during estimated_stack_frame_size,
> so we have a VAR_DECL (nasty_local) with 64-bit alignment and a PARM_DECL
> (a) with 32-bit alignment.  This fails the condition:
>
>      if (STRICT_ALIGNMENT
>          && tree_non_aligned_mem_p (rhs, get_object_alignment (lhs)))
>        lacc->grp_unscalarizable_region = 1;
>
> because LHS has 64-bit alignment but RHS has 32-bit alignment.

Shouldn't we go back and unconditionally return false if lhs and (or?) rhs
are BLKmode?  I suppose they are, in this case.  Or should we truncate
the alignment from get_object_alignment to TYPE_ALIGN if it is bigger
than that to avoid this situation?

I suppose Eric will know which case the expander would handle correctly.

Richard.

> Richard

Reply via email to