aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2000-05-20 13:28:13 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2000-05-20 09:28:13 -0400
commitdc1618bcad7b750f862a01b1a620c49390e578e5 (patch)
tree8e4c5560417631a9c39228f416dbb994727e10b5
parentde467fe702dde575e78d7f07fa2d9189273f99cc (diff)
downloadgcc-dc1618bcad7b750f862a01b1a620c49390e578e5.zip
gcc-dc1618bcad7b750f862a01b1a620c49390e578e5.tar.gz
gcc-dc1618bcad7b750f862a01b1a620c49390e578e5.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/alias.c18
-rw-r--r--gcc/c-common.c30
3 files changed, 31 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2ee83e3..6f8d396 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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>
* mklibgcc.in: Restore rule to create ${dir}.
diff --git a/gcc/alias.c b/gcc/alias.c
index 56dfc9d..897c27d 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -1213,14 +1213,12 @@ memrefs_conflict_p (xsize, x, ysize, y, c)
changed. A volatile and non-volatile reference can be interchanged
though.
- A MEM_IN_STRUCT reference at a non-QImode non-AND varying address can never
- conflict with a non-MEM_IN_STRUCT reference at a fixed address. We must
- allow QImode aliasing because the ANSI C standard allows character
- pointers to alias anything. We are assuming that characters are
- always QImode here. We also must allow AND addresses, because they may
- generate accesses outside the object being referenced. This is used to
- generate aligned addresses from unaligned addresses, for instance, the
- alpha storeqi_unaligned pattern. */
+ 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
+ also must allow AND addresses, because they may generate accesses
+ outside the object being referenced. This is used to 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
only be a dependence here if both reads are volatile. */
@@ -1269,10 +1267,6 @@ static int
aliases_everything_p (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 the address is an AND, its very hard to know at what it is
actually pointing. */
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 30985b5..4631417 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -3332,21 +3332,20 @@ c_get_alias_set (t)
if (t == error_mark_node)
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)
return 0;
/* Deal with special cases first; for certain kinds of references
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
is directly through the union. For example, this code does not
permit taking the address of a union member and then storing
@@ -3363,11 +3362,19 @@ c_get_alias_set (t)
if (TREE_CODE (t) == INDIRECT_REF)
{
/* 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))
/* We use the alias set indicated in the declaration. */
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. */
@@ -3424,8 +3431,7 @@ c_get_alias_set (t)
whose type is the same as one of the fields, recursively, but
we don't yet make any use of that information.) */
TYPE_ALIAS_SET (type) = 0;
- else if (TREE_CODE (type) == POINTER_TYPE
- || TREE_CODE (type) == REFERENCE_TYPE)
+ else if (POINTER_TYPE_P (type))
{
tree t;
@@ -3459,7 +3465,7 @@ 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
alias set. */
TYPE_ALIAS_SET (type) = new_alias_set ();