On 9 January 2017 at 12:14, Richard Biener <richard.guent...@gmail.com> wrote:
> On Mon, Jan 9, 2017 at 11:43 AM, Eric Botcazou <ebotca...@adacore.com> wrote:
>> Hi,
>>
>> this is a regression present on all active branches for big-endian targets
>> returning small aggregate types in registers under certain circumstances and
>> when optimization is enabled: when the bitfield path of store_field is taken,
>> the function ends up calling store_bit_field to store the value.  Now the
>> behavior of store_bit_field is awkward when the mode is BLKmode: it always
>> takes its value from the lsb up to the word size but expects it left 
>> justified
>> beyond it (see expmed.c:890 and below) and I missed that when I got rid of 
>> the
>> stack temporaries that were originally generated in that case.
>>
>> Of course that's OK for little-endian targets but not for big-endian targets,
>> and I have a couple of C++ testcases exposing the issue on SPARC 64-bit and a
>> couple of Ada testcases exposing the issue on PowerPC with the SVR4 ABI (the
>> Linux ABI is immune since it always returns on the stack); I think they cover
>> all the cases in the problematic code.
>>
>> The attached fix was tested on a bunch of platforms: x86/Linux, x86-64/Linux,
>> PowerPC/Linux, PowerPC64/Linux, PowerPC/VxWorks, Aarch64/Linux, SPARC/Solaris
>> and SPARC64/Solaris with no regressions.  OK for the mainline? other 
>> branches?
>
> Ok for trunk and branches after a short burn-in.
>

Hi Eric,

I have noticed new failures after this commit (r244249).
g++.dg/opt/call3.C fails at execution on armeb targets
g++.dg/opt/call2.C fails at execution on aarch64_be

Christophe




> Thanks,
> Richard.
>
>>
>> 2017-01-09  Eric Botcazou  <ebotca...@adacore.com>
>>
>>         * expr.c (store_field): In the bitfield case, if the value comes from
>>         a function call and is of an aggregate type returned in registers, do
>>         not modify the field mode; extract the value in all cases if the mode
>>         is BLKmode and the size is not larger than a word.
>>
>>
>> 2017-01-09  Eric Botcazou  <ebotca...@adacore.com>
>>
>>         * g++.dg/opt/call2.C: New test.
>>         * g++.dg/opt/call3.C: Likewise.
>>         * gnat.dg/array26.adb: New test.
>>         * gnat.dg/array26_pkg.ad[sb]: New helper.
>>         * gnat.dg/array27.adb: New test.
>>         * gnat.dg/array27_pkg.ad[sb]: New helper.
>>         * gnat.dg/array28.adb: New test.
>>         * gnat.dg/array28_pkg.ad[sb]: New helper.
>>
>> --
>> Eric Botcazou

Reply via email to