On Mon, Sep 6, 2021 at 1:08 PM Richard Earnshaw
<richard.earns...@foss.arm.com> wrote:
>
>
>
> On 06/09/2021 11:58, Richard Biener via Gcc-patches wrote:
> > On Mon, Sep 6, 2021 at 12:40 PM Richard Earnshaw <rearn...@arm.com> wrote:
> >>
> >>
> >> GCC was recently changed to prevent simplify_subreg from simplifying
> >> a subreg of a mem when the mode of the new mem would have stricter 
> >> alignment
> >> constraints than the inner mem already has when the target requires
> >> STRICT_ALIGNMENT.
> >>
> >> However, such targets may have specialist patterns that can handle
> >> unaligned accesses and this restriction turns out to be unduly restrictive.
> >> So limit this restriction to only apply when the inner mem is naturally
> >> aligned to the inner mode.
> >
> > Hmm, I think this can end up either generating wrong code or
> > recog fails.  The specific combination of alignment and mode of 'op'
> > has been validated to be supported, replacing the mode with sth
> > else would need re-validation of the combination.  I'm not sure
> > we can for example just query movmisalign support here and
> > hope for LRA to reload the mem with that.
> >
> > So - where do you run into this?  Is it possible to catch the
> > situation on a higher level where more context as in the whole insn
> > is visible?
>
> I ran into it with patch 2 of this series when calling gen_highpart on a
> misaligned mem.  IIRC gen_highpart would end up returning (subreg:SI
> (mem:DI (addr [A8])) 4), while gen_lowpart would simplify the operation
> to (mem:SI (addr [A8])) as expected.
>
> (subreg:SI (mem:DI (addr [A8])) 4) is really problematic, because it's
> not a memory_operand (from the manual: it will get reloaded into a
> register later on).  But that's no good here, I don't want this
> reloading into a wide register later, I need it to be narrowed to the
> component part now.

So maybe calling gen_highpart is not what you want then?
adjust_address is IIRC what one uses to offset a MEM and change
its mode.

Richard.

>
> R.
>
> >
> > Thanks,
> > Richard.
> >
> >>
> >> gcc/ChangeLog:
> >>
> >>          PR target/102125
> >>          * simplify-rtx.c (simplify_context::simplify_subreg): Allow
> >>          simplifying (subreg (mem())) when the inner mem is already
> >>          misaligned for its type.
> >> ---
> >>   gcc/simplify-rtx.c | 6 +++++-
> >>   1 file changed, 5 insertions(+), 1 deletion(-)
> >>

Reply via email to