This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [018/nnn] poly_int: MEM_OFFSET and MEM_SIZE
- From: Jeff Law <law at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org, richard dot sandiford at linaro dot org
- Date: Wed, 6 Dec 2017 11:27:33 -0700
- Subject: Re: [018/nnn] poly_int: MEM_OFFSET and MEM_SIZE
- Authentication-results: sourceware.org; auth=none
- References: <871sltvm7r.fsf@linaro.org> <87po9drdwt.fsf@linaro.org>
On 10/23/2017 11:07 AM, Richard Sandiford wrote:
> This patch changes the MEM_OFFSET and MEM_SIZE memory attributes
> from HOST_WIDE_INT to poly_int64. Most of it is mechanical,
> but there is one nonbovious change in widen_memory_access.
> Previously the main while loop broke with:
>
> /* Similarly for the decl. */
> else if (DECL_P (attrs.expr)
> && DECL_SIZE_UNIT (attrs.expr)
> && TREE_CODE (DECL_SIZE_UNIT (attrs.expr)) == INTEGER_CST
> && compare_tree_int (DECL_SIZE_UNIT (attrs.expr), size) >= 0
> && (! attrs.offset_known_p || attrs.offset >= 0))
> break;
>
> but it seemed wrong to optimistically assume the best case
> when the offset isn't known (and thus might be negative).
> As it happens, the "! attrs.offset_known_p" condition was
> always false, because we'd already nullified attrs.expr in
> that case:
>
> /* If we don't know what offset we were at within the expression, then
> we can't know if we've overstepped the bounds. */
> if (! attrs.offset_known_p)
> attrs.expr = NULL_TREE;
>
> The patch therefore drops "! attrs.offset_known_p ||" when
> converting the offset check to the may/must interface.
>
>
> 2017-10-23 Richard Sandiford <richard.sandiford@linaro.org>
> Alan Hayward <alan.hayward@arm.com>
> David Sherwood <david.sherwood@arm.com>
>
> gcc/
> * rtl.h (mem_attrs): Add a default constructor. Change size and
> offset from HOST_WIDE_INT to poly_int64.
> * emit-rtl.h (set_mem_offset, set_mem_size, adjust_address_1)
> (adjust_automodify_address_1, set_mem_attributes_minus_bitpos)
> (widen_memory_access): Take the sizes and offsets as poly_int64s
> rather than HOST_WIDE_INTs.
> * alias.c (ao_ref_from_mem): Handle the new form of MEM_OFFSET.
> (offset_overlap_p): Take poly_int64s rather than HOST_WIDE_INTs
> and ints.
> (adjust_offset_for_component_ref): Change the offset from a
> HOST_WIDE_INT to a poly_int64.
> (nonoverlapping_memrefs_p): Track polynomial offsets and sizes.
> * cfgcleanup.c (merge_memattrs): Update after mem_attrs changes.
> * dce.c (find_call_stack_args): Likewise.
> * dse.c (record_store): Likewise.
> * dwarf2out.c (tls_mem_loc_descriptor, dw_sra_loc_expr): Likewise.
> * print-rtl.c (rtx_writer::print_rtx): Likewise.
> * read-rtl-function.c (test_loading_mem): Likewise.
> * rtlanal.c (may_trap_p_1): Likewise.
> * simplify-rtx.c (delegitimize_mem_from_attrs): Likewise.
> * var-tracking.c (int_mem_offset, track_expr_p): Likewise.
> * emit-rtl.c (mem_attrs_eq_p, get_mem_align_offset): Likewise.
> (mem_attrs::mem_attrs): New function.
> (set_mem_attributes_minus_bitpos): Change bitpos from a
> HOST_WIDE_INT to poly_int64.
> (set_mem_alias_set, set_mem_addr_space, set_mem_align, set_mem_expr)
> (clear_mem_offset, clear_mem_size, change_address)
> (get_spill_slot_decl, set_mem_attrs_for_spill): Directly
> initialize mem_attrs.
> (set_mem_offset, set_mem_size, adjust_address_1)
> (adjust_automodify_address_1, offset_address, widen_memory_access):
> Likewise. Take poly_int64s rather than HOST_WIDE_INT.
>
OK.
jeff