RFA: Fix ICE on PARALLEL returns when expand builtins

Richard Biener richard.guenther@gmail.com
Thu Jan 3 09:14:00 GMT 2013


On Wed, Jan 2, 2013 at 5:36 PM, Richard Sandiford
<rdsandiford@googlemail.com> wrote:
> Richard Biener <richard.guenther@gmail.com> writes:
>> On Sun, Dec 23, 2012 at 10:43 AM, Richard Sandiford
>> <rdsandiford@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.  I'm suggesting sth like

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);

(I suppose we can even use force_reg (GET_MODE (tmp), tmp) here - it shouldn't
be VOIDmode ever as its of FP type).

Richard.

> Richard



More information about the Gcc-patches mailing list