Valgrind shows this fixes ~4 KB of leak per iteration (on x86_64) by plugging this leak allocated at reginfo.c:1327: gcc_obstack_init (&valid_mode_changes_obstack);
==57820== 16,256 bytes in 4 blocks are definitely lost in loss record 906 of 917 ==57820== at 0x4A0645D: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==57820== by 0x59A6747: xmalloc (xmalloc.c:147) ==57820== by 0x30958842DB: _obstack_begin (obstack.c:184) ==57820== by 0x51C1EC1: init_subregs_of_mode() (reginfo.c:1327) ==57820== by 0x50D2A38: init_costs() (ira-costs.c:2181) ==57820== by 0x50D74A8: ira_costs() (ira-costs.c:2211) ==57820== by 0x50D1326: ira_build() (ira-build.c:3459) ==57820== by 0x50C909C: (anonymous namespace)::pass_ira::execute(function*) (ira.c:5227) ==57820== by 0x51884F7: execute_one_pass(opt_pass*) (passes.c:2269) ==57820== by 0x5188B75: execute_pass_list_1(opt_pass*) (passes.c:2321) ==57820== by 0x5188B87: execute_pass_list_1(opt_pass*) (passes.c:2322) ==57820== by 0x5188BC8: execute_pass_list(function*, opt_pass*) (passes.c:2332) gcc/ChangeLog: PR jit/63854 * reginfo.c (finish_subregs_of_mode): Replace obstack_finish with obstack_free when cleaning up valid_mode_changes_obstack. --- gcc/reginfo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/reginfo.c b/gcc/reginfo.c index efe23cd..c2daf22 100644 --- a/gcc/reginfo.c +++ b/gcc/reginfo.c @@ -1343,7 +1343,7 @@ void finish_subregs_of_mode (void) { XDELETEVEC (valid_mode_changes); - obstack_finish (&valid_mode_changes_obstack); + obstack_free (&valid_mode_changes_obstack, NULL); } /* Free all data attached to the structure. This isn't a destructor because -- 1.8.5.3