rs6000: Fix separate shrink-wrapping for TARGET_MULTIPLE
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 18 Oct 2016 08:00:00 +0000 (10:00 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 18 Oct 2016 08:00:00 +0000 (10:00 +0200)
We cannot use {SAVE,REST}_MULTIPLE and separate shrink-wrapping together,
not without checking when actually emitting the prologue/epilogue that the
registers to save/restore are actually still one contiguous block up to
(and including) 31.  So either:

1) We delay the decision of whether to use lmw/stmw to later;
2) We disallow shrink-wrapping separate (integer) components when those
strategies are selected; or
3) We don't use those strategies if we use separate shrink-wrapping.

This patch does 3).  In the long term it may be best to do 1) instead,
it can be slightly more efficient.

This caused problems on darwin (it is the only config that uses lmw/stmw
instructions by default).

* config/rs6000/rs6000.c (rs6000_savres_strategy): Do not select
{SAVE,REST}_MULTIPLE if shrink-wrapping separate components.
(rs6000_get_separate_components): Assert we do not have those
strategies selected.

From-SVN: r241297

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

index 77fef0623550ec8cacd07224b3f4d23ebcdaf0cd..9e986643c562dffd54f0810c9de2add511161f0f 100644 (file)
@@ -1,3 +1,10 @@
+2016-10-18  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/rs6000.c (rs6000_savres_strategy): Do not select
+       {SAVE,REST}_MULTIPLE if shrink-wrapping separate components.
+       (rs6000_get_separate_components): Assert we do not have those
+       strategies selected.
+
 2016-10-18  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-propagate.h (substitute_and_fold): Adjust prototype.
index 27611876b4fb853a5c962f039747eee74d9cd083..2406d5c64b00a58353dc87c2f125ad619b8b5970 100644 (file)
@@ -25518,7 +25518,10 @@ rs6000_savres_strategy (rs6000_stack_t *info,
   if (TARGET_MULTIPLE
       && !TARGET_POWERPC64
       && !(TARGET_SPE_ABI && info->spe_64bit_regs_used)
-      && info->first_gp_reg_save < 31)
+      && info->first_gp_reg_save < 31
+      && !(flag_shrink_wrap
+          && flag_shrink_wrap_separate
+          && optimize_function_for_speed_p (cfun)))
     {
       /* Prefer store multiple for saves over out-of-line routines,
         since the store-multiple instruction will always be smaller.  */
@@ -27452,6 +27455,9 @@ rs6000_get_separate_components (void)
   sbitmap components = sbitmap_alloc (32);
   bitmap_clear (components);
 
+  gcc_assert (!(info->savres_strategy & SAVE_MULTIPLE)
+             && !(info->savres_strategy & REST_MULTIPLE));
+
   /* The GPRs we need saved to the frame.  */
   if ((info->savres_strategy & SAVE_INLINE_GPRS)
       && (info->savres_strategy & REST_INLINE_GPRS))