Commit dc1618bc by Richard Kenner Committed by Richard Kenner

alias.c (aliases_everything_p): Don't special-case QImode here.

	* alias.c (aliases_everything_p): Don't special-case QImode here.
	* c-common.c (c_get_alias_set): Do it here.
	Handle BIT_FIELD_REF by getting alias info for arg.
	Use POINTER_TYPE_P.

From-SVN: r34050
parent de467fe7
Sat May 20 09:30:55 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* alias.c (aliases_everything_p): Don't special-case QImode here.
* c-common.c (c_get_alias_set): Do it here.
Handle BIT_FIELD_REF by getting alias info for arg.
Use POINTER_TYPE_P.
2000-05-20 Alexandre Oliva <aoliva@cygnus.com> 2000-05-20 Alexandre Oliva <aoliva@cygnus.com>
* mklibgcc.in: Restore rule to create ${dir}. * mklibgcc.in: Restore rule to create ${dir}.
......
...@@ -1213,14 +1213,12 @@ memrefs_conflict_p (xsize, x, ysize, y, c) ...@@ -1213,14 +1213,12 @@ memrefs_conflict_p (xsize, x, ysize, y, c)
changed. A volatile and non-volatile reference can be interchanged changed. A volatile and non-volatile reference can be interchanged
though. though.
A MEM_IN_STRUCT reference at a non-QImode non-AND varying address can never A MEM_IN_STRUCT reference at a non-AND varying address can never
conflict with a non-MEM_IN_STRUCT reference at a fixed address. We must conflict with a non-MEM_IN_STRUCT reference at a fixed address. We
allow QImode aliasing because the ANSI C standard allows character also must allow AND addresses, because they may generate accesses
pointers to alias anything. We are assuming that characters are outside the object being referenced. This is used to generate
always QImode here. We also must allow AND addresses, because they may aligned addresses from unaligned addresses, for instance, the alpha
generate accesses outside the object being referenced. This is used to storeqi_unaligned pattern. */
generate aligned addresses from unaligned addresses, for instance, the
alpha storeqi_unaligned pattern. */
/* Read dependence: X is read after read in MEM takes place. There can /* Read dependence: X is read after read in MEM takes place. There can
only be a dependence here if both reads are volatile. */ only be a dependence here if both reads are volatile. */
...@@ -1269,10 +1267,6 @@ static int ...@@ -1269,10 +1267,6 @@ static int
aliases_everything_p (mem) aliases_everything_p (mem)
rtx mem; rtx mem;
{ {
if (GET_MODE (mem) == QImode)
/* ANSI C says that a `char*' can point to anything. */
return 1;
if (GET_CODE (XEXP (mem, 0)) == AND) if (GET_CODE (XEXP (mem, 0)) == AND)
/* If the address is an AND, its very hard to know at what it is /* If the address is an AND, its very hard to know at what it is
actually pointing. */ actually pointing. */
......
...@@ -3332,21 +3332,20 @@ c_get_alias_set (t) ...@@ -3332,21 +3332,20 @@ c_get_alias_set (t)
if (t == error_mark_node) if (t == error_mark_node)
return 0; return 0;
type = (TYPE_P (t)) ? t : TREE_TYPE (t); /* For a bit field reference that's not to a specific field,
all we can say is the aliasing information for the underlying object. */
if (TREE_CODE (t) == BIT_FIELD_REF)
t = TREE_OPERAND (t, 0);
/* If this is a type, use it, otherwise get the type of the expression.
If the type is an error type, say this may alias anything. */
type = TYPE_P (t) ? t : TREE_TYPE (t);
if (type == error_mark_node) if (type == error_mark_node)
return 0; return 0;
/* Deal with special cases first; for certain kinds of references /* Deal with special cases first; for certain kinds of references
we're interested in more than just the type. */ we're interested in more than just the type. */
if (TREE_CODE (t) == BIT_FIELD_REF)
/* Perhaps reads and writes to this piece of data alias fields
neighboring the bitfield. Perhaps that's impossible. For now,
let's just assume that bitfields can alias everything, which is
the conservative assumption. */
return 0;
/* Permit type-punning when accessing a union, provided the access /* Permit type-punning when accessing a union, provided the access
is directly through the union. For example, this code does not is directly through the union. For example, this code does not
permit taking the address of a union member and then storing permit taking the address of a union member and then storing
...@@ -3363,11 +3362,19 @@ c_get_alias_set (t) ...@@ -3363,11 +3362,19 @@ c_get_alias_set (t)
if (TREE_CODE (t) == INDIRECT_REF) if (TREE_CODE (t) == INDIRECT_REF)
{ {
/* Check for accesses through restrict-qualified pointers. */ /* Check for accesses through restrict-qualified pointers. */
tree decl = c_find_base_decl (TREE_OPERAND (t, 0)); tree op = TREE_OPERAND (t, 0);
tree decl = c_find_base_decl (op);
if (decl && DECL_POINTER_ALIAS_SET_KNOWN_P (decl)) if (decl && DECL_POINTER_ALIAS_SET_KNOWN_P (decl))
/* We use the alias set indicated in the declaration. */ /* We use the alias set indicated in the declaration. */
return DECL_POINTER_ALIAS_SET (decl); return DECL_POINTER_ALIAS_SET (decl);
/* If this is a char *, the ANSI C standard says it can alias
anything. */
if (TREE_CODE (TREE_TYPE (op)) == INTEGER_TYPE
&& (TYPE_PRECISION (TREE_TYPE (op))
== TYPE_PRECISION (char_type_node)))
return 0;
} }
/* From here on, only the type matters. */ /* From here on, only the type matters. */
...@@ -3424,8 +3431,7 @@ c_get_alias_set (t) ...@@ -3424,8 +3431,7 @@ c_get_alias_set (t)
whose type is the same as one of the fields, recursively, but whose type is the same as one of the fields, recursively, but
we don't yet make any use of that information.) */ we don't yet make any use of that information.) */
TYPE_ALIAS_SET (type) = 0; TYPE_ALIAS_SET (type) = 0;
else if (TREE_CODE (type) == POINTER_TYPE else if (POINTER_TYPE_P (type))
|| TREE_CODE (type) == REFERENCE_TYPE)
{ {
tree t; tree t;
...@@ -3459,7 +3465,7 @@ c_get_alias_set (t) ...@@ -3459,7 +3465,7 @@ c_get_alias_set (t)
TYPE_ALIAS_SET (type) = c_get_alias_set (t); TYPE_ALIAS_SET (type) = c_get_alias_set (t);
} }
if (!TYPE_ALIAS_SET_KNOWN_P (type)) if (! TYPE_ALIAS_SET_KNOWN_P (type))
/* TYPE is something we haven't seen before. Put it in a new /* TYPE is something we haven't seen before. Put it in a new
alias set. */ alias set. */
TYPE_ALIAS_SET (type) = new_alias_set (); TYPE_ALIAS_SET (type) = new_alias_set ();
......
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