Hi, after Martin's ipa-cp reorg, get_binfo_at_offset is finally used only for lookup of base at given offset (not to walk into fields that it used to do too even if it is not documented and old BINFO code in ipa-cp relied on it.) This also allows us to drop BINFOs that are not important for debug output nor for construction of the type inheritance graph. This reduce binfos in firefox by about 30%.
Bootstrapped/regtested x86_64-linux, will commit it shortly. Honza * tree.c (free_lang_data_in_type): If BINFO has no important information in it, set it to NULL. (get_binfo_at_offset): Do not walk fields, only bases. * ipa-utils.h (polymorphic_type_binfo_p): Be ready for BINFO_TYPE to be NULL. * ipa-polymorphic-call.c (record_known_type): Likewise. Index: tree.c =================================================================== --- tree.c (revision 217803) +++ tree.c (working copy) @@ -4976,7 +4976,14 @@ free_lang_data_in_type (tree type) TYPE_METHODS (type) = NULL_TREE; if (TYPE_BINFO (type)) - free_lang_data_in_binfo (TYPE_BINFO (type)); + { + free_lang_data_in_binfo (TYPE_BINFO (type)); + if ((!BINFO_VTABLE (TYPE_BINFO (type)) + || !flag_devirtualize) + && (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) + || debug_info_level != DINFO_LEVEL_NONE)) + TYPE_BINFO (type) = NULL; + } } else { @@ -11926,7 +11933,7 @@ get_binfo_at_offset (tree binfo, HOST_WI for (fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld)) { - if (TREE_CODE (fld) != FIELD_DECL) + if (TREE_CODE (fld) != FIELD_DECL || !DECL_ARTIFICIAL (fld)) continue; pos = int_bit_position (fld); @@ -11937,12 +11944,6 @@ get_binfo_at_offset (tree binfo, HOST_WI if (!fld || TREE_CODE (TREE_TYPE (fld)) != RECORD_TYPE) return NULL_TREE; - if (!DECL_ARTIFICIAL (fld)) - { - binfo = TYPE_BINFO (TREE_TYPE (fld)); - if (!binfo) - return NULL_TREE; - } /* Offset 0 indicates the primary base, whose vtable contents are represented in the binfo for the derived class. */ else if (offset != 0) @@ -11967,6 +11968,7 @@ get_binfo_at_offset (tree binfo, HOST_WI * BITS_PER_UNIT < pos /* Rule out types with no virtual methods or we can get confused here by zero sized bases. */ + && TYPE_BINFO (BINFO_TYPE (base_binfo)) && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (base_binfo))) && (!containing_binfo || (tree_to_shwi (BINFO_OFFSET (containing_binfo)) Index: ipa-utils.h =================================================================== --- ipa-utils.h (revision 217803) +++ ipa-utils.h (working copy) @@ -183,7 +183,8 @@ polymorphic_type_binfo_p (const_tree bin /* See if BINFO's type has an virtual table associtated with it. Check is defensive because of Java FE produces BINFOs without BINFO_TYPE set. */ - return BINFO_TYPE (binfo) && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo))); + return (BINFO_TYPE (binfo) && TYPE_BINFO (BINFO_TYPE (binfo)) + && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo)))); } #endif /* GCC_IPA_UTILS_H */ Index: ipa-polymorphic-call.c =================================================================== --- ipa-polymorphic-call.c (revision 217803) +++ ipa-polymorphic-call.c (working copy) @@ -1307,6 +1307,7 @@ record_known_type (struct type_change_in if (type && (offset || (TREE_CODE (type) != RECORD_TYPE + || !TYPE_BINFO (type) || !polymorphic_type_binfo_p (TYPE_BINFO (type))))) { ipa_polymorphic_call_context context;