Message ID | b677554b8660e0c112f9debb9588b1567219c2c4.1476498617.git.segher@kernel.crashing.org |
---|---|
State | New |
Headers | show |
On Sat, Oct 15, 2016 at 03:00:20AM +0000, Segher Boessenkool wrote: > 2016-10-15 Segher Boessenkool <segher@kernel.crashing.org> > > * config/rs6000/rs6000.c (rs6000_get_separate_components): Do not > make LR a separately shrink-wrapped component if savres_strategy > contains any of {SAVE,REST}_INLINE_{GPRS,FPRS,VRS}. Do not wrap > GPRs if {SAVE,REST}_INLINE_GPRS. Do not disallow all wrapping > when {SAVE,REST}_INLINE_GPRS. Wow I messed that up. * config/rs6000/rs6000.c (rs6000_get_separate_components): Do not make LR a separately shrink-wrapped component unless savres_strategy contains all of {SAVE,REST}_INLINE_{GPRS,FPRS,VRS}. Do not wrap GPRs unless both {SAVE,REST}_INLINE_GPRS. Do not disallow all wrapping when not both {SAVE,REST}_INLINE_GPRS. Segher
On Fri, Oct 14, 2016 at 11:00 PM, Segher Boessenkool <segher@kernel.crashing.org> wrote: > All out-of-line register save routines need LR, so we cannot wrap the > LR component if there are out-of-line saves. This didn't show up for > testing on Linux because none of the tests there use out-of-line FPR > saves without also using out-of-line GPR saves, which we did handle. > > This patch fixes it, and also cleans up code a little. > > Is this okay for trunk? > > > Segher > > > 2016-10-15 Segher Boessenkool <segher@kernel.crashing.org> > > * config/rs6000/rs6000.c (rs6000_get_separate_components): Do not > make LR a separately shrink-wrapped component if savres_strategy > contains any of {SAVE,REST}_INLINE_{GPRS,FPRS,VRS}. Do not wrap > GPRs if {SAVE,REST}_INLINE_GPRS. Do not disallow all wrapping > when {SAVE,REST}_INLINE_GPRS. This is okay. Maybe rs6000 always should prefer inline save-restore when SWS is enabled, except for optimize_size? Thanks, David
On Sat, Oct 15, 2016 at 07:55:47AM -0400, David Edelsohn wrote: > Maybe rs6000 always should prefer inline save-restore when SWS is > enabled, except for optimize_size? Yes, that would be a good optimization probably. try_shrink_wrapping_separate already does nothing unless you have optimize_function_for_speed_p (cfun), so that will do what you want already. Segher
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 1110ee2..df48980 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -27434,27 +27434,29 @@ rs6000_get_separate_components (void) { rs6000_stack_t *info = rs6000_stack_info (); - if (!(info->savres_strategy & SAVE_INLINE_GPRS) - || !(info->savres_strategy & REST_INLINE_GPRS) - || WORLD_SAVE_P (info)) + if (WORLD_SAVE_P (info)) return NULL; sbitmap components = sbitmap_alloc (32); bitmap_clear (components); /* The GPRs we need saved to the frame. */ - int reg_size = TARGET_32BIT ? 4 : 8; - int offset = info->gp_save_offset; - if (info->push_p) - offset += info->total_size; - - for (unsigned regno = info->first_gp_reg_save; regno < 32; regno++) + if ((info->savres_strategy & SAVE_INLINE_GPRS) + && (info->savres_strategy & REST_INLINE_GPRS)) { - if (IN_RANGE (offset, -0x8000, 0x7fff) - && rs6000_reg_live_or_pic_offset_p (regno)) - bitmap_set_bit (components, regno); + int reg_size = TARGET_32BIT ? 4 : 8; + int offset = info->gp_save_offset; + if (info->push_p) + offset += info->total_size; - offset += reg_size; + for (unsigned regno = info->first_gp_reg_save; regno < 32; regno++) + { + if (IN_RANGE (offset, -0x8000, 0x7fff) + && rs6000_reg_live_or_pic_offset_p (regno)) + bitmap_set_bit (components, regno); + + offset += reg_size; + } } /* Don't mess with the hard frame pointer. */ @@ -27467,11 +27469,18 @@ rs6000_get_separate_components (void) || (flag_pic && DEFAULT_ABI == ABI_DARWIN)) bitmap_clear_bit (components, RS6000_PIC_OFFSET_TABLE_REGNUM); - /* Optimize LR save and restore if we can. This is component 0. */ + /* Optimize LR save and restore if we can. This is component 0. Any + out-of-line register save/restore routines need LR. */ if (info->lr_save_p - && !(flag_pic && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN))) + && !(flag_pic && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)) + && (info->savres_strategy & SAVE_INLINE_GPRS) + && (info->savres_strategy & REST_INLINE_GPRS) + && (info->savres_strategy & SAVE_INLINE_FPRS) + && (info->savres_strategy & REST_INLINE_FPRS) + && (info->savres_strategy & SAVE_INLINE_VRS) + && (info->savres_strategy & REST_INLINE_VRS)) { - offset = info->lr_save_offset; + int offset = info->lr_save_offset; if (info->push_p) offset += info->total_size; if (IN_RANGE (offset, -0x8000, 0x7fff))