[RS6000] out-of-line exit register restore funcs
authorAlan Modra <amodra@gmail.com>
Wed, 4 May 2016 21:32:27 +0000 (07:02 +0930)
committerAlan Modra <amodra@gcc.gnu.org>
Wed, 4 May 2016 21:32:27 +0000 (07:02 +0930)
* config/rs6000/rs6000.c (rs6000_savres_strategy): Don't use
out-of-line gpr restore for one or two regs if that would add
a save of lr.

From-SVN: r235907

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

index 772dd37c4ff9bd85a04d1968d8a1dc7422adbb2a..629ee45c06ea6e05a6b1561657d616b2da63a8f4 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-05  Alan Modra  <amodra@gmail.com>
+
+       * config/rs6000/rs6000.c (rs6000_savres_strategy): Don't use
+       out-of-line gpr restore for one or two regs if that would add
+       a save of lr.
+
 2016-05-04  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/70873
index fb522fb6144e2c409f436b8b3bed36d4346b63bc..77092fa3f8b4980c3126d1015044348a7ad22858 100644 (file)
@@ -23422,6 +23422,15 @@ rs6000_savres_strategy (rs6000_stack_t *info,
          }
     }
 
+  /* info->lr_save_p isn't yet set if the only reason lr needs to be
+     saved is an out-of-line save or restore.  Set up the value for
+     the next test (excluding out-of-line gprs).  */
+  bool lr_save_p = (info->lr_save_p
+                   || !(strategy & SAVE_INLINE_FPRS)
+                   || !(strategy & SAVE_INLINE_VRS)
+                   || !(strategy & REST_INLINE_FPRS)
+                   || !(strategy & REST_INLINE_VRS));
+
   if (TARGET_MULTIPLE
       && !TARGET_POWERPC64
       && !(TARGET_SPE_ABI && info->spe_64bit_regs_used)
@@ -23431,15 +23440,6 @@ rs6000_savres_strategy (rs6000_stack_t *info,
         since the store-multiple instruction will always be smaller.  */
       strategy |= SAVE_INLINE_GPRS | SAVE_MULTIPLE;
 
-      /* info->lr_save_p isn't yet set if the only reason lr needs to be
-        saved is an out-of-line save or restore.  Set up the value for
-        the next test (excluding out-of-line gprs).  */
-      bool lr_save_p = (info->lr_save_p
-                       || !(strategy & SAVE_INLINE_FPRS)
-                       || !(strategy & SAVE_INLINE_VRS)
-                       || !(strategy & REST_INLINE_FPRS)
-                       || !(strategy & REST_INLINE_VRS));
-
       /* The situation is more complicated with load multiple.  We'd
         prefer to use the out-of-line routines for restores, since the
         "exit" out-of-line routines can handle the restore of LR and the
@@ -23452,6 +23452,12 @@ rs6000_savres_strategy (rs6000_stack_t *info,
        strategy |= REST_INLINE_GPRS | REST_MULTIPLE;
     }
 
+  /* Using the "exit" out-of-line routine does not improve code size
+     if using it would require lr to be saved and if only saving one
+     or two gprs.  */
+  else if (!lr_save_p && info->first_gp_reg_save > 29)
+    strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
+
   /* We can only use load multiple or the out-of-line routines to
      restore gprs if we've saved all the registers from
      first_gp_reg_save.  Otherwise, we risk loading garbage.