diff options
author | Franz Sirl <Franz.Sirl-kernel@lauterbach.com> | 2003-02-25 23:11:55 +0000 |
---|---|---|
committer | Franz Sirl <sirl@gcc.gnu.org> | 2003-02-25 23:11:55 +0000 |
commit | 14f00213a7d7b42f836200e3f9650677caabff15 (patch) | |
tree | 5b1471a85fa181b5a5a2f3d4232a349c2d9b0ee8 | |
parent | 8164b17107f599ed129b0574236e3738fa43dbef (diff) | |
download | gcc-14f00213a7d7b42f836200e3f9650677caabff15.zip gcc-14f00213a7d7b42f836200e3f9650677caabff15.tar.gz gcc-14f00213a7d7b42f836200e3f9650677caabff15.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.h | 4 |
3 files changed, 17 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eb767ce..3bc23a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +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> * real.c (real_to_integer2): Force overflow result only for diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index c26c446..9189614 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -8918,7 +8918,7 @@ first_reg_to_save () if (regs_ever_live[first_reg] && (! call_used_regs[first_reg] || (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))))) break; @@ -10503,7 +10503,7 @@ rs6000_emit_prologue () if ((regs_ever_live[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 - && ((DEFAULT_ABI == ABI_V4 && flag_pic == 1) + && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0) || (DEFAULT_ABI == ABI_DARWIN && flag_pic)))) { rtx addr, reg, mem; @@ -10919,7 +10919,7 @@ rs6000_emit_epilogue (sibcall) if ((regs_ever_live[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 - && ((DEFAULT_ABI == ABI_V4 && flag_pic == 1) + && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0) || (DEFAULT_ABI == ABI_DARWIN && flag_pic)))) { rtx addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 744b6bc..da04dc0 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -990,6 +990,10 @@ extern int rs6000_default_long_calls; = call_really_used_regs[i] = 1; \ if (DEFAULT_ABI == ABI_V4 \ && 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) \ fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \ = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \ |