> 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