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.

Reply via email to