Commit 03bf2c23 by Richard Kenner Committed by Richard Kenner

langhooks.h (LANG_HOOKS_HONOR_READONLY): New macro.

	* langhooks.h (LANG_HOOKS_HONOR_READONLY): New macro.
	* toplev.h (struct lang_hooks): New field HONOR_READONLY.
	* emit-rtl.c (set_mem_attributes): Set RTX_UNCHANGING_P from
	TREE_READONLY and TYPE_READONLY if lang_hooks.honor_readonly.
	Set alignment from type if INDIRECT_REF.
	(adjust_address_1, offset_address): Simplify alignment compuitation.
	* expr.c (expand_expr, case INDIRECT_REF): Don't set RTX_UNCHANGING_P
	here; done by set_mem_attributes.

From-SVN: r46361
parent 91ea4f8d
Fri Oct 19 15:24:39 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* langhooks.h (LANG_HOOKS_HONOR_READONLY): New macro.
* toplev.h (struct lang_hooks): New field HONOR_READONLY.
* emit-rtl.c (set_mem_attributes): Set RTX_UNCHANGING_P from
TREE_READONLY and TYPE_READONLY if lang_hooks.honor_readonly.
Set alignment from type if INDIRECT_REF.
(adjust_address_1, offset_address): Simplify alignment compuitation.
* expr.c (expand_expr, case INDIRECT_REF): Don't set RTX_UNCHANGING_P
here; done by set_mem_attributes.
2001-10-19 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2001-10-19 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* Makefile.in (rtlanal.o): Depend on $(TM_P_H). * Makefile.in (rtlanal.o): Depend on $(TM_P_H).
......
...@@ -1672,13 +1672,11 @@ set_mem_attributes (ref, t, objectp) ...@@ -1672,13 +1672,11 @@ set_mem_attributes (ref, t, objectp)
front-end routine). */ front-end routine). */
set_mem_alias_set (ref, get_alias_set (t)); set_mem_alias_set (ref, get_alias_set (t));
/* It is incorrect to set RTX_UNCHANGING_P from TREE_READONLY (type)
here, because, in C and C++, the fact that a location is accessed
through a const expression does not mean that the value there can
never change. */
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)
|= (lang_hooks.honor_readonly
&& (TYPE_READONLY (type) || TREE_READONLY (t)));
/* If we are making an object of this type, we know that it is a scalar if /* If we are making an object of this type, we know that it is a scalar if
the type is not an aggregate. */ the type is not an aggregate. */
...@@ -1717,6 +1715,10 @@ set_mem_attributes (ref, t, objectp) ...@@ -1717,6 +1715,10 @@ set_mem_attributes (ref, t, objectp)
? GEN_INT (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (t)), 1)) ? GEN_INT (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (t)), 1))
: 0, DECL_ALIGN (t) / BITS_PER_UNIT); : 0, DECL_ALIGN (t) / BITS_PER_UNIT);
/* If this is an INDIRECT_REF, we know its alignment. */
if (TREE_CODE (t) == INDIRECT_REF)
set_mem_align (ref, TYPE_ALIGN (type) / BITS_PER_UNIT);
/* Now see if we can say more about whether it's an aggregate or /* Now see if we can say more about whether it's an aggregate or
scalar. If we already know it's an aggregate, don't bother. */ scalar. If we already know it's an aggregate, don't bother. */
if (MEM_IN_STRUCT_P (ref)) if (MEM_IN_STRUCT_P (ref))
...@@ -1860,14 +1862,11 @@ adjust_address_1 (memref, mode, offset, validate) ...@@ -1860,14 +1862,11 @@ adjust_address_1 (memref, mode, offset, validate)
if (memoffset) if (memoffset)
memoffset = GEN_INT (offset + INTVAL (memoffset)); memoffset = GEN_INT (offset + INTVAL (memoffset));
/* If the offset is negative, don't try to update the alignment. If it's /* Compute the new alignment by taking the MIN of the alignment and the
zero, the alignment hasn't changed. Otherwise, the known alignment may lowest-order set bit in OFFSET, but don't change the alignment if OFFSET
be less strict. */ if zero. */
if (offset < 0) if (offset != 0)
memalign = 1; memalign = MIN (memalign, offset & -offset);
while (offset > 0 && (offset % memalign) != 0)
memalign >>= 1;
MEM_ATTRS (new) MEM_ATTRS (new)
= get_mem_attrs (MEM_ALIAS_SET (memref), MEM_DECL (memref), memoffset, = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_DECL (memref), memoffset,
...@@ -1893,15 +1892,11 @@ offset_address (memref, offset, pow2) ...@@ -1893,15 +1892,11 @@ offset_address (memref, offset, pow2)
rtx new = change_address_1 (memref, VOIDmode, rtx new = change_address_1 (memref, VOIDmode,
gen_rtx_PLUS (Pmode, XEXP (memref, 0), gen_rtx_PLUS (Pmode, XEXP (memref, 0),
force_reg (Pmode, offset)), 1); force_reg (Pmode, offset)), 1);
unsigned int memalign = MEM_ALIGN (memref);
/* Update the alignment to reflect the offset. Reset the offset, which /* Update the alignment to reflect the offset. Reset the offset, which
we don't know. */ we don't know. */
while (pow2 % memalign != 0)
memalign >>= 1;
MEM_ATTRS (new) = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_DECL (memref), MEM_ATTRS (new) = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_DECL (memref),
0, 0, memalign); 0, 0, MIN (MEM_ALIGN (memref), pow2));
return new; return new;
} }
......
...@@ -6812,13 +6812,6 @@ expand_expr (exp, target, tmode, modifier) ...@@ -6812,13 +6812,6 @@ expand_expr (exp, target, tmode, modifier)
temp = gen_rtx_MEM (mode, op0); temp = gen_rtx_MEM (mode, op0);
set_mem_attributes (temp, exp, 0); set_mem_attributes (temp, exp, 0);
/* It is incorrect to set RTX_UNCHANGING_P from TREE_READONLY
here, because, in C and C++, the fact that a location is accessed
through a pointer to const does not mean that the value there can
never change. Languages where it can never change should
also set TREE_STATIC. */
RTX_UNCHANGING_P (temp) = TREE_READONLY (exp) & TREE_STATIC (exp);
/* If we are writing to this object and its type is a record with /* If we are writing to this object and its type is a record with
readonly fields, we must mark it as readonly so it will readonly fields, we must mark it as readonly so it will
conflict with readonly references to those fields. */ conflict with readonly references to those fields. */
......
...@@ -39,6 +39,9 @@ Boston, MA 02111-1307, USA. */ ...@@ -39,6 +39,9 @@ Boston, MA 02111-1307, USA. */
#ifndef LANG_HOOKS_POST_OPTIONS #ifndef LANG_HOOKS_POST_OPTIONS
#define LANG_HOOKS_POST_OPTIONS NULL #define LANG_HOOKS_POST_OPTIONS NULL
#endif #endif
#ifndef LANG_HOOKS_HONOR_READONLY
#define LANG_HOOKS_HONOR_READONLY 0
#endif
/* Declarations of default tree inlining hooks. */ /* Declarations of default tree inlining hooks. */
tree tree_inlining_default_hook_walk_subtrees PARAMS ((tree*, int *, tree tree_inlining_default_hook_walk_subtrees PARAMS ((tree*, int *,
...@@ -108,6 +111,7 @@ int tree_inlining_default_hook_anon_aggr_type_p PARAMS ((tree)); ...@@ -108,6 +111,7 @@ int tree_inlining_default_hook_anon_aggr_type_p PARAMS ((tree));
LANG_HOOKS_INIT_OPTIONS, \ LANG_HOOKS_INIT_OPTIONS, \
LANG_HOOKS_DECODE_OPTION, \ LANG_HOOKS_DECODE_OPTION, \
LANG_HOOKS_POST_OPTIONS, \ LANG_HOOKS_POST_OPTIONS, \
LANG_HOOKS_HONOR_READONLY, \
LANG_HOOKS_TREE_INLINING_INITIALIZER \ LANG_HOOKS_TREE_INLINING_INITIALIZER \
} }
......
...@@ -166,6 +166,9 @@ struct lang_hooks ...@@ -166,6 +166,9 @@ struct lang_hooks
/* Called when all command line options have been processed. */ /* Called when all command line options have been processed. */
void (*post_options) PARAMS ((void)); void (*post_options) PARAMS ((void));
/* Nonzero if TYPE_READONLY and TREE_READONLY should always be honored. */
int honor_readonly;
struct lang_hooks_for_tree_inlining tree_inlining; struct lang_hooks_for_tree_inlining tree_inlining;
/* Whenever you add entries here, make sure you adjust langhooks.h /* Whenever you add entries here, make sure you adjust langhooks.h
......
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