Thanks, On 2019/11/26 18:15, Jan Hubicka wrote: >> Hi, >> >> On 2019/11/26 16:04, Jan Hubicka wrote: >>>> Summary variables should be deleted at the end of write_summary. >>>> It's first newed in generate_summary, and second newed in read_summary. >>>> Therefore, delete the first in write_summary, delete the second in >>>> execute. >>>> >>>> gcc/ChangeLog: >>>> >>>> 2019-11-26 Luo Xiong Hu <luo...@linux.ibm.com> >>>> >>>> * ipa-pure-const.c (pure_const_write_summary): Fix memory leak. >>>> * ipa-sra.c (ipa_sra_write_summary): Likewise. >>> >>> This is not going to work with -ffat-lto-objects because in this case >>> IPA pass is executed later. So you will need >>> if (!flag_fat_lto_objects). >>> >>> I think most IPA passes just waits for compiler to exit with LTO rather >>> than free the summary. ipa-fnsummary and ipa-prop allocate optimization >>> summaries, too. Are those freed? >> >> ipa-prop is a bit different, the ipcp_transformation_sum is only created in >> read_summary, so need only delete once after execute. > > It also has ipa_node_params_sum and ipa_edge_args_sum which live from > ipa-prop analysis until after ipa-inlining. >> >> ipa-fnsummary also forgot to free the ipa summaries at the end of >> write_summary. The pass pass_ipa_free_fn_summary will delete all summaries >> in execute. >> >> For -ffat-lto-objects, I suppose there would be no write_summary and >> read_summary? so summaries are also newed once and delete once? Thanks. >> >> Anyway, lto1 will run after cc1, which means cc1 is finished, the memory is >> freed theoretically. > > With -ffat-lto-object we run full optimization pipieline at compile > time. This means that we first write summary, then execute the pass > (which uses the summary and frees it) and proceed by compilation. > With -fno-fat-lto-object the pipieline is terminated after summary > writting. By quiting compiler we free all the memory. > > We do have a lot of places where memory leaks this way and is freed at > exit. I see that for jit we added sume explicit free calls, but I think > jit is not using this path. > > I am not against freeing things explicitly since it makes it easier to > identify real leaks, but we should do it systematically. Thinking of > this case probably may even lead to some memory savings because after > summary streaming the global stream is produced which is typically the > biggest object streamed. So freeing it is OK, but please add check for > !fat lto objects and also free ipa-fnsummary (there is > ipa_free_fn_summary, ipa_free_size_summary for that) and ipa-prop > summaries.
Verified that "if (!flag_fat_lto_objects)" is required for explicitly deleting the summaries when built with -ffat-lto-objects. > > I will also look into your changes for ipa-profile tomorrow (I suppose > you noticed this while looking into summaries for that patch :) It's true that I am moving the speculative target summaries from cgraph.h to ipa-profile.c, code is exploded with hundred of new lines. Simple test case could work now with write_summary/read_summary/execute, but most spec test cases ICEd due to ggc_grow() or ggc_collect(), I debugged the code and found that read_summary is correct streaming in the target summaries, but some edge's summary was GCed UNEXPECTEDLY by followed ggc_grow() or ggc_collect() before calling ipa_profile, any clue on this, please? Great that you take time on this!:) ipa-profile.c ... +/* Structure containing speculative target information from profile. */ + +struct GTY (()) speculative_call_target +{ + speculative_call_target (unsigned int id, int prob) + : target_id (id), target_probability (prob) + { + } + + /* Profile_id of target obtained from profile. */ + unsigned int target_id; + /* Probability that call will land in function with target_id. */ + int target_probability; +}; + +class speculative_call_summary +{ +public: + speculative_call_summary () : speculative_call_targets () {} + + vec<speculative_call_target, va_gc> *speculative_call_targets; + ~speculative_call_summary (); + + void dump (FILE *f); + + /* Check whether this is a empty summary. */ + bool is_empty (); +}; ... Xiong Hu > Honza >> >> Xiong Hu >> >> >>> >>> Honza >>>> --- >>>> gcc/ipa-pure-const.c | 3 +++ >>>> gcc/ipa-sra.c | 5 +++++ >>>> 2 files changed, 8 insertions(+) >>>> >>>> diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c >>>> index a142e0cc8f6..89f334cedac 100644 >>>> --- a/gcc/ipa-pure-const.c >>>> +++ b/gcc/ipa-pure-const.c >>>> @@ -1260,6 +1260,9 @@ pure_const_write_summary (void) >>>> } >>>> lto_destroy_simple_output_block (ob); >>>> + >>>> + delete funct_state_summaries; >>>> + funct_state_summaries = NULL; >>>> } >>>> diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c >>>> index c6ed0f44b87..bbc5e84edfb 100644 >>>> --- a/gcc/ipa-sra.c >>>> +++ b/gcc/ipa-sra.c >>>> @@ -2671,6 +2671,11 @@ ipa_sra_write_summary (void) >>>> streamer_write_char_stream (ob->main_stream, 0); >>>> produce_asm (ob, NULL); >>>> destroy_output_block (ob); >>>> + >>>> + ggc_delete (func_sums); >>>> + func_sums = NULL; >>>> + delete call_sums; >>>> + call_sums = NULL; >>>> } >>>> /* Read intraprocedural analysis information about E and all of its >>>> outgoing >>>> -- >>>> 2.21.0.777.g83232e3864 >>>> >>