Commit 8f784f6b by Segher Boessenkool Committed by Segher Boessenkool

rs6000: Fix separate shrink-wrapping for TARGET_MULTIPLE

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
parent 62869a1c
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> 2016-10-18 Richard Biener <rguenther@suse.de>
* tree-ssa-propagate.h (substitute_and_fold): Adjust prototype. * tree-ssa-propagate.h (substitute_and_fold): Adjust prototype.
......
...@@ -25518,7 +25518,10 @@ rs6000_savres_strategy (rs6000_stack_t *info, ...@@ -25518,7 +25518,10 @@ rs6000_savres_strategy (rs6000_stack_t *info,
if (TARGET_MULTIPLE if (TARGET_MULTIPLE
&& !TARGET_POWERPC64 && !TARGET_POWERPC64
&& !(TARGET_SPE_ABI && info->spe_64bit_regs_used) && !(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, /* Prefer store multiple for saves over out-of-line routines,
since the store-multiple instruction will always be smaller. */ since the store-multiple instruction will always be smaller. */
...@@ -27452,6 +27455,9 @@ rs6000_get_separate_components (void) ...@@ -27452,6 +27455,9 @@ rs6000_get_separate_components (void)
sbitmap components = sbitmap_alloc (32); sbitmap components = sbitmap_alloc (32);
bitmap_clear (components); bitmap_clear (components);
gcc_assert (!(info->savres_strategy & SAVE_MULTIPLE)
&& !(info->savres_strategy & REST_MULTIPLE));
/* The GPRs we need saved to the frame. */ /* The GPRs we need saved to the frame. */
if ((info->savres_strategy & SAVE_INLINE_GPRS) if ((info->savres_strategy & SAVE_INLINE_GPRS)
&& (info->savres_strategy & REST_INLINE_GPRS)) && (info->savres_strategy & REST_INLINE_GPRS))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment