On Tue, 14 May 2024, Jan Hubicka wrote:
> Hi,
> 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?
OK.
Richard.
> 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 --git a/gcc/alias.cc b/gcc/alias.cc
> index 808e2095d9b..853e84d7439 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 f8d93e8b5f4..36095f0bf73 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 e7c1c1aa624..632cf78028b 100644
> --- a/gcc/tree-ssa-alias.cc
> +++ b/gcc/tree-ssa-alias.cc
> @@ -2044,7 +2044,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)
> @@ -4325,8 +4325,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.
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)