This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Help with reload and naked constant sum causing ICE
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: Andy H <hutchinsonandy at aim dot com>
- Cc: GCC Development <gcc at gcc dot gnu dot org>
- Date: Tue, 27 May 2008 23:37:23 +0100
- Subject: Re: Help with reload and naked constant sum causing ICE
- References: <483AD976.8020108@aim.com>
Andy H <hutchinsonandy@aim.com> writes:
> I am am tracking down ICE bug in reload during global register allocation.
>
> I have managed to find root of problem but I am not sure how it should
> work correctly. I would appreciate anyones advise on this.
>
> ICE is from assert in push_reload to ensure that pseudos have been
> replaced with hard register or constants. (reload.c line 940 or so)
> It fails because pseudo equivalent of constant is not (yet) replaced
> for IN.
>
> The sequence of event that causes this to occur is something like this.
>
> 1) Psuedo p68 is marked as equivalent to constant
> reg_equiv_constant[68]=(symbol_ref:HI ("chk_fail_buf") [flags 0x40]
> <var_decl 0x7fe00000 chk_fail_buf>)
>
> 2) p68+2 is also needed
> (plus:HI (reg/f:HI 68)
> (const_int 2 [0x2]))
>
> 3) find_reloads_address is given p68+2 by find_reloads()
>
> 4) p68+2 is STRICTLY checked as memory address - and target rejects it
> as it has no outer constant and contains psuedo.
> if (strict_memory_address_p (mode, ad))
>
> 5) find_reloads_address then uses LEGITIMIZE_RELOAD_ADDRESS to fix problem
>
> 6) LEGITIMIZE_RELOAD_ADDRESS calls push_reload to reload p68 using
> BASE_POINTER
>
> 7)ICE
> [...]
> Perhaps LEGITIMIZE_RELOAD should fix problem - though that seems odd.
TBH, it sounds like the opposite: LEGITIMIZE_RELOAD_ADDRESS should
not be handling this address at all. If L_R_A does nothing with it,
the normal reload handling will first try:
(const:HI (plus:HI (symbol_ref:HI ("chk_fail_buf") (const_int 2))))
If that's legitimate, that's the address you'll get. If it isn't,
the normal reload handling will reload the symbol_ref into a
base register of class:
MODE_CODE_BASE_REG_CLASS (mem_mode, PLUS, CONST_INT)
And it sounds from your message like that's exactly what you want.
Richard