Commit 1285011e by Richard Kenner

emit-rtl.c (set_mem_attributes): Set RTX_UNCHANGINGP_P if T is a constant expression.

	* emit-rtl.c (set_mem_attributes): Set RTX_UNCHANGINGP_P if T is a
	constant expression.
	(set_mem_decl): New function.
	* expr.h (set_mem_decl): New declaration.
	* final.c (get_decl_from_op): Don't use ORIGINAL_REGNO if not pseudo.
	(output_asm_operand_names): Add tab.
	* reload1.c (alter_reg): Set decl of MEM from REG_DECL.

From-SVN: r46733
parent 343fb412
...@@ -1691,8 +1691,9 @@ set_mem_attributes (ref, t, objectp) ...@@ -1691,8 +1691,9 @@ set_mem_attributes (ref, t, objectp)
MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type); MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type);
MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type); MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type);
RTX_UNCHANGING_P (ref) RTX_UNCHANGING_P (ref)
|= (lang_hooks.honor_readonly |= ((lang_hooks.honor_readonly
&& (TYPE_READONLY (type) || TREE_READONLY (t))); && (TYPE_READONLY (type) || TREE_READONLY (t)))
|| (! TYPE_P (t) && TREE_CONSTANT (t)));
/* If we are making an object of this type, or if this is a DECL, we know /* If we are making an object of this type, or if this is a DECL, we know
that it is a scalar if the type is not an aggregate. */ that it is a scalar if the type is not an aggregate. */
...@@ -1783,6 +1784,18 @@ set_mem_align (mem, align) ...@@ -1783,6 +1784,18 @@ set_mem_align (mem, align)
MEM_OFFSET (mem), MEM_SIZE (mem), align, MEM_OFFSET (mem), MEM_SIZE (mem), align,
GET_MODE (mem)); GET_MODE (mem));
} }
/* Set the decl for MEM to DECL. */
void
set_mem_decl (mem, decl)
rtx mem;
tree decl;
{
MEM_ATTRS (mem)
= get_mem_attrs (MEM_ALIAS_SET (mem), decl, MEM_OFFSET (mem),
MEM_SIZE (mem), MEM_ALIGN (mem), GET_MODE (mem));
}
/* Return a memory reference like MEMREF, but with its mode changed to MODE /* Return a memory reference like MEMREF, but with its mode changed to MODE
and its address changed to ADDR. (VOIDmode means don't change the mode. and its address changed to ADDR. (VOIDmode means don't change the mode.
......
...@@ -615,6 +615,9 @@ extern void set_mem_alias_set PARAMS ((rtx, HOST_WIDE_INT)); ...@@ -615,6 +615,9 @@ extern void set_mem_alias_set PARAMS ((rtx, HOST_WIDE_INT));
/* Set the alignment of MEM to ALIGN bits. */ /* Set the alignment of MEM to ALIGN bits. */
extern void set_mem_align PARAMS ((rtx, unsigned int)); extern void set_mem_align PARAMS ((rtx, unsigned int));
/* Set the DECL for MEM to DECL. */
extern void set_mem_decl PARAMS ((rtx, tree));
/* Return a memory reference like MEMREF, but with its mode changed /* Return a memory reference like MEMREF, but with its mode changed
to MODE and its address changed to ADDR. to MODE and its address changed to ADDR.
(VOIDmode means don't change the mode. (VOIDmode means don't change the mode.
......
...@@ -3304,7 +3304,7 @@ get_decl_from_op (op, paddressp) ...@@ -3304,7 +3304,7 @@ get_decl_from_op (op, paddressp)
*paddressp = 0; *paddressp = 0;
if (GET_CODE (op) == REG) if (GET_CODE (op) == REG && ORIGINAL_REGNO (op) >= FIRST_PSEUDO_REGISTER)
return REGNO_DECL (ORIGINAL_REGNO (op)); return REGNO_DECL (ORIGINAL_REGNO (op));
else if (GET_CODE (op) != MEM) else if (GET_CODE (op) != MEM)
return 0; return 0;
...@@ -3353,9 +3353,9 @@ output_asm_operand_names (operands, oporder, nops) ...@@ -3353,9 +3353,9 @@ output_asm_operand_names (operands, oporder, nops)
if (decl && DECL_NAME (decl)) if (decl && DECL_NAME (decl))
{ {
fprintf (asm_out_file, "%s %s%s", fprintf (asm_out_file, "%c%s %s%s",
wrote ? "," : ASM_COMMENT_START, addressp ? "*" : "", wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START,
IDENTIFIER_POINTER (DECL_NAME (decl))); addressp ? "*" : "", IDENTIFIER_POINTER (DECL_NAME (decl)));
wrote = 1; wrote = 1;
} }
} }
......
...@@ -2043,8 +2043,17 @@ alter_reg (i, from_reg) ...@@ -2043,8 +2043,17 @@ alter_reg (i, from_reg)
/* If we have any adjustment to make, or if the stack slot is the /* If we have any adjustment to make, or if the stack slot is the
wrong mode, make a new stack slot. */ wrong mode, make a new stack slot. */
if (adjust != 0 || GET_MODE (x) != GET_MODE (regno_reg_rtx[i])) x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust);
x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust);
/* If we have a decl for the original register, set it for the
memory. If this is a shared MEM, make a copy. */
if (REGNO_DECL (i))
{
if (from_reg != -1 && spill_stack_slot[from_reg] == x)
x = copy_rtx (x);
set_mem_decl (x, REGNO_DECL (i));
}
/* Save the stack slot for later. */ /* Save the stack slot for later. */
reg_equiv_memory_loc[i] = x; reg_equiv_memory_loc[i] = x;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment