This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: different address spaces
- From: Paul Schlie <schlie at comcast dot net>
- To: Martin Koegler <mkoegler at auto dot tuwien dot ac dot at>,<gcc at gcc dot gnu dot org>
- Date: Thu, 28 Apr 2005 12:37:48 -0400
- Subject: Re: different address spaces
> Martin Koegler wrote:
> I have redone the implementation of the eeprom attribute in my prototype.
> It is now a cleaner solution, but requires larger changes in the core,
> but the changes in the core should not affect any backend/frontend, if
> it does not uses them (except a missing case in tree_copy_mem_area, which
> will cause an assertion to fail).
> ...
> +void
> +tree_copy_mem_area (tree to, tree from)
> ....
Alternatively might it make sense to utilize the analogy defined in rtl.h?
/* Copy the attributes that apply to memory locations from RHS to LHS. */
#define MEM_COPY_ATTRIBUTES(LHS, RHS) \
(MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS), \
MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS), \
MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS), \
MEM_NOTRAP_P (LHS) = MEM_NOTRAP_P (RHS), \
MEM_READONLY_P (LHS) = MEM_READONLY_P (RHS), \
MEM_KEEP_ALIAS_SET_P (LHS) = MEM_KEEP_ALIAS_SET_P (RHS), \
MEM_ATTRS (LHS) = MEM_ATTRS (RHS))
As unfortunately GCC already inconsistently maintains and copies attributes
to memory references, it seems that introducing yet another function to do
so will only likely introduce more inconsistency.
Therefore wonder if it may be best to simply define MEM_ATTRS as you have
done, and then consistently utilize MEM_COPY_ATTRIBUTES to properly copy
attributes associated with memory references when new ones as may need to
be constructed (as all effective address optimizations should be doing, as
otherwise the attributes associated with the original reference will be
lost). I.e.:
Instead of: (as occasionally incorrectly done)
rtx addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0)); // some EA
emit_move_insn (tmp_reg_rtx, gen_rtx_MEM (QImode, addr1)); // lose attribs
emit_move_insn (addr1, gen_rtx_PLUS (Pmode, addr1, const1_rtx)); // new EA
Something like this is necessary:
rtx addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0)); // some EA
rtx mem_1 = gen_rtx_MEM (QImode, addr1); // gen mem
MEM_COPY_ATTRIBUTES (mem_1, operands[1]); // copy attributes
emit_move_insn (tmp_reg_rtx, mem_1); // read value
emit_move_insn (addr1, gen_rtx_PLUS (Pmode, addr1, const1_rtx)); // new EA