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