On Fri, Feb 08, 2019 at 11:13:50AM +1030, Alan Modra wrote:
>       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, simplifying ABI_V4 case to df_regs_ever_live_p.

That one regressed gcc.dg/20020312-2.c, due to my "cleverness" in
simplifying the ABI_V4 case.  This one passes regression testing.
OK to apply?

        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.

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index cced90bb518..b4908c4f795 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -24008,21 +24008,30 @@ rs6000_split_multireg_move (rtx dst, rtx src)
 static bool
 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)
     {
       /* When calling eh_return, we must return true for all the cases
         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
-         && (crtl->calls_eh_return
-             || df_regs_ever_live_p (reg)
-             || !constant_pool_empty_p ()))
+         && !constant_pool_empty_p ())
+       return true;
+
+      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;
 
-      if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
+      if (DEFAULT_ABI == ABI_DARWIN
          && flag_pic && crtl->uses_pic_offset_table)
        return true;
     }


-- 
Alan Modra
Australia Development Lab, IBM

Reply via email to