On Sun, Jul 17, 2011 at 4:31 PM, Richard Sandiford <rdsandif...@googlemail.com> wrote: > This patch does the mechanical MEM_SIZE interface change. It also > makes set_mem_size take a HOST_WIDE_INT, and adds clear_mem_size > for resetting the size to "unknown". > > The i386.c part includes an obvious pasto fix for: > > if (dst_size) > set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes)); > if (src_size) > set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes)); > > (last "dst" should be "src") which I can split out into a separate > patch if desired.
Ok if there are no objections from target maintainers. Thanks, Richard. > Richard > > > gcc/ > * doc/rtl.texi (MEM_SIZE_KNOWN_P): Document. > (MEM_SIZE): Change from returning an rtx to returning a HOST_WIDE_INT. > * rtl.h (MEM_SIZE_KNOWN_P): New macro. > (MEM_SIZE): Return a HOST_WIDE_INT rather than an rtx. > * emit-rtl.h (set_mem_size): Take a HOST_WIDE_INT rather than an rtx. > (clear_mem_size): Declare. > * emit-rtl.c (set_mem_size): Take a HOST_WIDE_INT rather than an rtx. > (clear_mem_size): New function. > * alias.c (ao_ref_from_mem): Adjust uses of MEM_SIZE, using > MEM_SIZE_KNOWN_P to test whether the size is known, and MEM_SIZE > to get a HOST_WIDE_INT size. Adjust calls to set_mem_size, > passing a HOST_WIDE_INT rather than an rtx. Use clear_mem_size > to clear the size. > (nonoverlapping_memrefs_p): Likewise. > * builtins.c (get_memory_rtx, expand_builtin_memcmp): Likewise. > (expand_builtin_init_trampoline): Likewise. > * calls.c (compute_argument_addresses): Likewise. > * cfgcleanup.c (merge_memattrs): Likewise. > * dce.c (find_call_stack_args): Likewise. > * dse.c (record_store, scan_insn): Likewise. > * dwarf2out.c (dw_sra_loc_expr): Likewise. > * expr.c (emit_block_move_hints): Likewise. > * function.c (assign_parm_find_stack_rtl): Likewise. > * print-rtl.c (print_rtx): Likewise. > * reload.c (find_reloads_subreg_address): Likewise. > * rtlanal.c (may_trap_p_1): Likewise. > * var-tracking.c (track_expr_p): Likewise. > * varasm.c (assemble_trampoline_template): Likewise. > * config/arm/arm.c (arm_print_operand): Likewise. > * config/h8300/h8300.c (h8sx_emit_movmd): Likewise. > * config/i386/i386.c (expand_movmem_via_rep_mov): Likewise. > (expand_setmem_via_rep_stos, expand_constant_movmem_prologue) > (expand_constant_setmem_prologue): Likewise. > * config/mips/mips.c (mips_get_unaligned_mem): Likewise. > * config/rs6000/rs6000.c (expand_block_move): Likewise. > (adjacent_mem_locations): Likewise. > * config/s390/s390.c (s390_expand_setmem): Likewise. > (s390_expand_insv): Likewise. > * config/s390/s390.md (*extzv<mode>, *extv<mode>): Likewise. > (*extendqi<mode>2_short_displ): Likewise. > * config/sh/sh.c (expand_block_move): Likewise. > * config/sh/sh.md (extv, extzv): Likewise. > > Index: gcc/doc/rtl.texi > =================================================================== > --- gcc/doc/rtl.texi 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/doc/rtl.texi 2011-07-17 13:19:35.000000000 +0100 > @@ -413,11 +413,17 @@ object associated with the reference. > @item MEM_OFFSET (@var{x}) > The offset from the start of @code{MEM_EXPR} as a @code{CONST_INT} rtx. > > +@findex MEM_SIZE_KNOWN_P > +@item MEM_SIZE_KNOWN_P (@var{x}) > +True if the size of the memory reference is known. > +@samp{MEM_SIZE (@var{x})} provides its size if so. > + > @findex MEM_SIZE > @item MEM_SIZE (@var{x}) > -The size in bytes of the memory reference as a @code{CONST_INT} rtx. > +The size in bytes of the memory reference. > This is mostly relevant for @code{BLKmode} references as otherwise > -the size is implied by the mode. > +the size is implied by the mode. The value is only valid if > +@samp{MEM_SIZE_KNOWN_P (@var{x})} is true. > > @findex MEM_ALIGN > @item MEM_ALIGN (@var{x}) > Index: gcc/rtl.h > =================================================================== > --- gcc/rtl.h 2011-07-17 11:40:12.000000000 +0100 > +++ gcc/rtl.h 2011-07-17 13:19:35.000000000 +0100 > @@ -1309,9 +1309,11 @@ #define MEM_OFFSET(RTX) (get_mem_attrs ( > /* For a MEM rtx, the address space. */ > #define MEM_ADDR_SPACE(RTX) (get_mem_attrs (RTX)->addrspace) > > -/* For a MEM rtx, the size in bytes of the MEM, if known, as an RTX that > - is always a CONST_INT. */ > -#define MEM_SIZE(RTX) (get_mem_attrs (RTX)->size) > +/* For a MEM rtx, true if its MEM_SIZE is known. */ > +#define MEM_SIZE_KNOWN_P(RTX) (get_mem_attrs (RTX)->size != NULL_RTX) > + > +/* For a MEM rtx, the size in bytes of the MEM. */ > +#define MEM_SIZE(RTX) INTVAL (get_mem_attrs (RTX)->size) > > /* For a MEM rtx, the alignment in bits. We can use the alignment of the > mode as a default when STRICT_ALIGNMENT, but not if not. */ > Index: gcc/emit-rtl.h > =================================================================== > --- gcc/emit-rtl.h 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/emit-rtl.h 2011-07-17 13:19:35.000000000 +0100 > @@ -36,7 +36,10 @@ extern void set_mem_expr (rtx, tree); > extern void set_mem_offset (rtx, rtx); > > /* Set the size for MEM to SIZE. */ > -extern void set_mem_size (rtx, rtx); > +extern void set_mem_size (rtx, HOST_WIDE_INT); > + > +/* Clear the size recorded for MEM. */ > +extern void clear_mem_size (rtx); > > /* Set the attributes for MEM appropriate for a spill slot. */ > extern void set_mem_attrs_for_spill (rtx); > Index: gcc/emit-rtl.c > =================================================================== > --- gcc/emit-rtl.c 2011-07-17 11:40:13.000000000 +0100 > +++ gcc/emit-rtl.c 2011-07-17 13:19:35.000000000 +0100 > @@ -1913,12 +1913,24 @@ set_mem_offset (rtx mem, rtx offset) > /* Set the size of MEM to SIZE. */ > > void > -set_mem_size (rtx mem, rtx size) > +set_mem_size (rtx mem, HOST_WIDE_INT size) > { > struct mem_attrs attrs; > > attrs = *get_mem_attrs (mem); > - attrs.size = size; > + attrs.size = GEN_INT (size); > + set_mem_attrs (mem, &attrs); > +} > + > +/* Clear the size of MEM. */ > + > +void > +clear_mem_size (rtx mem) > +{ > + struct mem_attrs attrs; > + > + attrs = *get_mem_attrs (mem); > + attrs.size = NULL_RTX; > set_mem_attrs (mem, &attrs); > } > > Index: gcc/alias.c > =================================================================== > --- gcc/alias.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/alias.c 2011-07-17 13:19:35.000000000 +0100 > @@ -313,10 +313,10 @@ ao_ref_from_mem (ao_ref *ref, const_rtx > > ref->ref_alias_set = MEM_ALIAS_SET (mem); > > - /* If MEM_OFFSET or MEM_SIZE are NULL we have to punt. > + /* If MEM_OFFSET or MEM_SIZE are unknown we have to punt. > Keep points-to related information though. */ > if (!MEM_OFFSET (mem) > - || !MEM_SIZE (mem)) > + || !MEM_SIZE_KNOWN_P (mem)) > { > ref->ref = NULL_TREE; > ref->offset = 0; > @@ -329,12 +329,12 @@ ao_ref_from_mem (ao_ref *ref, const_rtx > case of promoted subregs on bigendian targets. Trust the MEM_EXPR > here. */ > if (INTVAL (MEM_OFFSET (mem)) < 0 > - && ((INTVAL (MEM_SIZE (mem)) + INTVAL (MEM_OFFSET (mem))) > + && ((MEM_SIZE (mem) + INTVAL (MEM_OFFSET (mem))) > * BITS_PER_UNIT) == ref->size) > return true; > > ref->offset += INTVAL (MEM_OFFSET (mem)) * BITS_PER_UNIT; > - ref->size = INTVAL (MEM_SIZE (mem)) * BITS_PER_UNIT; > + ref->size = MEM_SIZE (mem) * BITS_PER_UNIT; > > /* The MEM may extend into adjacent fields, so adjust max_size if > necessary. */ > @@ -2338,11 +2338,11 @@ nonoverlapping_memrefs_p (const_rtx x, c > return 0; > > sizex = (!MEM_P (rtlx) ? (int) GET_MODE_SIZE (GET_MODE (rtlx)) > - : MEM_SIZE (rtlx) ? INTVAL (MEM_SIZE (rtlx)) > + : MEM_SIZE_KNOWN_P (rtlx) ? MEM_SIZE (rtlx) > : -1); > sizey = (!MEM_P (rtly) ? (int) GET_MODE_SIZE (GET_MODE (rtly)) > - : MEM_SIZE (rtly) ? INTVAL (MEM_SIZE (rtly)) : > - -1); > + : MEM_SIZE_KNOWN_P (rtly) ? MEM_SIZE (rtly) > + : -1); > > /* If we have an offset for either memref, it can update the values computed > above. */ > @@ -2354,10 +2354,10 @@ nonoverlapping_memrefs_p (const_rtx x, c > /* If a memref has both a size and an offset, we can use the smaller size. > We can't do this if the offset isn't known because we must view this > memref as being anywhere inside the DECL's MEM. */ > - if (MEM_SIZE (x) && moffsetx) > - sizex = INTVAL (MEM_SIZE (x)); > - if (MEM_SIZE (y) && moffsety) > - sizey = INTVAL (MEM_SIZE (y)); > + if (MEM_SIZE_KNOWN_P (x) && moffsetx) > + sizex = MEM_SIZE (x); > + if (MEM_SIZE_KNOWN_P (y) && moffsety) > + sizey = MEM_SIZE (y); > > /* Put the values of the memref with the lower offset in X's values. */ > if (offsetx > offsety) > Index: gcc/builtins.c > =================================================================== > --- gcc/builtins.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/builtins.c 2011-07-17 13:19:35.000000000 +0100 > @@ -1299,7 +1299,7 @@ get_memory_rtx (tree exp, tree len) > } > } > set_mem_alias_set (mem, 0); > - set_mem_size (mem, NULL_RTX); > + clear_mem_size (mem); > } > > return mem; > @@ -3691,8 +3691,8 @@ expand_builtin_memcmp (tree exp, ATTRIBU > /* Set MEM_SIZE as appropriate. */ > if (CONST_INT_P (arg3_rtx)) > { > - set_mem_size (arg1_rtx, arg3_rtx); > - set_mem_size (arg2_rtx, arg3_rtx); > + set_mem_size (arg1_rtx, INTVAL (arg3_rtx)); > + set_mem_size (arg2_rtx, INTVAL (arg3_rtx)); > } > > #ifdef HAVE_cmpmemsi > @@ -4838,7 +4838,7 @@ expand_builtin_init_trampoline (tree exp > { > m_tramp = change_address (m_tramp, BLKmode, tmp); > set_mem_align (m_tramp, TRAMPOLINE_ALIGNMENT); > - set_mem_size (m_tramp, GEN_INT (TRAMPOLINE_SIZE)); > + set_mem_size (m_tramp, TRAMPOLINE_SIZE); > } > > /* The FUNC argument should be the address of the nested function. > Index: gcc/calls.c > =================================================================== > --- gcc/calls.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/calls.c 2011-07-17 11:40:14.000000000 +0100 > @@ -1481,7 +1481,7 @@ compute_argument_addresses (struct arg_d > partial_mode = mode_for_size (units_on_stack * BITS_PER_UNIT, > MODE_INT, 1); > args[i].stack = gen_rtx_MEM (partial_mode, addr); > - set_mem_size (args[i].stack, GEN_INT (units_on_stack)); > + set_mem_size (args[i].stack, units_on_stack); > } > else > { > @@ -1513,7 +1513,7 @@ compute_argument_addresses (struct arg_d > Generate a simple memory reference of the correct size. > */ > args[i].stack_slot = gen_rtx_MEM (partial_mode, addr); > - set_mem_size (args[i].stack_slot, GEN_INT (units_on_stack)); > + set_mem_size (args[i].stack_slot, units_on_stack); > } > else > { > Index: gcc/cfgcleanup.c > =================================================================== > --- gcc/cfgcleanup.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/cfgcleanup.c 2011-07-17 13:19:35.000000000 +0100 > @@ -883,7 +883,7 @@ merge_memattrs (rtx x, rtx y) > MEM_ATTRS (x) = 0; > else > { > - rtx mem_size; > + HOST_WIDE_INT mem_size; > > if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y)) > { > @@ -904,15 +904,17 @@ merge_memattrs (rtx x, rtx y) > set_mem_offset (y, 0); > } > > - if (!MEM_SIZE (x)) > - mem_size = NULL_RTX; > - else if (!MEM_SIZE (y)) > - mem_size = NULL_RTX; > + if (MEM_SIZE_KNOWN_P (x) && MEM_SIZE_KNOWN_P (y)) > + { > + mem_size = MAX (MEM_SIZE (x), MEM_SIZE (y)); > + set_mem_size (x, mem_size); > + set_mem_size (y, mem_size); > + } > else > - mem_size = GEN_INT (MAX (INTVAL (MEM_SIZE (x)), > - INTVAL (MEM_SIZE (y)))); > - set_mem_size (x, mem_size); > - set_mem_size (y, mem_size); > + { > + clear_mem_size (x); > + clear_mem_size (y); > + } > > set_mem_align (x, MIN (MEM_ALIGN (x), MEM_ALIGN (y))); > set_mem_align (y, MEM_ALIGN (x)); > Index: gcc/dce.c > =================================================================== > --- gcc/dce.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/dce.c 2011-07-17 11:40:14.000000000 +0100 > @@ -275,11 +275,11 @@ find_call_stack_args (rtx call_insn, boo > if (GET_CODE (XEXP (p, 0)) == USE > && MEM_P (XEXP (XEXP (p, 0), 0))) > { > - rtx mem = XEXP (XEXP (p, 0), 0), addr, size; > - HOST_WIDE_INT off = 0; > - size = MEM_SIZE (mem); > - if (size == NULL_RTX) > + rtx mem = XEXP (XEXP (p, 0), 0), addr; > + HOST_WIDE_INT off = 0, size; > + if (!MEM_SIZE_KNOWN_P (mem)) > return false; > + size = MEM_SIZE (mem); > addr = XEXP (mem, 0); > if (GET_CODE (addr) == PLUS > && REG_P (XEXP (addr, 0)) > @@ -329,7 +329,7 @@ find_call_stack_args (rtx call_insn, boo > return false; > } > min_sp_off = MIN (min_sp_off, off); > - max_sp_off = MAX (max_sp_off, off + INTVAL (size)); > + max_sp_off = MAX (max_sp_off, off + size); > } > > if (min_sp_off >= max_sp_off) > @@ -370,7 +370,7 @@ find_call_stack_args (rtx call_insn, boo > set = single_set (DF_REF_INSN (defs->ref)); > off += INTVAL (XEXP (SET_SRC (set), 1)); > } > - for (byte = off; byte < off + INTVAL (MEM_SIZE (mem)); byte++) > + for (byte = off; byte < off + MEM_SIZE (mem); byte++) > { > if (!bitmap_set_bit (sp_bytes, byte - min_sp_off)) > gcc_unreachable (); > Index: gcc/dse.c > =================================================================== > --- gcc/dse.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/dse.c 2011-07-17 11:40:14.000000000 +0100 > @@ -1355,11 +1355,10 @@ record_store (rtx body, bb_info_t bb_inf > } > /* Handle (set (mem:BLK (addr) [... S36 ...]) (const_int 0)) > as memset (addr, 0, 36); */ > - else if (!MEM_SIZE (mem) > - || !CONST_INT_P (MEM_SIZE (mem)) > + else if (!MEM_SIZE_KNOWN_P (mem) > + || MEM_SIZE (mem) <= 0 > + || MEM_SIZE (mem) > MAX_OFFSET > || GET_CODE (body) != SET > - || INTVAL (MEM_SIZE (mem)) <= 0 > - || INTVAL (MEM_SIZE (mem)) > MAX_OFFSET > || !CONST_INT_P (SET_SRC (body))) > { > if (!store_is_unused) > @@ -1384,7 +1383,7 @@ record_store (rtx body, bb_info_t bb_inf > } > > if (GET_MODE (mem) == BLKmode) > - width = INTVAL (MEM_SIZE (mem)); > + width = MEM_SIZE (mem); > else > { > width = GET_MODE_SIZE (GET_MODE (mem)); > @@ -2517,7 +2516,7 @@ scan_insn (bb_info_t bb_info, rtx insn) > && INTVAL (args[2]) > 0) > { > rtx mem = gen_rtx_MEM (BLKmode, args[0]); > - set_mem_size (mem, args[2]); > + set_mem_size (mem, INTVAL (args[2])); > body = gen_rtx_SET (VOIDmode, mem, args[1]); > mems_found += record_store (body, bb_info); > if (dump_file) > Index: gcc/dwarf2out.c > =================================================================== > --- gcc/dwarf2out.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/dwarf2out.c 2011-07-17 13:19:35.000000000 +0100 > @@ -12876,7 +12876,7 @@ dw_sra_loc_expr (tree decl, rtx loc) > if (MEM_P (varloc)) > { > unsigned HOST_WIDE_INT memsize > - = INTVAL (MEM_SIZE (varloc)) * BITS_PER_UNIT; > + = MEM_SIZE (varloc) * BITS_PER_UNIT; > if (memsize != bitsize) > { > if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN > Index: gcc/expr.c > =================================================================== > --- gcc/expr.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/expr.c 2011-07-17 11:40:14.000000000 +0100 > @@ -1166,8 +1166,8 @@ emit_block_move_hints (rtx x, rtx y, rtx > { > x = shallow_copy_rtx (x); > y = shallow_copy_rtx (y); > - set_mem_size (x, size); > - set_mem_size (y, size); > + set_mem_size (x, INTVAL (size)); > + set_mem_size (y, INTVAL (size)); > } > > if (CONST_INT_P (size) && MOVE_BY_PIECES_P (INTVAL (size), align)) > Index: gcc/function.c > =================================================================== > --- gcc/function.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/function.c 2011-07-17 13:19:35.000000000 +0100 > @@ -2576,8 +2576,7 @@ assign_parm_find_stack_rtl (tree parm, s > if (data->promoted_mode != BLKmode > && data->promoted_mode != DECL_MODE (parm)) > { > - set_mem_size (stack_parm, > - GEN_INT (GET_MODE_SIZE (data->promoted_mode))); > + set_mem_size (stack_parm, GET_MODE_SIZE (data->promoted_mode)); > if (MEM_EXPR (stack_parm) && MEM_OFFSET (stack_parm)) > { > int offset = subreg_lowpart_offset (DECL_MODE (parm), > Index: gcc/print-rtl.c > =================================================================== > --- gcc/print-rtl.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/print-rtl.c 2011-07-17 13:19:35.000000000 +0100 > @@ -601,9 +601,8 @@ print_rtx (const_rtx in_rtx) > fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC, > INTVAL (MEM_OFFSET (in_rtx))); > > - if (MEM_SIZE (in_rtx)) > - fprintf (outfile, " S" HOST_WIDE_INT_PRINT_DEC, > - INTVAL (MEM_SIZE (in_rtx))); > + if (MEM_SIZE_KNOWN_P (in_rtx)) > + fprintf (outfile, " S" HOST_WIDE_INT_PRINT_DEC, MEM_SIZE (in_rtx)); > > if (MEM_ALIGN (in_rtx) != 1) > fprintf (outfile, " A%u", MEM_ALIGN (in_rtx)); > Index: gcc/reload.c > =================================================================== > --- gcc/reload.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/reload.c 2011-07-17 13:19:35.000000000 +0100 > @@ -6139,9 +6139,9 @@ find_reloads_subreg_address (rtx x, int > PUT_MODE (tem, GET_MODE (x)); > if (MEM_OFFSET (tem)) > set_mem_offset (tem, plus_constant (MEM_OFFSET (tem), offset)); > - if (MEM_SIZE (tem) > - && INTVAL (MEM_SIZE (tem)) != (HOST_WIDE_INT) outer_size) > - set_mem_size (tem, GEN_INT (outer_size)); > + if (MEM_SIZE_KNOWN_P (tem) > + && MEM_SIZE (tem) != (HOST_WIDE_INT) outer_size) > + set_mem_size (tem, outer_size); > > /* If this was a paradoxical subreg that we replaced, the > resulting memory must be sufficiently aligned to allow > Index: gcc/rtlanal.c > =================================================================== > --- gcc/rtlanal.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/rtlanal.c 2011-07-17 11:40:14.000000000 +0100 > @@ -2279,7 +2279,7 @@ may_trap_p_1 (const_rtx x, unsigned flag > code_changed > || !MEM_NOTRAP_P (x)) > { > - HOST_WIDE_INT size = MEM_SIZE (x) ? INTVAL (MEM_SIZE (x)) : 0; > + HOST_WIDE_INT size = MEM_SIZE_KNOWN_P (x) ? MEM_SIZE (x) : 0; > return rtx_addr_can_trap_p_1 (XEXP (x, 0), 0, size, > GET_MODE (x), code_changed); > } > Index: gcc/var-tracking.c > =================================================================== > --- gcc/var-tracking.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/var-tracking.c 2011-07-17 13:19:35.000000000 +0100 > @@ -4674,8 +4674,8 @@ track_expr_p (tree expr, bool need_rtl) > if (GET_MODE (decl_rtl) == BLKmode > || AGGREGATE_TYPE_P (TREE_TYPE (realdecl))) > return 0; > - if (MEM_SIZE (decl_rtl) > - && INTVAL (MEM_SIZE (decl_rtl)) > MAX_VAR_PARTS) > + if (MEM_SIZE_KNOWN_P (decl_rtl) > + && MEM_SIZE (decl_rtl) > MAX_VAR_PARTS) > return 0; > } > > Index: gcc/varasm.c > =================================================================== > --- gcc/varasm.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/varasm.c 2011-07-17 11:40:14.000000000 +0100 > @@ -2391,7 +2391,7 @@ assemble_trampoline_template (void) > > initial_trampoline = gen_const_mem (BLKmode, symbol); > set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT); > - set_mem_size (initial_trampoline, GEN_INT (TRAMPOLINE_SIZE)); > + set_mem_size (initial_trampoline, TRAMPOLINE_SIZE); > > return initial_trampoline; > } > Index: gcc/config/arm/arm.c > =================================================================== > --- gcc/config/arm/arm.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/arm/arm.c 2011-07-17 11:40:14.000000000 +0100 > @@ -16713,7 +16713,7 @@ arm_print_operand (FILE *stream, rtx x, > instruction (for some alignments) as an aid to the memory subsystem > of the target. */ > align = MEM_ALIGN (x) >> 3; > - memsize = INTVAL (MEM_SIZE (x)); > + memsize = MEM_SIZE (x); > > /* Only certain alignment specifiers are supported by the hardware. */ > if (memsize == 16 && (align % 32) == 0) > Index: gcc/config/h8300/h8300.c > =================================================================== > --- gcc/config/h8300/h8300.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/h8300/h8300.c 2011-07-17 11:40:14.000000000 +0100 > @@ -2642,8 +2642,8 @@ h8sx_emit_movmd (rtx dest, rtx src, rtx > first_dest = replace_equiv_address (dest, dest_reg); > first_src = replace_equiv_address (src, src_reg); > > - set_mem_size (first_dest, GEN_INT (n & -factor)); > - set_mem_size (first_src, GEN_INT (n & -factor)); > + set_mem_size (first_dest, n & -factor); > + set_mem_size (first_src, n & -factor); > > length = copy_to_mode_reg (HImode, gen_int_mode (n / factor, HImode)); > emit_insn (gen_movmd (first_dest, first_src, length, GEN_INT (factor))); > Index: gcc/config/i386/i386.c > =================================================================== > --- gcc/config/i386/i386.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/i386/i386.c 2011-07-17 11:40:14.000000000 +0100 > @@ -19702,6 +19702,7 @@ expand_movmem_via_rep_mov (rtx destmem, > rtx destexp; > rtx srcexp; > rtx countreg; > + HOST_WIDE_INT rounded_count; > > /* If the size is known, it is shorter to use rep movs. */ > if (mode == QImode && CONST_INT_P (count) > @@ -19729,19 +19730,19 @@ expand_movmem_via_rep_mov (rtx destmem, > } > if (CONST_INT_P (count)) > { > - count = GEN_INT (INTVAL (count) > + rounded_count = (INTVAL (count) > & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1)); > destmem = shallow_copy_rtx (destmem); > srcmem = shallow_copy_rtx (srcmem); > - set_mem_size (destmem, count); > - set_mem_size (srcmem, count); > + set_mem_size (destmem, rounded_count); > + set_mem_size (srcmem, rounded_count); > } > else > { > - if (MEM_SIZE (destmem)) > - set_mem_size (destmem, NULL_RTX); > - if (MEM_SIZE (srcmem)) > - set_mem_size (srcmem, NULL_RTX); > + if (MEM_SIZE_KNOWN_P (destmem)) > + clear_mem_size (destmem); > + if (MEM_SIZE_KNOWN_P (srcmem)) > + clear_mem_size (srcmem); > } > emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg, > destexp, srcexp)); > @@ -19756,6 +19757,7 @@ expand_setmem_via_rep_stos (rtx destmem, > { > rtx destexp; > rtx countreg; > + HOST_WIDE_INT rounded_count; > > if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode) > destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0); > @@ -19771,13 +19773,13 @@ expand_setmem_via_rep_stos (rtx destmem, > destexp = gen_rtx_PLUS (Pmode, destptr, countreg); > if (orig_value == const0_rtx && CONST_INT_P (count)) > { > - count = GEN_INT (INTVAL (count) > + rounded_count = (INTVAL (count) > & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1)); > destmem = shallow_copy_rtx (destmem); > - set_mem_size (destmem, count); > + set_mem_size (destmem, rounded_count); > } > - else if (MEM_SIZE (destmem)) > - set_mem_size (destmem, NULL_RTX); > + else if (MEM_SIZE_KNOWN_P (destmem)) > + clear_mem_size (destmem); > emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp)); > } > > @@ -20118,13 +20120,12 @@ expand_constant_movmem_prologue (rtx dst > int desired_align, int align_bytes) > { > rtx src = *srcp; > - rtx src_size, dst_size; > + rtx orig_dst = dst; > + rtx orig_src = src; > int off = 0; > int src_align_bytes = get_mem_align_offset (src, desired_align * > BITS_PER_UNIT); > if (src_align_bytes >= 0) > src_align_bytes = desired_align - src_align_bytes; > - src_size = MEM_SIZE (src); > - dst_size = MEM_SIZE (dst); > if (align_bytes & 1) > { > dst = adjust_automodify_address_nv (dst, QImode, destreg, 0); > @@ -20182,10 +20183,10 @@ expand_constant_movmem_prologue (rtx dst > if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT) > set_mem_align (src, src_align * BITS_PER_UNIT); > } > - if (dst_size) > - set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes)); > - if (src_size) > - set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes)); > + if (MEM_SIZE_KNOWN_P (orig_dst)) > + set_mem_size (dst, MEM_SIZE (orig_dst) - align_bytes); > + if (MEM_SIZE_KNOWN_P (orig_src)) > + set_mem_size (src, MEM_SIZE (orig_src) - align_bytes); > *srcp = src; > return dst; > } > @@ -20233,7 +20234,7 @@ expand_constant_setmem_prologue (rtx dst > int desired_align, int align_bytes) > { > int off = 0; > - rtx dst_size = MEM_SIZE (dst); > + rtx orig_dst = dst; > if (align_bytes & 1) > { > dst = adjust_automodify_address_nv (dst, QImode, destreg, 0); > @@ -20262,8 +20263,8 @@ expand_constant_setmem_prologue (rtx dst > dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off); > if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT) > set_mem_align (dst, desired_align * BITS_PER_UNIT); > - if (dst_size) > - set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes)); > + if (MEM_SIZE_KNOWN_P (orig_dst)) > + set_mem_size (dst, MEM_SIZE (orig_dst) - align_bytes); > return dst; > } > > Index: gcc/config/mips/mips.c > =================================================================== > --- gcc/config/mips/mips.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/mips/mips.c 2011-07-17 13:19:35.000000000 +0100 > @@ -6862,7 +6862,7 @@ mips_get_unaligned_mem (rtx *op, HOST_WI > /* Adjust *OP to refer to the whole field. This also has the effect > of legitimizing *OP's address for BLKmode, possibly simplifying it. */ > *op = adjust_address (*op, BLKmode, 0); > - set_mem_size (*op, GEN_INT (width / BITS_PER_UNIT)); > + set_mem_size (*op, width / BITS_PER_UNIT); > > /* Get references to both ends of the field. We deliberately don't > use the original QImode *OP for FIRST since the new BLKmode one > @@ -6962,13 +6962,9 @@ mips_expand_ins_as_unaligned_store (rtx > bool > mips_mem_fits_mode_p (enum machine_mode mode, rtx x) > { > - rtx size; > - > - if (!MEM_P (x)) > - return false; > - > - size = MEM_SIZE (x); > - return size && INTVAL (size) == GET_MODE_SIZE (mode); > + return (MEM_P (x) > + && MEM_SIZE_KNOWN_P (x) > + && MEM_SIZE (x) == GET_MODE_SIZE (mode)); > } > > /* Return true if (zero_extract OP WIDTH BITPOS) can be used as the > Index: gcc/config/rs6000/rs6000.c > =================================================================== > --- gcc/config/rs6000/rs6000.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/rs6000/rs6000.c 2011-07-17 11:40:14.000000000 +0100 > @@ -13685,14 +13685,14 @@ expand_block_move (rtx operands[]) > rtx src_reg = copy_addr_to_reg (XEXP (src, 0)); > src = replace_equiv_address (src, src_reg); > } > - set_mem_size (src, GEN_INT (move_bytes)); > + set_mem_size (src, move_bytes); > > if (!REG_P (XEXP (dest, 0))) > { > rtx dest_reg = copy_addr_to_reg (XEXP (dest, 0)); > dest = replace_equiv_address (dest, dest_reg); > } > - set_mem_size (dest, GEN_INT (move_bytes)); > + set_mem_size (dest, move_bytes); > > emit_insn ((*gen_func.movmemsi) (dest, src, > GEN_INT (move_bytes & 31), > @@ -23063,8 +23063,8 @@ adjacent_mem_locations (rtx insn1, rtx i > val_diff = val1 - val0; > > return ((REGNO (reg0) == REGNO (reg1)) > - && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a))) > - || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b))))); > + && ((MEM_SIZE_KNOWN_P (a) && val_diff == MEM_SIZE (a)) > + || (MEM_SIZE_KNOWN_P (b) && val_diff == -MEM_SIZE (b)))); > } > > return false; > Index: gcc/config/s390/s390.c > =================================================================== > --- gcc/config/s390/s390.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/s390/s390.c 2011-07-17 11:40:14.000000000 +0100 > @@ -4099,7 +4099,7 @@ s390_expand_setmem (rtx dst, rtx len, rt > DST is set to size 1 so the rest of the memory location > does not count as source operand. */ > rtx dstp1 = adjust_address (dst, VOIDmode, 1); > - set_mem_size (dst, const1_rtx); > + set_mem_size (dst, 1); > > emit_insn (gen_movmem_short (dstp1, dst, > GEN_INT (INTVAL (len) - 2))); > @@ -4142,7 +4142,7 @@ s390_expand_setmem (rtx dst, rtx len, rt > else > { > dstp1 = adjust_address (dst, VOIDmode, 1); > - set_mem_size (dst, const1_rtx); > + set_mem_size (dst, 1); > > /* Initialize memory by storing the first byte. */ > emit_move_insn (adjust_address (dst, QImode, 0), val); > @@ -4551,7 +4551,7 @@ s390_expand_insv (rtx dest, rtx op1, rtx > GET_MODE_SIZE (word_mode) - size); > > dest = adjust_address (dest, BLKmode, 0); > - set_mem_size (dest, GEN_INT (size)); > + set_mem_size (dest, size); > s390_expand_movmem (dest, src_mem, GEN_INT (size)); > } > > @@ -4569,7 +4569,7 @@ s390_expand_insv (rtx dest, rtx op1, rtx > > emit_move_insn (adjust_address (dest, SImode, size), > gen_lowpart (SImode, src)); > - set_mem_size (dest, GEN_INT (size)); > + set_mem_size (dest, size); > emit_move_insn (gen_rtx_ZERO_EXTRACT (word_mode, dest, GEN_INT > (stcmh_width), const0_rtx), > gen_rtx_LSHIFTRT (word_mode, src, GEN_INT > Index: gcc/config/s390/s390.md > =================================================================== > --- gcc/config/s390/s390.md 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/s390/s390.md 2011-07-17 11:40:14.000000000 +0100 > @@ -3295,7 +3295,7 @@ (define_insn_and_split "*extzv<mode>" > int mask = ((1ul << size) - 1) << (GET_MODE_SIZE (SImode) - size); > > operands[1] = adjust_address (operands[1], BLKmode, 0); > - set_mem_size (operands[1], GEN_INT (size)); > + set_mem_size (operands[1], size); > operands[2] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - bitsize); > operands[3] = GEN_INT (mask); > }) > @@ -3322,7 +3322,7 @@ (define_insn_and_split "*extv<mode>" > int mask = ((1ul << size) - 1) << (GET_MODE_SIZE (SImode) - size); > > operands[1] = adjust_address (operands[1], BLKmode, 0); > - set_mem_size (operands[1], GEN_INT (size)); > + set_mem_size (operands[1], size); > operands[2] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - bitsize); > operands[3] = GEN_INT (mask); > }) > @@ -3656,7 +3656,7 @@ (define_insn_and_split "*extendqi<mode>2 > (clobber (reg:CC CC_REGNUM))])] > { > operands[1] = adjust_address (operands[1], BLKmode, 0); > - set_mem_size (operands[1], GEN_INT (GET_MODE_SIZE (QImode))); > + set_mem_size (operands[1], GET_MODE_SIZE (QImode)); > operands[2] = GEN_INT (GET_MODE_BITSIZE (<MODE>mode) > - GET_MODE_BITSIZE (QImode)); > }) > Index: gcc/config/sh/sh.c > =================================================================== > --- gcc/config/sh/sh.c 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/sh/sh.c 2011-07-17 11:40:14.000000000 +0100 > @@ -1456,7 +1456,7 @@ expand_block_move (rtx *operands) > rtx from = adjust_automodify_address (src, BLKmode, > src_addr, copied); > > - set_mem_size (from, GEN_INT (4)); > + set_mem_size (from, 4); > emit_insn (gen_movua (temp, from)); > emit_move_insn (src_addr, plus_constant (src_addr, 4)); > emit_move_insn (to, temp); > Index: gcc/config/sh/sh.md > =================================================================== > --- gcc/config/sh/sh.md 2011-07-17 11:30:32.000000000 +0100 > +++ gcc/config/sh/sh.md 2011-07-17 11:40:14.000000000 +0100 > @@ -11070,7 +11070,7 @@ (define_expand "extv" > && MEM_P (operands[1]) && MEM_ALIGN (operands[1]) < 32) > { > rtx src = adjust_address (operands[1], BLKmode, 0); > - set_mem_size (src, GEN_INT (4)); > + set_mem_size (src, 4); > emit_insn (gen_movua (operands[0], src)); > DONE; > } > @@ -11102,7 +11102,7 @@ (define_expand "extzv" > && MEM_P (operands[1]) && MEM_ALIGN (operands[1]) < 32) > { > rtx src = adjust_address (operands[1], BLKmode, 0); > - set_mem_size (src, GEN_INT (4)); > + set_mem_size (src, 4); > emit_insn (gen_movua (operands[0], src)); > DONE; > } >