On Fri, 20 Nov 2020, Jan Hubicka wrote:

> Hi,
> one of common remaining reasons for ICF to fail after loading in fuction
> body is mismatched type of automatic vairable.   This is becuase
> compatible_types_p resorts to checking TYPE_MAIN_VARIANTS for
> euqivalence that prevents merging many TBAA compaitle cases.  (And thus
> is also not reflected by the hash extended by alias sets of accesses.)
> 
> Since in gimple
> automatic variables are just blocks of memory I think we should only
> check its size only. All accesses are matched when copmparing the actual
> loads/stores.
> 
> I am not sure if we need to match types of other DECLs but I decided I can try
> to be safe here: for PARM_DECl/RESUILT_DECL we match them anyway to be sure
> that functions are ABI compatible.  For CONST_DECL and readonly global
> VAR_DECLs they are matched when comparing their constructors.  So i think
> we can keep the compare to be safe and perhaps play with it next stage1.
> 
> Bootstrapped/regtested x86_64-linux, OK?

I suppose we eventually check the types of SSA names?  OK if so.

Richard.

> Honza
> 
>       * ipa-icf-gimple.c (func_checker:compare_decl): Do not compare types
>       of local variables.
> diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
> index 69bc9ab5b34..67bb2747981 100644
> --- a/gcc/ipa-icf-gimple.c
> +++ b/gcc/ipa-icf-gimple.c
> @@ -153,8 +153,21 @@ func_checker::compare_decl (const_tree t1, const_tree t2)
>        && DECL_BY_REFERENCE (t1) != DECL_BY_REFERENCE (t2))
>      return return_false_with_msg ("DECL_BY_REFERENCE flags are different");
>  
> -  if (!compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
> -    return return_false ();
> +  /* We do not really need to check types of variables, since they are just
> +     blocks of memory and we verify types of the accesses to them.
> +     However do compare types of other kinds of decls
> +     (parm decls and result decl types may affect ABI convetions).  */
> +  if (t != VAR_DECL)
> +    {
> +      if (!compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
> +     return return_false ();
> +    }
> +  else
> +    {
> +      if (!operand_equal_p (DECL_SIZE (t1), DECL_SIZE (t2),
> +                         OEP_MATCH_SIDE_EFFECTS))
> +     return return_false_with_msg ("DECL_SIZEs are different");
> +    }
>  
>    bool existed_p;
>    const_tree &slot = m_decl_map.get_or_insert (t1, &existed_p);
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imend

Reply via email to