https://gcc.gnu.org/bugzilla/show_bug.cgi?id=26854
--- Comment #135 from Richard Biener <rguenth at gcc dot gnu.org> --- bitmap stats seem to be confused by 1) bitmap_obstack_release not releasing overhead of bitmaps allocated from it, 2) the DF machinery using embedded bitmap heads which for this testcase seems to explode df_rd_alloc stats by not accounting releases properly(?) - 'out' is updated by bitmap_clear on it and copying over a local bitmap_head: struct df_rd_problem_data *problem_data; bitmap_head tmp; /* Note that TMP is _not_ a temporary bitmap if we end up replacing OUT with TMP. Therefore, allocate TMP in the RD bitmaps obstack. */ problem_data = (struct df_rd_problem_data *) df_rd->problem_data; bitmap_initialize (&tmp, &problem_data->rd_bitmaps); bitmap_and_compl (&tmp, in, kill); EXECUTE_IF_SET_IN_BITMAP (sparse_kill, 0, regno, bi) { bitmap_clear_range (&tmp, DF_DEFS_BEGIN (regno), DF_DEFS_COUNT (regno)); } bitmap_ior_into (&tmp, gen); changed = !bitmap_equal_p (&tmp, out); if (changed) { bitmap_clear (out); bb_info->out = tmp; } else bitmap_clear (&tmp); it looks like this "underflows" the counters. It would be good to have this abstracted into a bitmap_move () doing the proper accounting. Trying if that fixes the above issue somewhat.