aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-08-25 14:46:40 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-08-25 14:46:40 +0000
commit0ceb0201344a65bab37d6933601df77a512c334e (patch)
treec4d74b3812fa459819b2f5da7990bb89f3b7126b /gcc
parent22b139e167cdd083f3e38280e1db5880d05a130b (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/alias.c56
-rw-r--r--gcc/c-family/ChangeLog5
-rw-r--r--gcc/c-family/c-common.c31
-rw-r--r--gcc/gimple.c57
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/alias-8.c2
7 files changed, 73 insertions, 89 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 551e93b..514c1f5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
2010-08-25 Bernd Schmidt <bernds@codesourcery.com>
PR middle-end/45355
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 ();
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 072aad4..165ec20 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,8 @@
+2010-08-25 Richard Guenther <rguenther@suse.de>
+
+ * c-common.c (c_common_get_alias_set): Remove special
+ handling for pointers.
+
2010-08-20 Nathan Froyd <froydnj@codesourcery.com>
* c-common.c: Use FOR_EACH_VEC_ELT.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index e2c5d28..3a79968b 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -4087,37 +4087,6 @@ c_common_get_alias_set (tree t)
if (t1 != t)
return get_alias_set (t1);
}
- else if (POINTER_TYPE_P (t))
- {
- tree t1;
-
- /* 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. */
- t1 = build_type_no_quals (t);
- if (t1 != t)
- return get_alias_set (t1);
- }
/* Handle the case of multiple type nodes referring to "the same" type,
which occurs with IMA. These share an alias set. FIXME: Currently only
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 50b2eab..7433b14 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -4582,63 +4582,6 @@ gimple_get_alias_set (tree t)
if (t1 != t)
return get_alias_set (t1);
}
- else if (POINTER_TYPE_P (t))
- {
- /* From the 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. */
- if (t != ptr_type_node)
- return get_alias_set (ptr_type_node);
- }
return -1;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a3153af..372024f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2010-08-25 Richard Guenther <rguenther@suse.de>
+
+ * gcc.dg/alias-8.c: Adjust.
+
2010-08-25 Bernd Schmidt <bernds@codesourcery.com>
* gcc.target/i386/combine-mul.c: New test.
diff --git a/gcc/testsuite/gcc.dg/alias-8.c b/gcc/testsuite/gcc.dg/alias-8.c
index 690f1b6..8eba671 100644
--- a/gcc/testsuite/gcc.dg/alias-8.c
+++ b/gcc/testsuite/gcc.dg/alias-8.c
@@ -8,5 +8,5 @@ struct s {
void
func(struct s *ptr)
{
- *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" } */
+ *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" "" { xfail *-*-* } } */
}