[named address] ice-on-valid: in postreload.c:reload_cse_simplify_operands
Georg-Johann Lay
avr@gjlay.de
Thu Aug 4 17:28:00 GMT 2011
Ulrich Weigand wrote:
> Georg-Johann Lay wrote:
>
>> Trying to make named address space support work for target AVR,
>> I am facing the following problem:
>>
>> For generic AS, there are three valid base pointer registers
>> X , Y and Z.
>>
>> For the new __pgm AS, only Z is available without offset.
>>
>> The problem is now that addresses.h:base_reg_class() does not
>> pass down AS information, i.e. addr_space_t down to target hook
>> MODE_CODE_BASE_REG_CLASS.
>>
>> Likewise for REGNO_MODE_CODE_OK_FOR_BASE_P.
>>
>> The MODE argument that both of these get describe the mode of
>> the MEM but not the mode associated with the AS.
>>
>> Thus, it is not possible to provide proper implementations of
>> these hooks. IRA/reload choses the wrong hard register so
>> that in postreload no constraints match, i.e.
>> TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P returns wrong for that
>> hard register (which is right) so that postreload busts.
>>
>> I'd just like to reassure me that I didn't do something fundamentally
>> wrong and named address space support if not yet smoothly supported
>> in GCC.
>
> No, you're correct. The only target supporting named address spaces
> today is spu-elf, and here we're eliminating any reference to the
> non-default space during expand, so that reload never sees any.
So a solution for me would be to expand as inline asm instead of as
proper insns. Yes, it's hack. But before AS support I tried it via
builtin that expanded as unspec and IRA created horribly bloated code.
The annoyance is that only POST_INC addresses for one single hard reg
is supported by the device. Greetings from spill fails...
> This means that problems like the one you're seeing have been hidden
> so far. I've started looking into fixing this, but since I don't
> have a target where this is needed, this effort never really went
> anywhere. I'll append below a patch I did a year or so ago; just
> as something to look at, it probably will not even apply to the
> current sources any more.
Sounds great that you tried to fix it! Much work below... wow.
> I'd be happy to bring this up to date if you're willing to work with
> me to get this tested on a target that needs this support ...
Just attached a patch to bugzilla because an AVR user wanted to play
with the AS support and asked me to supply my changes. It's still in
a mess but you could get a more reasonable base than on a target where
all named addresses vanish at expand.
The patch is fresh and attached to the enhancement PR49868, just BE stuff.
There is also some sample code.
http://gcc.gnu.org/PR49868
Johann
> Bye,
> Ulrich
>
>
>
> ChangeLog:
>
> * doc/tm.texi (MODE_CODE_BASE_REG_CLASS): Add address space
> argument.
> (REGNO_MODE_CODE_OK_FOR_BASE_P): Likewise.
>
> * config/cris/cris.h (MODE_CODE_BASE_REG_CLASS): Add address
> space argument.
> (REGNO_MODE_CODE_OK_FOR_BASE_P): Likewise.
> * config/bfin/bfin.h (MODE_CODE_BASE_REG_CLASS): Likewise.
> (REGNO_MODE_CODE_OK_FOR_BASE_P): Likewise.
>
> * addresses.h (base_reg_class): Add address space argument.
> Pass to MODE_CODE_BASE_REG_CLASS.
> (ok_for_base_p_1): Add address space argument. Pass to
> REGNO_MODE_CODE_OK_FOR_BASE_P.
> (regno_ok_for_base_p): Add address space argument. Pass to
> ok_for_base_p_1.
>
> * regrename.c (scan_rtx_address): Add address space argument.
> Pass address space to regno_ok_for_base_p and base_reg_class.
> Update recursive calls.
> (scan_rtx): Pass address space to scan_rtx_address.
> (build_def_use): Likewise.
> * regcprop.c (replace_oldest_value_addr): Add address space
> argument. Pass to regno_ok_for_base_p and base_reg_class.
> Update recursive calls.
> (replace_oldest_value_mem): Pass address space to
> replace_oldest_value_addr.
> (copyprop_hardreg_forward_1): Likewise.
>
> * reload.c (find_reloads_address_1): Add address space argument.
> Pass address space to base_reg_class and regno_ok_for_base_p.
> Update recursive calls.
> (find_reloads_address): Pass address space to base_reg_class,
> regno_ok_for_base_p, and find_reloads_address_1.
> (find_reloads): Pass address space to base_reg_class.
> (find_reloads_subreg_address): Likewise.
>
> * ira-costs.c (record_reg_classes): Update calls to base_reg_class.
> (ok_for_base_p_nonstrict): Add address space argument. Pass to
> ok_for_base_p_1.
> (record_address_regs): Add address space argument. Pass to
> base_reg_class and ok_for_base_p_nonstrict. Update recursive calls.
> (record_operand_costs): Pass address space to record_address_regs.
> (scan_one_insn): Likewise.
>
> * caller-save.c (init_caller_save): Update call to base_reg_class.
> * ira-conflicts.c (ira_build_conflicts): Likewise.
> * reload1.c (maybe_fix_stack_asms): Likewise.
More information about the Gcc
mailing list