Commit 9b747072 by Alan Modra Committed by Alan Modra

[RS6000] Correct save_reg_p

Fixes lack of r30 save/restore on

// -m32 -fpic -ftls-model=initial-exec
__thread char* p;
char** f1 (void) { return &p; }

and

// -m32 -fpic -msecure-plt
extern int foo (int);
int f1 (int x) { return foo (x); }

These are both caused by save_reg_p returning false when the pic
offset table reg (r30 for ABI_V4) was used, due to the logic not
exactly matching that in rs6000_emit_prologue to set up r30.

I also noticed that save_reg_p isn't following the comment regarding
calls_eh_return (since svn 267049, git 0edf78b1b2a0), and the comment
needs tweaking too.  For why the revised comment is correct, grep for
saves_all_registers in lra.c, and yes, we do want to save the pic
offset table reg for eh_return.

	PR target/88343
	* config/rs6000/rs6000.c (save_reg_p): Correct calls_eh_return
	case.  Match logic in rs6000_emit_prologue emitting pic_offset_table
	setup.

From-SVN: r268708
parent ddf32191
2019-02-09 Alan Modra <amodra@gmail.com>
PR target/88343
* config/rs6000/rs6000.c (save_reg_p): Correct calls_eh_return
case. Match logic in rs6000_emit_prologue emitting pic_offset_table
setup.
2019-02-08 Vladimir Makarov <vmakarov@redhat.com> 2019-02-08 Vladimir Makarov <vmakarov@redhat.com>
PR middle-end/88560 PR middle-end/88560
......
...@@ -24008,21 +24008,30 @@ rs6000_split_multireg_move (rtx dst, rtx src) ...@@ -24008,21 +24008,30 @@ rs6000_split_multireg_move (rtx dst, rtx src)
static bool static bool
save_reg_p (int reg) save_reg_p (int reg)
{ {
/* We need to mark the PIC offset register live for the same conditions
as it is set up, or otherwise it won't be saved before we clobber it. */
if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE) if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE)
{ {
/* When calling eh_return, we must return true for all the cases /* When calling eh_return, we must return true for all the cases
where conditional_register_usage marks the PIC offset reg where conditional_register_usage marks the PIC offset reg
call used. */ call used or fixed. */
if (crtl->calls_eh_return
&& ((DEFAULT_ABI == ABI_V4 && flag_pic)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic)
|| (TARGET_TOC && TARGET_MINIMAL_TOC)))
return true;
/* We need to mark the PIC offset register live for the same
conditions as it is set up in rs6000_emit_prologue, or
otherwise it won't be saved before we clobber it. */
if (TARGET_TOC && TARGET_MINIMAL_TOC if (TARGET_TOC && TARGET_MINIMAL_TOC
&& (crtl->calls_eh_return && !constant_pool_empty_p ())
|| df_regs_ever_live_p (reg) return true;
|| !constant_pool_empty_p ()))
if (DEFAULT_ABI == ABI_V4
&& (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
&& df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
return true; return true;
if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) if (DEFAULT_ABI == ABI_DARWIN
&& flag_pic && crtl->uses_pic_offset_table) && flag_pic && crtl->uses_pic_offset_table)
return true; return true;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment