On 1/4/21 4:46 AM, Richard Sandiford via Gcc-patches wrote:
> This patch fixes a mode/rtx mismatch for ILP32 targets in:
>
> mem = force_const_mem (ptr_mode, imm);
>
> where imm can be Pmode rather than ptr_mode.
>
> The patch uses convert_memory_address to convert the Pmode address
> to ptr_mode before the call. However, immediate addresses can in
> general contain unspecs, and convert_memory_address wasn't set up
> to handle those.
>
> The patch therefore adds some generic unspec handling to
> convert_memory_address_addr_space_1. As the comment says, we can add
> a target hook if this behaviour turns out to be wrong for some targets.
> But I think what the patch does is a strict improvement over the status
> quo: without it, we would try to force the unspec into a register,
> but nevertheless wrap the result in a (const ...). That in turn
> would be invalid rtl and seems bound to generate an ICE later.
>
> I tested the explow.c part using -fstack-protector with local hacks
> to force SYMBOL_FORCE_TO_MEM for UNSPEC_SALT_ADDR.
>
> Fixes c-c++-common/torture/pr57945.c and various other tests.
>
> Tested on aarch64-linux-gnu, aarch64_be-elf and x86_64-linux-gnu.
> OK for the explow bits?
>
> Richard
>
>
> gcc/
> PR target/97269
> * explow.c (convert_memory_address_addr_space_1): Handle UNSPECs
> nested in CONSTs.
> * config/aarch64/aarch64.c (aarch64_expand_mov_immediate): Use
> convert_memory_address to convert symbolic immediates to ptr_mode
> before forcing them to memory.
OK. I can't think of a case where the operand-by-operand conversion
wouldn't work, but as we both know, targets sometimes to "odd" things.
So a conditional ACK and we'll see how the various targets in the tester
respond.
jeff