This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: SH: PR target/24445
Joern RENNECKE <joern.rennecke@st.com> wrote:
>>[.expand after the patch]
>>(set (reg/f:SI 160) (const:SI (unspec [(symbol_ref:SI ("baz"))] 7)))
>>(set (reg:SI 161) (plus:SI (reg:SI 12 r12) (reg/f:SI 160)))
>>(set (reg/f:SI 159) (mem/u/c:SI (reg:SI 161)))
>>(set (reg:SI 0 r0) (call (mem:SI (symbol_ref:SI ("bar")))))
>>(set (mem/c/i:SI (reg/f:SI 159)) (reg:SI 0 r0)))
>>
>>
> The last insn is invalid. Before reload, a return value in a
> CLASS_LIKELY_SPILLED
> hard reg cannot be used in arbitrary instructions, but has to be copied
> to a plain register
> first.
Thanks for pointing it out. Now I'm testing the patch below.
How does it look like?
Regards,
kaz
--
--- 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,