> I hit one problem building libgfortran for mips64-linux-gnu.
> The calls.c change was:
> 
> Index: calls.c
> ===================================================================
> --- calls.c   (revision 191198)
> +++ calls.c   (working copy)
> @@ -3272,16 +3272,8 @@ expand_call (tree exp, rtx target, int i
>        else if (GET_CODE (valreg) == PARALLEL)
>       {
>         if (target == 0)
> -         {
> -           /* This will only be assigned once, so it can be readonly.  */
> -           tree nt = build_qualified_type (rettype,
> -                                           (TYPE_QUALS (rettype)
> -                                            | TYPE_QUAL_CONST));
> -
> -           target = assign_temp (nt, 1, 1);
> -         }
> -
> -       if (! rtx_equal_p (target, valreg))
> +         target = emit_group_move_into_temps (valreg);
> +       else if (!rtx_equal_p (target, valreg))
>           emit_group_store (target, valreg, rettype,
>                             int_size_in_bytes (rettype));
> 
>         /* We can not support sibling calls for this case.  */
>         sibcall_failure = 1;
> 
> But if we're trying to use a sibcall, we go through this loop twice,
> and the second iteration has to cope with a PARALLEL target created
> by the first.  How about the patch below?  Tested on mips64-linux-gnu,
> where a full testrun looked good.

Fine with me, thanks.  I'm a little puzzled that I didn't run into this myself.

> In some ways it's a bit silly to emit anything at all in the first
> iteration, given that we then go on to set sibcall_failure.  It's not the
> kind of loop we can just continue out of though.  Also, your patch
> probably means that we only need to set sibcall_failure for the
> emit_group_store case, although I've not tested that.

Good point, I'll give it a try.

-- 
Eric Botcazou

Reply via email to