[RFA]: Fix reload of paradoxical subreg on big-endian platforms when reg is in memory
Stephane Carrez
stcarrez@nerim.fr
Sun Apr 13 18:51:00 GMT 2003
Hi!
Jan Hubicka wrote:
>>Hi!
>>
>>Jan Hubicka wrote:
>>
>>>>Hi!
>>>>
>>>>I've found a reload problem with paradoxical subregs on big-endian
>>>>platforms.
>>>>When a register is in memory and its paradoxical subreg is reloaded, we
>>>>compute its address but we come up with a wrong address representing the
>>>>high part instead of the low part. It is a regression compared to 3.0.4.
>>>
>>>
>>>It seems to be that it is invlid to reload paradoxical memory subreg
>>>without reloading the inner value first, because we may access
>>>unintialized or missaligned memory. Perhaps reload_inner_reg_of_subreg
>>>needs extra check?
>>>
>>>Honza
>>>
>>
>>No because reload_inner_reg_of_subreg() is called only from
>>push_reload()/combine_reloads()
>>and it's too late. It can only deal with a hard reg not in the good class.
>>
>>The register is in memory (reg_equiv_memory_loc[regno] != 0) and
>>find_reloads_toplev
>>together with find_reloads_subreg_address will reload that memory rtx.
>
>
> Then I believe that find_reloads_subreg_address is wrong here because we
> result in wrong memory access. Other palce, like combiner or
Yes; this is what my patch fixes
> reload_inner_reg_of_subreg special case this. One simply can elliminat
> paradoxical subreg on memory.
> In fact I do have separate patch for subreg in addresses reloading in
> the queue. Perhaps it is the answer to your testcase too?
> http://gcc.gnu.org/ml/gcc-patches/2003-04/msg00379.html
> It was designed for different problem, but the code in question should
> deal correctly with paradoxical subregs as well.
>
It does not solve it because find_reloads_subreg_address() is called from
find_reloads_toplev() (near lines 4504) but your patch fixes a subreg problem in
find_reloads_address_1(). FYI, backtract when pb occurs
#0 find_reloads_subreg_address (x=0x401c2918, force_replace=1, opnum=1,
type=RELOAD_FOR_INPUT_ADDRESS, ind_levels=0, insn=0x401c52ec) at reload.c:5882
#1 0x081828f7 in find_reloads_toplev (x=0x401c2918, opnum=1, type=RELOAD_FOR_INPUT_ADDRESS,
ind_levels=0, is_set_dest=0, insn=0x401c52ec, address_reloaded=0xbfffeda4) at reload.c:4504
#2 0x0817db26 in find_reloads (insn=0x401c52ec, replace=0, ind_levels=0, live_known=1,
reload_reg_p=0x8352740) at reload.c:2708
In my case find_reloads_address_1() is called on the memory location (with wrong offset)
and not on the SUBREG (which your patch manages).
Stephane
More information about the Gcc-patches
mailing list