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
> 

Reply via email to