From da88ea0265af5c877429a0c096cfdc0d4b3fecaa Mon Sep 17 00:00:00 2001 From: James Greenhalgh Date: Wed, 7 Dec 2016 14:01:59 +0000 Subject: [PATCH] [Patch PR78561 PowerPC] Revert to old behaviour for counting constant pools gcc/ PR rtl-optimization/78561 * config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p) Use constant_pool_empty_p in place of get_pool_size_upper_bound. (rs6000_stack_info): Likewise. (rs6000_emit_prologue): Likewise. (rs6000_elf_declare_function_name): Likewise. (rs6000_set_up_by_prologue): Likewise. (rs6000_can_eliminate): Likewise. * output.h (get_pool_size_upper_bound): Delete. (constant_pool_empty_p): New. * varasm.c (get_pool_size_upper_bound): Delete (constant_pool_empty_p): New. From-SVN: r243345 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/config/rs6000/rs6000.c | 14 +++++++------- gcc/output.h | 9 ++++----- gcc/varasm.c | 10 ++++++---- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f765705026..fbe5bbedc95 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2016-12-07 James Greenhalgh + + PR rtl-optimization/78561 + * config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p) Use + constant_pool_empty_p in place of get_pool_size_upper_bound. + (rs6000_stack_info): Likewise. + (rs6000_emit_prologue): Likewise. + (rs6000_elf_declare_function_name): Likewise. + (rs6000_set_up_by_prologue): Likewise. + (rs6000_can_eliminate): Likewise. + * output.h (get_pool_size_upper_bound): Delete. + (constant_pool_empty_p): New. + * varasm.c (get_pool_size_upper_bound): Delete + (constant_pool_empty_p): New. + 2016-12-07 Bin Cheng PR tree-optimization/78691 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 59bd3fe5989..b75a290da6a 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -25460,7 +25460,7 @@ rs6000_reg_live_or_pic_offset_p (int reg) if (TARGET_TOC && TARGET_MINIMAL_TOC && (crtl->calls_eh_return || df_regs_ever_live_p (reg) - || get_pool_size_upper_bound ())) + || !constant_pool_empty_p ())) return true; if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) @@ -26266,7 +26266,7 @@ rs6000_stack_info (void) #ifdef TARGET_RELOCATABLE || (DEFAULT_ABI == ABI_V4 && (TARGET_RELOCATABLE || flag_pic > 1) - && get_pool_size_upper_bound () != 0) + && !constant_pool_empty_p ()) #endif || rs6000_ra_ever_killed ()) info->lr_save_p = 1; @@ -28044,7 +28044,7 @@ rs6000_emit_prologue (void) /* With -mminimal-toc we may generate an extra use of r2 below. */ if (TARGET_TOC && TARGET_MINIMAL_TOC - && get_pool_size_upper_bound () != 0) + && !constant_pool_empty_p ()) cfun->machine->r2_setup_needed = true; } @@ -28900,7 +28900,7 @@ rs6000_emit_prologue (void) /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */ if (!TARGET_SINGLE_PIC_BASE && ((TARGET_TOC && TARGET_MINIMAL_TOC - && get_pool_size_upper_bound () != 0) + && !constant_pool_empty_p ()) || (DEFAULT_ABI == ABI_V4 && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT)) && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)))) @@ -34967,7 +34967,7 @@ rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl) if (DEFAULT_ABI == ABI_V4 && (TARGET_RELOCATABLE || flag_pic > 1) && !TARGET_SECURE_PLT - && (get_pool_size_upper_bound () != 0 || crtl->profile) + && (!constant_pool_empty_p () || crtl->profile) && uses_TOC ()) { char buf[256]; @@ -37453,7 +37453,7 @@ rs6000_can_eliminate (const int from, const int to) ? ! frame_pointer_needed : from == RS6000_PIC_OFFSET_TABLE_REGNUM ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC - || get_pool_size_upper_bound () == 0 + || constant_pool_empty_p () : true); } @@ -38990,7 +38990,7 @@ rs6000_set_up_by_prologue (struct hard_reg_set_container *set) if (!TARGET_SINGLE_PIC_BASE && TARGET_TOC && TARGET_MINIMAL_TOC - && get_pool_size_upper_bound () != 0) + && !constant_pool_empty_p ()) add_to_hard_reg_set (&set->set, Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM); if (cfun->machine->split_stack_argp_used) add_to_hard_reg_set (&set->set, Pmode, 12); diff --git a/gcc/output.h b/gcc/output.h index 7186dc1b98b..6c993817700 100644 --- a/gcc/output.h +++ b/gcc/output.h @@ -287,11 +287,10 @@ extern void assemble_real (REAL_VALUE_TYPE, machine_mode, unsigned, /* Write the address of the entity given by SYMBOL to SEC. */ extern void assemble_addr_to_section (rtx, section *); -/* Return the maximum size of the constant pool. This may be larger - than the final size of the constant pool, as entries may be added to - the constant pool which become unreferenced, or otherwise not need - output by the time we actually emit the pool. */ -extern int get_pool_size_upper_bound (void); +/* Return TRUE if and only if the constant pool has no entries. Note + that even entries we might end up choosing not to emit are counted + here, so there is the potential for missed optimizations. */ +extern bool constant_pool_empty_p (void); extern rtx_insn *peephole (rtx_insn *); diff --git a/gcc/varasm.c b/gcc/varasm.c index f3cd70aecca..5b158472fc6 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -3808,12 +3808,14 @@ get_pool_mode (const_rtx addr) return SYMBOL_REF_CONSTANT (addr)->mode; } -/* Return the size of the constant pool. */ +/* Return TRUE if and only if the constant pool has no entries. Note + that even entries we might end up choosing not to emit are counted + here, so there is the potential for missed optimizations. */ -int -get_pool_size_upper_bound (void) +bool +constant_pool_empty_p (void) { - return crtl->varasm.pool->offset; + return crtl->varasm.pool->first == NULL; } /* Worker function for output_constant_pool_1. Emit assembly for X -- 2.30.2