On 2020/3/27 07:59, Segher Boessenkool wrote:
> Hi!
>
> On Wed, Mar 25, 2020 at 11:15:22PM -0500, luo...@linux.ibm.com wrote:
>> frame_pointer_needed is set to true in reload pass setup_can_eliminate,
>> but regs_ever_live[31] is false, so pro_and_epilogue doesn't save/restore
>> r31 even it is used actually, causing CPU2006 465.tonto segment fault of
>> loading from invalid addresses.
>
> If df_regs_ever_live_p(31) is false there is no hard frame pointer
> anywhere in the program. How can it be used then?
There is a piece of code emit move instruction to r31 even
df_regs_ever_live_p(31) is false
in pro_and_epilogue. As frame_point_needed is true and frame_pointer_needed is
widely
used in this function, so I propose to save r31 in save_reg_p instead of check
(frame_pointer_needed && df_regs_ever_live_p(31), I haven't verify whether this
works yet).
Is this reasonable? Thanks.
rs6000-logue.c
void
rs6000_emit_prologue (void)
{
...
bbd21807fdf6 (geoffk 2000-03-16 03:16:41 +0000 26840) /* Set frame
pointer, if needed. */
bbd21807fdf6 (geoffk 2000-03-16 03:16:41 +0000 26841) if
(frame_pointer_needed)
bbd21807fdf6 (geoffk 2000-03-16 03:16:41 +0000 26842) {
0d6c02bf24e4 (jakub 2005-06-30 14:26:32 +0000 26843) insn =
emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
bbd21807fdf6 (geoffk 2000-03-16 03:16:41 +0000 26844)
sp_reg_rtx);
bbd21807fdf6 (geoffk 2000-03-16 03:16:41 +0000 26845)
RTX_FRAME_RELATED_P (insn) = 1;
6b02f2a5c61e (meissner 1995-11-30 20:02:16 +0000 26846) }
d1bd513ed578 (kenner 1992-02-09 19:26:21 +0000 26847)
...
}
Xionghu
>
>
> Segher
>