On Mon, Mar 26, 2012 at 10:41 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Mon, Mar 26, 2012 at 10:25 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> Hello!
>>
>> In a corner case of a reload, reload pass can generate partially
>> reloaded address, where not all registers get allocated to a hard reg.
>> When this address is checked with ix86_legitimate_address, it is
>> rejected, since in strict mode, pseudos are not valid address
>> registers. So, reload tries to legitimize following (partially
>> invalid) address:
>>
>>     (plus:DI (plus:DI (unspec:DI [(const_int 0 [0])] UNSPEC_TP)
>>                       (reg:DI 97))
>>              (reg:DI 2 cx))
>>
>> via generic way by pushing all components into a register, forming
>> (even more invalid) address that involves three registers (r8, r9 and
>> rcx):
>>
>> (insn 52 78 53 5 (set (mem/j:QI (plus:DI (plus:DI (reg:DI 37 r8)
>>                    (reg:DI 38 r9))
>>                (reg:DI 2 cx [orig:98 D.1709 ] [98])) [0 foo S1 A8])
>>        (reg:QI 1 dx [100])) /tmp/x.c:12 66 {*movqi_internal}
>>     (nil))
>>
>> BTW: x86 declares MAX_REGISTER_PER_ADDRESS to 2...
>>
>> Attached patch fixes this situation by (partially) reloading only
>> remaining pseudo(s), leaving UNSPEC in the address RTX.
>>
>> 2012-03-26  Uros Bizjak  <ubiz...@gmail.com>
>>
>>        PR target/52698
>>        * config/i386/i386-protos.h (ix86_legitimize_reload_address):
>>        New prototype.
>>        * config/i386/i386.h (LEGITIMIZE_RELOAD_ADDRESS): New define.
>>        * config/i386/i386.c: Include reload.h.
>>        (ix86_legitimize_reload_address): New function.
>>
>> testsuite/ChangeLog:
>>
>> 2012-03-26  Uros Bizjak  <ubiz...@gmail.com>
>>            H.J. Lu  <hongjiu...@intel.com>
>>
>>        PR target/52698
>>        * gcc.target/i386/pr52698.c: New test.
>>
>> The patch was bootstrapped and regression tested on x86_64-pc-linux-gnu 
>> {,-m32}.
>>
>> Since fixing reload issues is some kind of black magic, I'd like to
>> ask Ulrich and Richard for their opinion on this approach.
>>
>> H.J., can you please test this fix on x32 testsuite for both address modes?
>>
>
> I am on it.

There are no regressions in gcc x32 testsuite nor glibc tests for
both address modes. But I didn't check code quality nor SPEC CPU
performance.

-- 
H.J.

Reply via email to