Commit 14f00213 by Franz Sirl Committed by Franz Sirl

re PR target/9732 ([ppc32] Wrong code with -O2 -fPIC)

	2003-02-25  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>

	PR target/9732
	* config/rs6000/rs6000.c (first_reg_to_save): Handle
	PIC_OFFSET_TABLE_REGNUM for -fPIC too.
	(rs6000_emit_prologue): Likewise.
	(rs6000_emit_epilogue): Likewise.
	* config/rs6000/rs6000.h (CONDITIONAL_REGISTER_USAGE): Make
	PIC_OFFSET_TABLE_REGNUM a fixed register for -fPIC.

From-SVN: r63423
parent 8164b171
2003-02-25 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
PR target/9732
* config/rs6000/rs6000.c (first_reg_to_save): Handle
PIC_OFFSET_TABLE_REGNUM for -fPIC too.
(rs6000_emit_prologue): Likewise.
(rs6000_emit_epilogue): Likewise.
* config/rs6000/rs6000.h (CONDITIONAL_REGISTER_USAGE): Make
PIC_OFFSET_TABLE_REGNUM a fixed register for -fPIC.
2003-02-25 Richard Henderson <rth@redhat.com> 2003-02-25 Richard Henderson <rth@redhat.com>
* real.c (real_to_integer2): Force overflow result only for * real.c (real_to_integer2): Force overflow result only for
......
...@@ -8918,7 +8918,7 @@ first_reg_to_save () ...@@ -8918,7 +8918,7 @@ first_reg_to_save ()
if (regs_ever_live[first_reg] if (regs_ever_live[first_reg]
&& (! call_used_regs[first_reg] && (! call_used_regs[first_reg]
|| (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
&& ((DEFAULT_ABI == ABI_V4 && flag_pic == 1) && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic))))) || (DEFAULT_ABI == ABI_DARWIN && flag_pic)))))
break; break;
...@@ -10503,7 +10503,7 @@ rs6000_emit_prologue () ...@@ -10503,7 +10503,7 @@ rs6000_emit_prologue ()
if ((regs_ever_live[info->first_gp_reg_save+i] if ((regs_ever_live[info->first_gp_reg_save+i]
&& ! call_used_regs[info->first_gp_reg_save+i]) && ! call_used_regs[info->first_gp_reg_save+i])
|| (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
&& ((DEFAULT_ABI == ABI_V4 && flag_pic == 1) && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic)))) || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
{ {
rtx addr, reg, mem; rtx addr, reg, mem;
...@@ -10919,7 +10919,7 @@ rs6000_emit_epilogue (sibcall) ...@@ -10919,7 +10919,7 @@ rs6000_emit_epilogue (sibcall)
if ((regs_ever_live[info->first_gp_reg_save+i] if ((regs_ever_live[info->first_gp_reg_save+i]
&& ! call_used_regs[info->first_gp_reg_save+i]) && ! call_used_regs[info->first_gp_reg_save+i])
|| (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
&& ((DEFAULT_ABI == ABI_V4 && flag_pic == 1) && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic)))) || (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
{ {
rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx,
......
...@@ -990,6 +990,10 @@ extern int rs6000_default_long_calls; ...@@ -990,6 +990,10 @@ extern int rs6000_default_long_calls;
= call_really_used_regs[i] = 1; \ = call_really_used_regs[i] = 1; \
if (DEFAULT_ABI == ABI_V4 \ if (DEFAULT_ABI == ABI_V4 \
&& PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM \ && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM \
&& flag_pic == 2) \
fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1; \
if (DEFAULT_ABI == ABI_V4 \
&& PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM \
&& flag_pic == 1) \ && flag_pic == 1) \
fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \ fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \
= call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \ = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \
......
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