re PR target/9732 ([ppc32] Wrong code with -O2 -fPIC)
authorFranz Sirl <Franz.Sirl-kernel@lauterbach.com>
Tue, 25 Feb 2003 23:11:55 +0000 (23:11 +0000)
committerFranz Sirl <sirl@gcc.gnu.org>
Tue, 25 Feb 2003 23:11:55 +0000 (23:11 +0000)
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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h

index eb767ceeb57e2bd1d5a7bf596e1c417bdfe2f213..3bc23a7ecf4390e5aa57b9e8ba7d60fcd5e39109 100644 (file)
@@ -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
index c26c4463b34d63355d0cfe91e52eb0d8b970753b..9189614484a7de5011e0ae6b766d0b68061f2da5 100644 (file)
@@ -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, 
index 744b6bc4aa17e089e7d7b2529748333cfb2f2fb2..da04dc02fe7786a7c0cca24be86a42e39b7171e3 100644 (file)
@@ -988,6 +988,10 @@ extern int rs6000_default_long_calls;
     for (i = 32; i < 64; i++)                                          \
       fixed_regs[i] = call_used_regs[i]                                        \
         = 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)                                                        \