[LRA] Fix ICE for paradoxical subregs on strict-alignment platforms
Vladimir N Makarov
vmakarov@redhat.com
Fri Dec 16 23:15:00 GMT 2016
On 12/13/2016 05:05 PM, Eric Botcazou wrote:
> Hi,
>
> the Ada runtime library doesn't build on SPARC 32-bit with LRA because of an
> ICE on a couple of files:
>
> eric@polaris:~/build/gcc/sparc-sun-solaris2.10> gcc/gnat1 -I gcc/ada/rts -
> quiet -dumpbase g-debpoo.adb -auxbase g-debpoo -O2 -gnatpg -fPIC -mlra -
> mcpu=v9 g-debpoo.adb -o g-debpoo.s
> +===========================GNAT BUG DETECTED==============================+
> | 7.0.0 20161213 (experimental) [trunk revision 243595] (sparc-sun-
> solaris2.10) GCC error:|
> | in lra_set_insn_recog_data, at lra.c:965 |
> | Error detected around g-debpoo.adb:1896:8
>
> The problem is that curr_insn_transform attempts to reload subregs before
> reloading addresses:
>
> if (! check_only_p)
> /* Make equivalence substitution and memory subreg elimination
> before address processing because an address legitimacy can
> depend on memory mode. */
>
> Now, on strict-alignment platforms, simplify_operand_subreg has a special
> provision for paradoxical subregs of memory references:
>
> /* If we change the address for a paradoxical subreg of memory, the
> address might violate the necessary alignment or the access might
> be slow. So take this into consideration. We need not worry
> about accesses beyond allocated memory for paradoxical memory
> subregs as we don't substitute such equiv memory (see processing
> equivalences in function lra_constraints) and because for spilled
> pseudos we allocate stack memory enough for the biggest
> corresponding paradoxical subreg. */
> if (!(MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (mode)
> && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg)))
> || (MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (innermode)
> && SLOW_UNALIGNED_ACCESS (innermode, MEM_ALIGN (reg))))
> return true;
>
> That is to say, if the adjusted memory reference is not sufficient aligned,
> the routine will reload the original memory reference instead of the adjusted
> one on strict-alignment platforms. But there is a hitch: if the address of
> this original memory reference is invalid, the routine will nevertheless
> reload the entire memory reference, leading to the aforementioned ICE.
>
> The proposed fix is to reload the address, if it is invalid, just before
> reloading the memory reference in simplify_operand_subreg; this yields the
> correct sequence of reloads for the case I investigated. The patch also
> contains formatting fixes and adds a 'return' for the sake of clarity.
>
> Tested on x86-64/Linux and SPARC/Solaris with LRA, OK for the mainline?
OK. Thanks for working on this issue, Eric.
The subreg reload code is very sensitive to changes and actually had a
lot of changes. So we should be aware that the patch might create new
PRs. But I believe the probability of this is tiny.
>
> 2016-12-13 Eric Botcazou <ebotcazou@adacore.com>
>
> * lra-constraints.c (process_address): Add forward declaration.
> (simplify_operand_subreg): In the MEM case, if the adjusted memory
> reference is not sufficient aligned and the address was invalid,
> reload the address before reloading the original memory reference.
> Fix long lines and add a final return for the sake of clarity.
>
More information about the Gcc-patches
mailing list