tree-ssa-alias.c (type_has_components_p): New function.
authorJan Hubicka <jh@suse.cz>
Fri, 31 May 2019 14:16:27 +0000 (16:16 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 31 May 2019 14:16:27 +0000 (14:16 +0000)
* tree-ssa-alias.c (type_has_components_p): New function.
(aliasing_component_refs_p): Use it.

From-SVN: r271813

gcc/ChangeLog
gcc/tree-ssa-alias.c

index c4447288cc10c09d54721a0f23cb491511f79778..b04b38b5b9fad988d7122090730901f5e85e2921 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-31  Jan Hubicka  <jh@suse.cz>
+
+       * tree-ssa-alias.c (type_has_components_p): New function.
+       (aliasing_component_refs_p): Use it.
+
 2019-05-31  Martin Liska  <mliska@suse.cz>
 
        * gdbhooks.py: Add const_tree to TreePrinter.
index 3ecb337ffdf2a53d2197075773c39793c9ae4ca3..429288b6ca523a7ed09267e651e3a35d8d53479f 100644 (file)
@@ -822,6 +822,16 @@ same_type_for_tbaa (tree type1, tree type2)
   return 0;
 }
 
+/* Return true if TYPE is a composite type (i.e. we may apply one of handled
+   components on it).  */
+
+static bool
+type_has_components_p (tree type)
+{
+  return AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type)
+        || TREE_CODE (type) == COMPLEX_TYPE;
+}
+
 /* Determine if the two component references REF1 and REF2 which are
    based on access types TYPE1 and TYPE2 and of which at least one is based
    on an indirect reference may alias.  REF2 is the only one that can
@@ -965,6 +975,7 @@ aliasing_component_refs_p (tree ref1,
      if there is no B2 in the tail of path1 and no B1 on the
      tail of path2.  */
   if (compare_type_sizes (TREE_TYPE (ref2), type1) >= 0
+      && type_has_components_p (TREE_TYPE (ref2))
       && (base1_alias_set == ref2_alias_set
           || alias_set_subset_of (base1_alias_set, ref2_alias_set)))
     {
@@ -974,6 +985,7 @@ aliasing_component_refs_p (tree ref1,
   /* If this is ptr vs. decl then we know there is no ptr ... decl path.  */
   if (!ref2_is_decl
       && compare_type_sizes (TREE_TYPE (ref1), type2) >= 0
+      && type_has_components_p (TREE_TYPE (ref1))
       && (base2_alias_set == ref1_alias_set
          || alias_set_subset_of (base2_alias_set, ref1_alias_set)))
     {