aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2020-11-20 20:33:04 +0100
committerJan Hubicka <jh@suse.cz>2020-11-20 20:33:04 +0100
commit4c3b16f3c11088f4c3a25ddd59ee5bc38c15f379 (patch)
tree3289563d012bcaaaa6440a2b2a33a2768a02f6db /gcc
parent65854626304d50cf348af53de1c29ccec06d33c6 (diff)
downloadgcc-4c3b16f3c11088f4c3a25ddd59ee5bc38c15f379.zip
gcc-4c3b16f3c11088f4c3a25ddd59ee5bc38c15f379.tar.gz
gcc-4c3b16f3c11088f4c3a25ddd59ee5bc38c15f379.tar.bz2
Only compare sizes of automatic variables
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. * ipa-icf-gimple.c (func_checker::compare_decl): Do not compare types of local variables.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ipa-icf-gimple.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index 250f023..be5a23d 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);