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.sandif...@linaro.org>
>           Alan Hayward  <alan.hayw...@arm.com>
>           David Sherwood  <david.sherw...@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

Reply via email to