Richard Biener <richard.guent...@gmail.com> writes:
> On Wed, Jan 2, 2013 at 5:36 PM, Richard Sandiford
> <rdsandif...@googlemail.com> wrote:
>> Richard Biener <richard.guent...@gmail.com> writes:
>>> On Sun, Dec 23, 2012 at 10:43 AM, Richard Sandiford
>>> <rdsandif...@googlemail.com> wrote:
>>>> Some of the maths builtins can expand to a call followed by a bit
>>>> of postprocessing.  With 4.8's PARALLEL return optimisations, these
>>>> embedded calls might return a PARALLEL of pseudos, but the postprocessing
>>>> isn't prepared to deal with that.  This leads to an ICE in builtins-53.c
>>>> on n32 and n64 mips64-linux-gnu.
>>>>
>>>> One fix might have been to pass an explicit register target to the
>>>> expand routines, but that target's only a hint.  This patch instead
>>>> adds an avoid_group_rtx function (named after gen_group_rtx) to convert
>>>> PARALLELs to pseudos where necessary.
>>>>
>>>> I wondered whether it was really safe for expand_builtin_int_roundingfn_2
>>>> to pass "target == const0_rtx" as the "ignore" parameter to expand_call,
>>>> given that we don't actually ignore the return value ourselves
>>>> (even if the caller does).  I suppose it is safe though,
>>>> since expand_call will always return const0_rtx in that case,
>>>> and this code is dealing with integer return values.
>>>>
>>>> Tested on mips64-linux-gnu.  OK to install?  Or is there a better way?
>>>
>>> You didn't add a testcase so I can't check myself
>>
>> It's gcc.dg/builtins-53.c.
>>
>>> - but why isn't using force_reg enough here?  I can imagine other
>>> cases than PARALLELs that are not well handled, no?
>>
>> Not sure either way TBH.  Fortunately expanding your own calls seems
>> to be pretty rare.
>>
>> But yeah, having force_reg (or I suppose force_operand) do it sounds
>> good in principle.  The problem is that the operation needs the type
>> tree, which the force_* routines don't have.
>
> Hm?  force_reg/operand only need a mode.
>
> Index: builtins.c
> ===================================================================
> *** builtins.c  (revision 194787)
> --- builtins.c  (working copy)
> *************** expand_builtin_int_roundingfn (tree exp,
> *** 2760,2765 ****
> --- 2760,2766 ----
>
>     /* Truncate the result of floating point optab to integer
>        via expand_fix ().  */
> +   tmp = force_reg (TYPE_MODE (TREE_TYPE (TREE_TYPE (fallback_fndecl))), 
> tmp);
>     target = gen_reg_rtx (mode);
>     expand_fix (target, tmp, 0);

What I mean is: force_operand doesn't convert PARALLELs of pseudos
to single pseudos, so this won't work as-is.  And we can't make
force_operand do the conversion using the current emit_group_store
machinery because emit_group_store needs access to the type (in order
to work out the padding), which force_operand doesn't have.

Richard

Reply via email to