]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
alias.c (get_alias_set): Assign a single alias-set to all pointers.
authorRichard Guenther <rguenther@suse.de>
Wed, 25 Aug 2010 14:46:40 +0000 (14:46 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 25 Aug 2010 14:46:40 +0000 (14:46 +0000)
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

gcc/ChangeLog
gcc/alias.c
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/gimple.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/alias-8.c

index 551e93b9f610104c34f3057c27983b6156793f1e..514c1f5dd6818b1ed7e217422849e5d970734f88 100644 (file)
@@ -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
index fac5a024c46d10eed19f602ed33ac40db003d67a..98706a040341cd1142ee85ad8824fb5acae7ec34 100644 (file)
@@ -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 ();
index 072aad4d4ca21e867427140ffec987abaef3f388..165ec2032b5474d0f3a5da0a96c293c45eec3a64 100644 (file)
@@ -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.
index e2c5d28d08e301e2a75202efe5b038d49eff9d61..3a79968b202af354363658556df407d1b728e979 100644 (file)
@@ -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
index 50b2eab4c527a78555ae439d665cc0ef7a85ec9b..7433b14c36765803bfd4a36d571d10ec90094af8 100644 (file)
@@ -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;
 }
index a3153af2613c4d7bc795f647713067e6692500cb..372024fd7cde6eaa251243f278c005d530ddd6e9 100644 (file)
@@ -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.
index 690f1b62da94bd8045ab83bed16052de232dafeb..8eba671a05825d97cae1c770d2f767977c5b9c58 100644 (file)
@@ -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 *-*-* } } */
 }