https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92535
--- Comment #10 from Jan Hubicka <hubicka at gcc dot gnu.org> --- Here are main reason for miscompares: 1125 libxul.so.wpa.076i.icf: false returned: 'variables types are different' in equals at ../../gcc/ipa-icf.c:1697 1171 libxul.so.wpa.076i.icf: false returned: 'DECL_CXX_CONSTRUCTOR mismatch' in equals_wpa at ../../gcc/ipa-icf.c:562 2211 libxul.so.wpa.076i.icf: false returned: 'different decl attributes' in equals_wpa at ../../gcc/ipa-icf.c:662 3362 libxul.so.wpa.076i.icf: false returned: 'ctor polymorphic type mismatch' in equals_wpa at ../../gcc/ipa-icf.c:585 3627 libxul.so.wpa.076i.icf: false returned: 'GIMPLE LHS type mismatch' in compare_gimple_assign at ../../gcc/ipa-icf-gimple.c:695 5297 libxul.so.wpa.076i.icf: false returned: '' in compare_decl at ../../gcc/ipa-icf-gimple.c:157 5304 libxul.so.wpa.076i.icf: false returned: '' in compare_variable_decl at ../../gcc/ipa-icf-gimple.c:422 5304 libxul.so.wpa.076i.icf: false returned: '' in operand_equal_p at ../../gcc/ipa-icf-gimple.c:291 8588 libxul.so.wpa.076i.icf: false returned: 'parameter type is not compatible' in compatible_parm_types_p at ../../gcc/ipa-icf.c:512 10188 libxul.so.wpa.076i.icf: false returned: 'inline attributes are different' in compare_referenced_symbol_properties at ../../gcc/ipa-icf.c:350 16218 libxul.so.wpa.076i.icf: false returned: 'parameter types are not compatible' in equals_wpa at ../../gcc/ipa-icf.c:639 26076 libxul.so.wpa.076i.icf: false returned: 'references to virtual tables cannot be merged' in compare_referenced_symbol_properties at ../../gcc/ipa-icf.c:373 28813 libxul.so.wpa.076i.icf: false returned: 'decl_or_type flags are different' in equals_wpa at ../../gcc/ipa-icf.c:572 32478 libxul.so.wpa.076i.icf: false returned: 'different tree types' in compatible_types_p at ../../gcc/ipa-icf-gimple.c:206 60520 libxul.so.wpa.076i.icf: false returned: 'call function types are not compatible' in compare_gimple_call at ../../gcc/ipa-icf-gimple.c:635 106399 libxul.so.wpa.076i.icf: false returned: 'types are not compatible' in compatible_types_p at ../../gcc/ipa-icf-gimple.c:212 120240 libxul.so.wpa.076i.icf: false returned: 'result types are different' in equals_wpa at ../../gcc/ipa-icf.c:621 269745 libxul.so.wpa.076i.icf: false returned: 'compare_ao_refs failed (semantic difference)' in compare_operand at ../../gcc/ipa-icf-gimple.c:336 355772 libxul.so.wpa.076i.icf: false returned: '' in compare_gimple_call at ../../gcc/ipa-icf-gimple.c:607 456913 libxul.so.wpa.076i.icf: false returned: 'THIS pointer ODR type mismatch' in equals_wpa at ../../gcc/ipa-icf.c:677 460252 libxul.so.wpa.076i.icf: false returned: 'types are not same for ODR' in compatible_polymorphic_types_p at ../../gcc/ipa-icf-gimple.c:197 1391954 libxul.so.wpa.076i.icf: false returned: 'GIMPLE assignment operands are different' in compare_gimple_assign at ../../gcc/ipa-icf-gimple.c:699 1477890 libxul.so.wpa.076i.icf: false returned: 'operand_equal_p failed' in compare_operand at ../../gcc/ipa-icf-gimple.c:356 1840986 libxul.so.wpa.076i.icf: false returned: '' in equals_private at ../../gcc/ipa-icf.c:886 So compare_ao_refs is not really a top even though it can be improved. I suppose it is time to improve the hash. Common problem is OBJ_TYPE_REF(_7;(struct nsServerSocket)_1->2) (_1); OBJ_TYPE_REF(_7;(struct nsJSProtocolHandler)_1->2) (_1); this happens 350645 (24% of the operand_equal_p failures) so I guess one can start from there. here clearly we want to hash ODR name of the OTR type.