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(-) > >>