https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78355

--- Comment #3 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #2)
>         if (!SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg))
>             || (MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (innermode)
>                   && SLOW_UNALIGNED_ACCESS (innermode, MEM_ALIGN (reg)))
>             || MEM_ALIGN (reg) >= GET_MODE_ALIGNMENT (mode))
>           return true;
> 
> looks good to me given
> 
> gcc/defaults.h:#define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
> 
> doesn't do that check itself (maybe it and all ports should be fixed
> instead...)

The documentation for SLOW_UNALIGNED_ACCESS implicitly says that it's for
unaligned accesses only:

 -- Macro: SLOW_UNALIGNED_ACCESS (MODE, ALIGNMENT)
     Define this macro to be the value 1 if memory accesses described
     by the MODE and ALIGNMENT parameters have a cost many times greater
     than aligned accesses, for example if they are emulated in a trap
     handler.

and all other uses of SLOW_UNALIGNED_ACCESS in the compiler do it correctly, so
it's an isolated bug in lra-constraints.c.  That being said, I can make the
wording in the documentation stronger.

Reply via email to