This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: SH: PR target/24445


Kaz Kojima <kkojima@rr.iij4u.or.jp> writes:

> --- ORIG/trunk/gcc/calls.c	2005-10-29 06:52:11.000000000 +0900
> +++ LOCAL/trunk/gcc/calls.c	2005-11-03 09:15:47.000000000 +0900
> @@ -2774,6 +2774,17 @@ expand_call (tree exp, rtx target, int i
>  	  emit_insn (insns);
>  	  valreg = temp;
>  	}
> +      /* We have to copy a return value in a CLASS_LIKELY_SPILLED hard
> +	 reg to a plain register, even for pure functions.  */
> +      else if (pass && (flags & ECF_PURE)
> +	       && REGNO (valreg) < FIRST_PSEUDO_REGISTER
> +	       && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (valreg))))
> +	{
> +	  rtx temp = gen_reg_rtx (GET_MODE (valreg));
> +
> +	  emit_move_insn (temp, valreg);
> +	  valreg = temp;
> +	}
>  
>        /* For calls to `setjmp', etc., inform flow.c it should complain
>  	 if nonvolatile values are live.  For functions that cannot return,

I don't see what this has to do with pure functions.

It seems to me that instead you want to put something here:

      else if (target
	       && GET_MODE (target) == TYPE_MODE (TREE_TYPE (exp))
	       && GET_MODE (target) == GET_MODE (valreg))
	{
	  /* TARGET and VALREG cannot be equal at this point because the
	     latter would not have REG_FUNCTION_VALUE_P true, while the
	     former would if it were referring to the same register.

	     If they refer to the same register, this move will be a no-op,
	     except when function inlining is being done.  */
	  emit_move_insn (target, valreg);

i.e.

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

Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]