[PATCH] rs6000: Fix separate shrink-wrapping for TARGET_MULTIPLE

Iain Sandoe iain_sandoe@mentor.com
Mon Oct 17 23:17:00 GMT 2016


Hi Segher,

> On 17 Oct 2016, at 09:13, Segher Boessenkool <segher@kernel.crashing.org> wrote:
> 
> 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).
> 
> Bootstrapped and tested on powerpc64-linux {-m64,-m32}.  I'll commit it
> if Iain's testing (on darwin) also succeeds.

thanks!

All-langs bootstrap was restored with the patch (and others in progress for existing known issues); 

I can’t see any evidence of the assert firing in the test-suite, so it all looks good to me (there’s quite a bit of stage-1-ish testsuite noise at present, however).

cheers
Iain
> 
> 
> 2016-10-17  Segher Boessenkool  <segher@kernel.crashing.org>
> 
> 	* config/rs6000/rs6000.c: Add include of shrink-wrap.h .
> 	(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.
> 
> ---
> gcc/config/rs6000/rs6000.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
> index df48980..83a7139 100644
> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -64,6 +64,7 @@
> #include "target-globals.h"
> #include "builtins.h"
> #include "context.h"
> +#include "shrink-wrap.h"
> #include "tree-pass.h"
> #if TARGET_XCOFF
> #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
> @@ -25506,7 +25507,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
> +      && !(SHRINK_WRAPPING_ENABLED
> +	   && 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.  */
> @@ -27440,6 +27444,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))
> -- 
> 1.9.3
> 



More information about the Gcc-patches mailing list