https://gcc.gnu.org/g:9b7cad5884f21cc5783075be0043777448db3fab

commit r15-512-g9b7cad5884f21cc5783075be0043777448db3fab
Author: Jan Hubicka <j...@suse.cz>
Date:   Wed May 15 14:14:27 2024 +0200

    Avoid pointer compares on TYPE_MAIN_VARIANT in TBAA
    
    while building more testcases for ipa-icf I noticed that there are two 
places
    in aliasing code where we still compare TYPE_MAIN_VARIANT for pointer 
equality.
    This is not good idea for LTO since type merging may not happen for example
    when in one unit pointed to type is forward declared while in other it is 
fully
    defined.  We have same_type_for_tbaa for that.
    
    Bootstrapped/regtested x86_64-linux, OK?
    
    gcc/ChangeLog:
    
            * alias.cc (reference_alias_ptr_type_1): Use 
view_converted_memref_p.
            * alias.h (view_converted_memref_p): Declare.
            * tree-ssa-alias.cc (view_converted_memref_p): Export.
            (ao_compare::compare_ao_refs): Use same_type_for_tbaa.

Diff:
---
 gcc/alias.cc          | 5 +----
 gcc/alias.h           | 1 +
 gcc/tree-ssa-alias.cc | 6 +++---
 3 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/gcc/alias.cc b/gcc/alias.cc
index 808e2095d9b4..853e84d7439a 100644
--- a/gcc/alias.cc
+++ b/gcc/alias.cc
@@ -770,10 +770,7 @@ reference_alias_ptr_type_1 (tree *t)
   /* If the innermost reference is a MEM_REF that has a
      conversion embedded treat it like a VIEW_CONVERT_EXPR above,
      using the memory access type for determining the alias-set.  */
-  if (TREE_CODE (inner) == MEM_REF
-      && (TYPE_MAIN_VARIANT (TREE_TYPE (inner))
-         != TYPE_MAIN_VARIANT
-              (TREE_TYPE (TREE_TYPE (TREE_OPERAND (inner, 1))))))
+  if (view_converted_memref_p (inner))
     {
       tree alias_ptrtype = TREE_TYPE (TREE_OPERAND (inner, 1));
       /* Unless we have the (aggregate) effective type of the access
diff --git a/gcc/alias.h b/gcc/alias.h
index f8d93e8b5f4c..36095f0bf736 100644
--- a/gcc/alias.h
+++ b/gcc/alias.h
@@ -41,6 +41,7 @@ bool alias_ptr_types_compatible_p (tree, tree);
 int compare_base_decls (tree, tree);
 bool refs_same_for_tbaa_p (tree, tree);
 bool mems_same_for_tbaa_p (rtx, rtx);
+bool view_converted_memref_p (tree);
 
 /* This alias set can be used to force a memory to conflict with all
    other memories, creating a barrier across which no memory reference
diff --git a/gcc/tree-ssa-alias.cc b/gcc/tree-ssa-alias.cc
index 374ba04e6fd0..96301bbde7fa 100644
--- a/gcc/tree-ssa-alias.cc
+++ b/gcc/tree-ssa-alias.cc
@@ -2049,7 +2049,7 @@ decl_refs_may_alias_p (tree ref1, tree base1,
    which is done by ao_ref_base and thus one extra walk
    of handled components is needed.  */
 
-static bool
+bool
 view_converted_memref_p (tree base)
 {
   if (TREE_CODE (base) != MEM_REF && TREE_CODE (base) != TARGET_MEM_REF)
@@ -4330,8 +4330,8 @@ ao_compare::compare_ao_refs (ao_ref *ref1, ao_ref *ref2,
   else if ((end_struct_ref1 != NULL) != (end_struct_ref2 != NULL))
     return flags | ACCESS_PATH;
   if (end_struct_ref1
-      && TYPE_MAIN_VARIANT (TREE_TYPE (end_struct_ref1))
-        != TYPE_MAIN_VARIANT (TREE_TYPE (end_struct_ref2)))
+      && same_type_for_tbaa (TREE_TYPE (end_struct_ref1),
+                            TREE_TYPE (end_struct_ref2)) != 1)
     return flags | ACCESS_PATH;
 
   /* Now compare all handled components of the access path.

Reply via email to