http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45375
--- Comment #97 from Jan Hubicka <hubicka at gcc dot gnu.org> 2011-06-02 13:28:28 UTC --- Today I noticed by an accident that the following hack: Index: lto-streamer-out.c =================================================================== --- lto-streamer-out.c (revision 174547) +++ lto-streamer-out.c (working copy) @@ -1135,15 +1288,15 @@ lto_output_tree_or_ref (ob, BINFO_OFFSET (expr), ref_p); lto_output_tree_or_ref (ob, BINFO_VTABLE (expr), ref_p); - lto_output_tree_or_ref (ob, BINFO_VIRTUALS (expr), ref_p); + /*lto_output_tree_or_ref (ob, BINFO_VIRTUALS (expr), ref_p);*/ lto_output_tree_or_ref (ob, BINFO_VPTR_FIELD (expr), ref_p); output_uleb128 (ob, VEC_length (tree, BINFO_BASE_ACCESSES (expr))); FOR_EACH_VEC_ELT (tree, BINFO_BASE_ACCESSES (expr), i, t) lto_output_tree_or_ref (ob, t, ref_p); - lto_output_tree_or_ref (ob, BINFO_INHERITANCE_CHAIN (expr), ref_p); - lto_output_tree_or_ref (ob, BINFO_SUBVTT_INDEX (expr), ref_p); + /* Backend do not care about BINFO_INHERITANCE_CHAIN and BINFO_SUBVTT_INDEX. + */ lto_output_tree_or_ref (ob, BINFO_VPTR_INDEX (expr), ref_p); } @@ -2014,7 +2167,7 @@ lto_output_tree_ref (ob, t); /* Output the head of the arguments list. */ - lto_output_tree_ref (ob, DECL_ARGUMENTS (function)); + lto_output_chain (ob, DECL_ARGUMENTS (function), true); /* Output all the SSA names used in the function. */ output_ssa_names (ob, fn); Index: lto-streamer-in.c =================================================================== --- lto-streamer-in.c (revision 174547) +++ lto-streamer-in.c (working copy) @@ -2308,7 +2438,7 @@ while (t); BINFO_OFFSET (expr) = lto_input_tree (ib, data_in); - BINFO_VTABLE (expr) = lto_input_tree (ib, data_in); + /*BINFO_VTABLE (expr) = lto_input_tree (ib, data_in);*/ BINFO_VIRTUALS (expr) = lto_input_tree (ib, data_in); BINFO_VPTR_FIELD (expr) = lto_input_tree (ib, data_in); @@ -2323,8 +2453,6 @@ } } - BINFO_INHERITANCE_CHAIN (expr) = lto_input_tree (ib, data_in); - BINFO_SUBVTT_INDEX (expr) = lto_input_tree (ib, data_in); BINFO_VPTR_INDEX (expr) = lto_input_tree (ib, data_in); } Reduces memory usage from 4.4GB to 2.7GB, so almost halves it and proportionally improves compilation speed. The effect is disabling type based devirtualization. The difference is amount of IL sreamed. W/o hack > [WPA] Compression: 430817772 input bytes, 2004640654 uncompressed bytes > (ratio: 4.653106) > [WPA] Size of mmap'd section decls: 267817970 bytes > [WPA] Size of mmap'd section function_body: 144808174 bytes > ipa lto decl in : 74.90 (30%) usr 2.38 (19%) sys 77.51 (29%) wall > 722892 kB (44%) ggc (ggc memory info wraps around 4GB limit, have patch for that) With hack: > [WPA] Compression: 308616744 input bytes, 1236371760 uncompressed bytes > (ratio: 4.006172) > [WPA] Size of mmap'd section decls: 147396203 bytes > [WPA] Size of mmap'd section function_body: 144662716 bytes > ipa lto decl in : 38.85 (23%) usr 1.18 (12%) sys 40.12 (23%) wall > 2674626 kB (75%) ggc The node stats with the patch are as follows: identifier_node 505095 tree_list 1809449 integer_type 175310 pointer_type 1198885 reference_type 65356 array_type 96153 record_type 729335 union_type 14171 function_type 120632 method_type 504881 integer_cst 587216 string_cst 204367 function_decl 909919 label_decl 261908 field_decl 1278114 var_decl 87787 const_decl 327835 parm_decl 1653719 type_decl 771617 result_decl 559971 debug_expr_decl 147434 constructor 162322 nop_expr 531950 addr_expr 920865 tree_binfo 1013612 (to be compared with my previous stats) Heap vector stats: ipa-prop.c:2053 (ipa_node_duplication_hook) 540408: 0.8% 1046048 21339: 0.2% ipa-inline-analysis.c:2008 (inline_merge_summary 1697908: 2.5% 3086804 99582: 1.1% ipa-reference.c:185 (set_reference_optimization_ 6122784: 9.0% 10353528 10: 0.0% lto-cgraph.c:113 (lto_cgraph_encoder_encode) 6485840: 9.5% 10924352 22118: 0.2% ipa-ref.c:59 (ipa_record_reference) 16005792:23.5% 20789048 534854: 6.0% ipa-inline-analysis.c:647 (inline_summary_alloc) 17904344:26.3% 35257432 11486: 0.1% passes.c:1893 (execute_one_pass) 18076256:26.5% 20971480 474948: 5.3% Total 68129708 8892582 GGC stats: ipa-inline-analysis.c:841 (inline_node_duplicati 0: 0.0% 42428: 0.0% 37876224: 2.3% 2058852: 0.6% 232982 gimple.c:4177 (iterative_hash_gimple_type) 43510016: 2.8% 0: 0.0% 0: 0.0% 0: 0.0% 2719376 lto-symtab.c:156 (lto_symtab_register_decl) 50215704: 3.3% 0: 0.0% 0: 0.0% 0: 0.0% 896709 lto-section-in.c:471 (lto_new_in_decl_state) 165360: 0.0% 0: 0.0% 51424080: 3.2% 0: 0.0% 429912 cgraph.c:1008 (cgraph_create_edge_1) 0: 0.0% 0: 0.0% 77585352: 4.8% 0: 0.0% 746013 lto-streamer-in.c:2477 (lto_input_ts_constructor 34780240: 2.3% 67555760: 8.4% 45650928: 2.8% 33677352:10.4% 271362 ipa-inline-analysis.c:643 (inline_summary_alloc) 0: 0.0% 0: 0.0% 85235448: 5.3% 18126584: 5.6% 1 ipa-ref.c:54 (ipa_record_reference) 0: 0.0% 171658064:21.4% 85633072: 5.3% 68326696:21.0% 554106 lto-streamer-in.c:1934 (lto_materialize_tree) 90241344: 5.9% 0: 0.0% 11233544: 0.7% 5872: 0.0% 1013612 lto/lto.c:217 (lto_read_in_decl_state) 333288: 0.0% 0: 0.0% 130600080: 8.1% 24601136: 7.6% 3009384 toplev.c:1027 (realloc_for_line_map) 0: 0.0% 167815168:20.9% 167778304:10.4% 67182592:20.7% 14 tree.c:1223 (build_int_cst_wide) 200129008:13.0% 0: 0.0% 2046496: 0.1% 66567480:20.5% 40217 cgraph.c:457 (cgraph_allocate_node) 0: 0.0% 0: 0.0% 226542712:14.0% 0: 0.0% 765347 lto-streamer-in.c:1939 (lto_materialize_tree) 1077917488:70.1% 0: 0.0% 540532272:33.4% 28671712: 8.8% 12277142 Total 1537795379 803354140 1619917572 325016043 27622283 source location Garbage Freed Leak Overhead Times Honza