diff options
author | Richard Guenther <rguenther@suse.de> | 2010-08-25 14:46:40 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-08-25 14:46:40 +0000 |
commit | 0ceb0201344a65bab37d6933601df77a512c334e (patch) | |
tree | c4d74b3812fa459819b2f5da7990bb89f3b7126b /gcc/alias.c | |
parent | 22b139e167cdd083f3e38280e1db5880d05a130b (diff) | |
download | gcc-0ceb0201344a65bab37d6933601df77a512c334e.zip gcc-0ceb0201344a65bab37d6933601df77a512c334e.tar.gz gcc-0ceb0201344a65bab37d6933601df77a512c334e.tar.bz2 |
alias.c (get_alias_set): Assign a single alias-set to all pointers.
2010-08-25 Richard Guenther <rguenther@suse.de>
* alias.c (get_alias_set): Assign a single alias-set to
all pointers.
* gimple.c (gimple_get_alias_set): Remove special handling
for pointers.
c-family/
* c-common.c (c_common_get_alias_set): Remove special
handling for pointers.
* gcc.dg/alias-8.c: Adjust.
From-SVN: r163549
Diffstat (limited to 'gcc/alias.c')
-rw-r--r-- | gcc/alias.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/gcc/alias.c b/gcc/alias.c index fac5a02..98706a0 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -761,6 +761,62 @@ get_alias_set (tree t) else if (TREE_CODE (t) == ARRAY_TYPE && !TYPE_NONALIASED_COMPONENT (t)) set = get_alias_set (TREE_TYPE (t)); + /* From the former common C and C++ langhook implementation: + + Unfortunately, there is no canonical form of a pointer type. + In particular, if we have `typedef int I', then `int *', and + `I *' are different types. So, we have to pick a canonical + representative. We do this below. + + Technically, this approach is actually more conservative that + it needs to be. In particular, `const int *' and `int *' + should be in different alias sets, according to the C and C++ + standard, since their types are not the same, and so, + technically, an `int **' and `const int **' cannot point at + the same thing. + + But, the standard is wrong. In particular, this code is + legal C++: + + int *ip; + int **ipp = &ip; + const int* const* cipp = ipp; + And, it doesn't make sense for that to be legal unless you + can dereference IPP and CIPP. So, we ignore cv-qualifiers on + the pointed-to types. This issue has been reported to the + C++ committee. + + In addition to the above canonicalization issue, with LTO + we should also canonicalize `T (*)[]' to `T *' avoiding + alias issues with pointer-to element types and pointer-to + array types. + + Likewise we need to deal with the situation of incomplete + pointed-to types and make `*(struct X **)&a' and + `*(struct X {} **)&a' alias. Otherwise we will have to + guarantee that all pointer-to incomplete type variants + will be replaced by pointer-to complete type variants if + they are available. + + With LTO the convenient situation of using `void *' to + access and store any pointer type will also become + more apparent (and `void *' is just another pointer-to + incomplete type). Assigning alias-set zero to `void *' + and all pointer-to incomplete types is a not appealing + solution. Assigning an effective alias-set zero only + affecting pointers might be - by recording proper subset + relationships of all pointer alias-sets. + + Pointer-to function types are another grey area which + needs caution. Globbing them all into one alias-set + or the above effective zero set would work. + + For now just assign the same alias-set to all pointers. + That's simple and avoids all the above problems. */ + else if (POINTER_TYPE_P (t) + && t != ptr_type_node) + return get_alias_set (ptr_type_node); + /* Otherwise make a new alias set for this type. */ else set = new_alias_set (); |