middle-end/94539 - void * aliases every other pointer
authorRichard Biener <rguenther@suse.de>
Tue, 14 Apr 2020 11:16:25 +0000 (13:16 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 15 Apr 2020 07:19:26 +0000 (09:19 +0200)
This makes same_type_for_tbaa_p conservative in the same way
get_alias_set is about void * which we allow to alias all other
pointers.

2020-04-15  Richard Biener  <rguenther@suse.de>

PR middle-end/94539
* tree-ssa-alias.c (same_type_for_tbaa): Defer to
alias_sets_conflict_p for pointers.

* gcc.dg/alias-14.c: Make dg-do run.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/alias-14.c
gcc/tree-ssa-alias.c

index 3c6a45e8fe702b8bbadda88b2f9c39e6c0863ea9..2d6c5c88b7d1862fba9d13adf390e18c2e3d5b02 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-15  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/94539
+       * tree-ssa-alias.c (same_type_for_tbaa): Defer to
+       alias_sets_conflict_p for pointers.
+
 2020-04-14  Max Filippov  <jcmvbkbc@gmail.com>
 
        PR target/94584
index 69f9b93cd499a84dcfd568413fa05d85b96869ca..0e4eea3873d221fb7d4c60e86f74dd4305bfd620 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-15  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/94539
+       * gcc.dg/alias-14.c: Make dg-do run.
+
 2020-04-13  Max Filippov  <jcmvbkbc@gmail.com>
 
        PR target/94584
index 1ca1c09d5e35934aee5219bf9fc1e21a5fcaead0..24f0d1c1168cdf4b273c1468f6aaa58ee50a9b22 100644 (file)
@@ -1,4 +1,4 @@
-/* { dg-do compile } */
+/* { dg-do run } */
 /* { dg-options "-O2" } */
 #include <stddef.h>
 void *a;
index df9ba0de0d6774c40c0c6076c6a42d81e601af85..ede4f198342db99e58c6d7febac1d957b9e18df8 100644 (file)
@@ -839,7 +839,16 @@ same_type_for_tbaa (tree type1, tree type2)
      would mean that conversions between them are useless, whereas they are
      not (e.g. type and subtypes can have different modes).  So, in the end,
      they are only guaranteed to have the same alias set.  */
-  if (get_alias_set (type1) == get_alias_set (type2))
+  alias_set_type set1 = get_alias_set (type1);
+  alias_set_type set2 = get_alias_set (type2);
+  if (set1 == set2)
+    return -1;
+
+  /* Pointers to void are considered compatible with all other pointers,
+     so for two pointers see what the alias set resolution thinks.  */
+  if (POINTER_TYPE_P (type1)
+      && POINTER_TYPE_P (type2)
+      && alias_sets_conflict_p (set1, set2))
     return -1;
 
   /* The types are known to be not equal.  */