https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92535
--- Comment #14 from Jan Hubicka <hubicka at gcc dot gnu.org> --- I fixed some issues 1) merging of OBJ_TYPE_REF was broken 2) last version of my COMPONENT_REF patch clears incorrectly OEP_ADDRESS_OF 3) gimple clobbers mismatches for no good reason 4) volatile memory references can are never considered equal 5) alignment of memory accesses is not hashed and may cause late mismatch (common in vector code) With this I get 141 false returned: 'Declaration mismatch' in equals at ../../gcc/ipa-icf.c:1817 162 false returned: 'DECL_CXX_DESTRUCTOR mismatch' in equals_wpa at ../../gcc/ipa-icf.c:565 169 false returned: '' in compare_decl at ../../gcc/ipa-icf-gimple.c:162 246 false returned: 'final flag mismatch' in compare_referenced_symbol_properties at ../../gcc/ipa-icf.c:401 380 false returned: '' in compare_phi_node at ../../gcc/ipa-icf.c:1595 380 false returned: 'PHI node comparison returns false' in equals_private at ../../gcc/ipa-icf.c:916 513 false returned: 'different decl attributes' in equals_wpa at ../../gcc/ipa-icf.c:662 571 false returned: 'compare_ao_refs failed (dependence clique difference)' in compare_operand at ../../gcc/ipa-icf-gimple.c:368 811 false returned: 'GIMPLE call operands are different' in compare_gimple_call at ../../gcc/ipa-icf-gimple.c:676 912 false returned: 'different references' in compare_symbol_references at ../../gcc/ipa-icf.c:465 961 false returned: 'size mismatch' in equals_wpa at ../../gcc/ipa-icf.c:1666 1125 false returned: 'variables types are different' in equals at ../../gcc/ipa-icf.c:1712 1129 false returned: 'DECL_CXX_CONSTRUCTOR mismatch' in equals_wpa at ../../gcc/ipa-icf.c:562 1453 false returned: 'operand_equal_p failed' in compare_operand at ../../gcc/ipa-icf-gimple.c:376 2917 false returned: 'compare_ao_refs failed (semantic difference)' in compare_operand at ../../gcc/ipa-icf-gimple.c:356 3362 false returned: 'ctor polymorphic type mismatch' in equals_wpa at ../../gcc/ipa-icf.c:585 3527 false returned: '' in compare_decl at ../../gcc/ipa-icf-gimple.c:157 3535 false returned: '' in compare_variable_decl at ../../gcc/ipa-icf-gimple.c:442 3535 false returned: '' in operand_equal_p at ../../gcc/ipa-icf-gimple.c:307 3563 false returned: 'GIMPLE assignment operands are different' in compare_gimple_assign at ../../gcc/ipa-icf-gimple.c:719 4604 false returned: 'GIMPLE LHS type mismatch' in compare_gimple_assign at ../../gcc/ipa-icf-gimple.c:715 6577 false returned: 'parameter type is not compatible' in compatible_parm_types_p at ../../gcc/ipa-icf.c:512 8441 false returned: 'inline attributes are different' in compare_referenced_symbol_properties at ../../gcc/ipa-icf.c:350 11259 false returned: 'parameter types are not compatible' in equals_wpa at ../../gcc/ipa-icf.c:639 25276 false returned: 'different tree types' in compatible_types_p at ../../gcc/ipa-icf-gimple.c:206 26073 false returned: 'references to virtual tables cannot be merged' in compare_referenced_symbol_properties at ../../gcc/ipa-icf.c:373 26693 false returned: 'decl_or_type flags are different' in equals_wpa at ../../gcc/ipa-icf.c:572 61657 false returned: 'call function types are not compatible' in compare_gimple_call at ../../gcc/ipa-icf-gimple.c:655 70880 false returned: '' in equals_private at ../../gcc/ipa-icf.c:881 104034 false returned: 'types are not compatible' in compatible_types_p at ../../gcc/ipa-icf-gimple.c:212 113477 false returned: 'result types are different' in equals_wpa at ../../gcc/ipa-icf.c:621 410680 false returned: 'THIS pointer ODR type of cdtor mismatch' in equals_wpa at ../../gcc/ipa-icf.c:673 414222 false returned: 'types are not same for ODR' in compatible_polymorphic_types_p at ../../gcc/ipa-icf-gimple.c:197 and more code size savings VM SIZE FILE SIZE ++++++++++++++ GROWING ++++++++++++++ [ = ] 0 .strtab +439Ki +1.0% [ = ] 0 .symtab +73.4Ki +0.4% +0.0% +32 .data +32 +0.0% -------------- SHRINKING -------------- -2.9% -2.67Mi .text -2.67Mi -2.9% -6.3% -555Ki .eh_frame -555Ki -6.3% -7.8% -148Ki .eh_frame_hdr -148Ki -7.8% -0.4% -78.2Ki .rodata -78.2Ki -0.4% -0.5% -58.8Ki .rela.dyn -58.8Ki -0.5% -0.4% -15.0Ki .data.rel.ro.local -15.0Ki -0.4% -1.0% -10.4Ki .data.rel.ro -10.4Ki -1.0% -0.0% -64 .bss 0 [ = ] -0.4% -32 .gcc_except_table -32 -0.4% -+-+-+-+-+-+-+ MIXED +-+-+-+-+-+-+- +14% +40 [Unmapped] -1.40Ki -42.6% -2.3% -3.51Mi TOTAL -3.01Mi -1.4% ICF still take quite some memory: ipa lto gimple in : 5.82 ( 4%) 2.10 ( 15%) 8.05 ( 5%) 776M ( 12%) ipa lto gimple out : 1.52 ( 1%) 0.69 ( 5%) 2.23 ( 1%) 0 ( 0%) ipa icf : 11.64 ( 7%) 0.51 ( 4%) 12.23 ( 7%) 43M ( 1%) TOTAL : 163.47 13.69 177.49 6537M So about 100 reduction and ICF got faster. It also improved the chance that functions read in are actually merged. The times are not 100% comparable to my previous report since my earlier build was with profiledbootstrap while now I bootstrapped the normal way. There are still quite many nonsences. In particular 1) we could enable merging different polymorphic ODR types of this pointers. Late devitualization is not that important, but we would need to have way to notice such merges. This is discussed in thread https://gcc.gnu.org/pipermail/gcc-patches/2020-November/559573.html 2) result types, operand types and ODR types can be hashed in before the equals_wpa process start to avoid refining the partitions (that should get rid of good part of ipa-icf time that now seems to be dominated by equal_wpa and fibonaci heap) 3) we should be able to do something about call operand types compare - it is way too sensitive. 4) gimple LHS type test is overactive. I see it is needed for conversions but it is not needed otherwise. 5) we do bad job on hashing SSA_NAMES. In Firefox there seems to be quite few functions that differs only by permutation of parameters or permutation of parameters of callee which we do not see as a difference in hash functions