[PR67753] adjust for padding when bypassing memory in assign_parm_setup_block
authorAlexandre Oliva <aoliva@redhat.com>
Thu, 26 Nov 2015 21:57:40 +0000 (21:57 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Thu, 26 Nov 2015 21:57:40 +0000 (21:57 +0000)
commit1e5d7fd638ca44b45e9d1a49da0b39e6d0cb1fc7
tree5b030f1af1cc3c775d28f45c3afdaf55906e4e93
parent4d6ca95b9a1deb58a5f4ff81d90ee3a0d75ed330
[PR67753] adjust for padding when bypassing memory in assign_parm_setup_block

Storing a register in memory as a full word and then accessing the
same memory address under a smaller-than-word mode amounts to
right-shifting of the register word on big endian machines.  So, if
BLOCK_REG_PADDING chooses upward padding for BYTES_BIG_ENDIAN, and
we're copying from the entry_parm REG directly to a pseudo, bypassing
any stack slot, perform the shifting explicitly.

This fixes the miscompile of function_return_val_10 in
gcc.target/aarch64/aapcs64/func-ret-4.c for target aarch64_be-elf
introduced in the first patch for 67753.

for  gcc/ChangeLog

PR rtl-optimization/67753
PR rtl-optimization/64164
* function.c (assign_parm_setup_block): Right-shift
upward-padded big-endian args when bypassing the stack slot.

From-SVN: r230985
gcc/ChangeLog
gcc/function.c