+2016-12-07 James Greenhalgh <james.greenhalgh@arm.com>
+
+ 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 <bin.cheng@arm.com>
PR tree-optimization/78691
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)
#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;
/* 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;
}
/* 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))))
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];
? ! 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);
}
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);
/* 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 *);
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;
}
\f
/* Worker function for output_constant_pool_1. Emit assembly for X