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.