Hi!

On Sat, Oct 08, 2016 at 07:53:42PM +0200, Eric Botcazou wrote:
> this fixes reload failures in 64-bit mode with -mcmodel=medium for targets 
> that define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P to 0; that's the case for the 
> VxWorks port we'll submit because of the compatibility with the system 
> linker, 
> which rejects .got sections in object files.
> 
> When reload ends up calling rs6000_emit_move on a register on the LHS and 
> (const (symbol_ref) (const_int)) on the RHS, the function invokes:
> 
>         operands[1] = force_const_mem (mode, operands[1]);
> 
> creating (mem (symbol_ref)), which then needs to be legitimized on TARGET_TOC 
> targets.  That's done by the immediately following block:
> 
>         if (TARGET_TOC
>             && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
>             && constant_pool_expr_p (XEXP (operands[1], 0))
>             && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
>                       get_pool_constant (XEXP (operands[1], 0)),
>                       get_pool_mode (XEXP (operands[1], 0))))
>           {
>             rtx tocref = create_TOC_reference (XEXP (operands[1], 0),
>                                                operands[0]);
>             operands[1] = gen_const_mem (mode, tocref);
>             set_mem_alias_set (operands[1], get_TOC_alias_set ());
>           }
> 
> on most targets, but is disabled if ASM_OUTPUT_SPECIAL_POOL_ENTRY_P is 0.

Why does this not fail on darwin?  It can reach this code afaics, and
it has ASM_OUTPUT_SPECIAL_POOL_ENTRY_P always 0.

> Now you don't need to have a special pool to call create_TOC_reference, you 
> can call it for regular TOC references as well, as done a few lines above:
> 
>       /* If this is a SYMBOL_REF that refers to a constant pool entry,
>        and we have put it in the TOC, we just need to make a TOC-relative
>        reference to it.  */
>       if (TARGET_TOC
>         && GET_CODE (operands[1]) == SYMBOL_REF
>         && use_toc_relative_ref (operands[1], mode))
>       operands[1] = create_TOC_reference (operands[1], operands[0]);
> 
> So the attached patch does it there too.
> 
> Tested on PowerPC64/Linux (LRA) and VxWorks (reload), OK for the mainline?

Not sure yet, will get back to you.  One comment in the meantime...

> --- config/rs6000/rs6000.c    (revision 240888)
> +++ config/rs6000/rs6000.c    (working copy)
> @@ -10590,10 +10590,7 @@ rs6000_emit_move (rtx dest, rtx source,
>  
>         if (TARGET_TOC
>             && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
> -           && constant_pool_expr_p (XEXP (operands[1], 0))
> -           && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
> -                     get_pool_constant (XEXP (operands[1], 0)),
> -                     get_pool_mode (XEXP (operands[1], 0))))
> +           && use_toc_relative_ref (XEXP (operands[1], 0), Pmode))

Use "mode" instead of "Pmode" here?


Segher

Reply via email to