http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45375
--- Comment #89 from Jan Hubicka <hubicka at gcc dot gnu.org> 2011-05-02
10:13:00 UTC ---
This is callgrind profile for our hashtables that are consuming most of time at
WPA stage. It is from javascript library, but probably close enough for
libxul:
9,413,074 < ipa.c:cgraph_node_set_add (47698x)
237,777,114 < lto-streamer-in.c:lto_input_location (253470x)
162,391 < cgraph.c:cgraph_same_body_alias_1 (1125x)
3,481,459 < lto/lto.c:lto_create_files_from_ids (18272x)
1,262,433,061 < lto-streamer.c:lto_streamer_cache_insert_1 (9456405x)
1,721,939 < cgraph.c:cgraph_remove_node (13507x)
32,443,118 < cgraph.c:cgraph_get_node (254257x)
15,700,040 < lto/lto.c:remember_with_vars (88495x)
100,462,329 < lto-streamer.c:lto_streamer_cache_lookup (959530x)
59,948,506 < lto/lto-object.c:lto_obj_add_section (38584x)
551,876,527 < gimple.c:gimple_register_type'2 (9863x)
15,332,148 < lto-symtab.c:lto_symtab_get (148180x)
123,454,996 < ipa.c:varpool_node_set_find (1090522x)
497,594,354 < gimple.c:gimple_register_canonical_type (174920x)
7,723,287 < lto-section-out.c:lto_output_decl_index (48869x)
1,363,423 < lto-section-in.c:lto_get_function_in_decl_state (13102x)
60,607,732 < ipa.c:cgraph_node_set_find (526286x)
3,220,597 < varpool.c:varpool_node (19821x)
3,316,861 < lto-symtab.c:lto_symtab_register_decl (23462x)
523,758,152 < lto-streamer-out.c:lto_output_string_with_length (793000x)
30,909,893 < lto/lto.c:create_subid_section_table (19190x)
4,593,607 < cgraph.c:cgraph_create_node (22343x)
223,259 < cgraph.c:cgraph_clone_node (1353x)
20,940,173 < lto-section-in.c:lto_record_renamed_decl (14960x)
2,983,016,896 < gimple.c:gimple_register_type (149596x)
3,876,333 < cgraph.c:cgraph_get_node_or_alias (27793x)
123,200 < varpool.c:varpool_remove_node (973x)
46,083,990 < tree.c:build_int_cst_wide (247788x)
4,703,171 < ipa.c:cgraph_node_set_remove (40839x)
261,240,516 * libiberty/hashtab.c:htab_find_slo
So it seems that in addition to type merging we have quite few other problems.
varpool_node_set_find seems just stupid, for example.