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
This commit is contained in:
Richard Kenner 2001-11-03 10:50:04 -05:00
parent 343fb41208
commit 1285011e67
4 changed files with 33 additions and 8 deletions

View File

@ -1691,8 +1691,9 @@ set_mem_attributes (ref, t, objectp)
MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type);
MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type);
RTX_UNCHANGING_P (ref)
|= (lang_hooks.honor_readonly
&& (TYPE_READONLY (type) || TREE_READONLY (t)));
|= ((lang_hooks.honor_readonly
&& (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
that it is a scalar if the type is not an aggregate. */
@ -1783,6 +1784,18 @@ set_mem_align (mem, align)
MEM_OFFSET (mem), MEM_SIZE (mem), align,
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
and its address changed to ADDR. (VOIDmode means don't change the mode.

View File

@ -615,6 +615,9 @@ extern void set_mem_alias_set PARAMS ((rtx, HOST_WIDE_INT));
/* Set the alignment of MEM to ALIGN bits. */
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
to MODE and its address changed to ADDR.
(VOIDmode means don't change the mode.

View File

@ -3304,7 +3304,7 @@ get_decl_from_op (op, paddressp)
*paddressp = 0;
if (GET_CODE (op) == REG)
if (GET_CODE (op) == REG && ORIGINAL_REGNO (op) >= FIRST_PSEUDO_REGISTER)
return REGNO_DECL (ORIGINAL_REGNO (op));
else if (GET_CODE (op) != MEM)
return 0;
@ -3353,9 +3353,9 @@ output_asm_operand_names (operands, oporder, nops)
if (decl && DECL_NAME (decl))
{
fprintf (asm_out_file, "%s %s%s",
wrote ? "," : ASM_COMMENT_START, addressp ? "*" : "",
IDENTIFIER_POINTER (DECL_NAME (decl)));
fprintf (asm_out_file, "%c%s %s%s",
wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START,
addressp ? "*" : "", IDENTIFIER_POINTER (DECL_NAME (decl)));
wrote = 1;
}
}

View File

@ -2043,8 +2043,17 @@ alter_reg (i, from_reg)
/* If we have any adjustment to make, or if the stack slot is the
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. */
reg_equiv_memory_loc[i] = x;