Kaz Kojima <[EMAIL PROTECTED]> writes:

> Like this?
> 
> @@ -2861,6 +2861,12 @@ expand_call (tree exp, rtx target, int i
>  
>            If they refer to the same register, this move will be a no-op,
>            except when function inlining is being done.  */
> +       /* We have to copy a return value in a CLASS_LIKELY_SPILLED hard
> +          reg to a plain register.  */
> +       if (REG_P (valreg)
> +           && HARD_REGISTER_P (valreg)
> +           && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (valreg))))
> +         valreg = copy_to_reg (valreg);
>         emit_move_insn (target, valreg);
>  
>         /* If we are setting a MEM, this code must be executed.  Since it is

In general, yes.  But looking at it we should probably only call
copy_to_reg if TARGET is not itself a pseudo-register.

And I think I would put the new code before the "TARGET and VALREG
cannot be equal" comment.

That patch is OK if it works and passes testing, and if you add a test
case and a ChangeLog entry.

Thanks.

Ian

Reply via email to