https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71046

            Bug ID: 71046
           Summary: gcov time hog
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: gcov-profile
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

struct A
{
  char a1, a2, a3, a4, a5, a6, a7, a8, a9;
  char b1, b2, b3, b4, b5, b6, b7, b8, b9;
  char c1, c2, c3, c4, c5;
};

struct A s;

int
main ()
{
  if (__builtin_expect (s.a1 < 0 || s.a1 > 200 || s.a2 < 0 || s.a2 > 200
                        || s.a3 < 0 || s.a3 > 200 || s.a4 < 0 || s.a4 > 200
                        || s.a5 < 0 || s.a5 > 200 || s.a6 < 0 || s.a6 > 200
                        || s.a7 < 0 || s.a7 > 200 || s.a8 < 0 || s.a8 > 200
                        || s.a9 < 0 || s.a9 > 200 || s.b1 < 0 || s.b1 > 200
                        || s.b2 < 0 || s.b2 > 200 || s.b3 < 0 || s.b3 > 200
                        || s.b4 < 0 || s.b4 > 200 || s.b5 < 0 || s.b5 > 200
                        || s.b6 < 0 || s.b6 > 200 || s.b7 < 0 || s.b7 > 200
                        || s.b8 < 0 || s.b8 > 200 || s.b9 < 0 || s.b9 > 200
                        || s.c1 < 0 || s.c1 > 200 || s.c2 < 0 || s.c2 > 200
                        || s.c3 < 0 || s.c3 > 200 || s.c4 < 0 || s.c4 > 200
                        || s.c5 < 0 || s.c5 > 200, 0))
    __builtin_printf ("hello\n");
  return 0;
}

(reduced from Linux kernel) with
gcc -O2 -fprofile-arcs -ftest-coverage test.c
./a.out
gcov -b -c -d -a test.gcda
gets stuck in accumulate_line_counts until killed.
There are no loops in the testcase, all bbs have at most 2 successors, one bb
has 23 predecessors, most others have just one.

The comment in accumulate_line_counts says:
          /* Find the loops. This uses the algorithm described in
             Tiernan 'An Efficient Search Algorithm to Find the
             Elementary Circuits of a Graph', CACM Dec 1970. We hold
             the P array by having each block point to the arc that
             connects to the previous block. The H array is implicitly
             held because of the arc ordering, and the block's
             previous arc pointer.

             Although the algorithm is O(N^3) for highly connected
             graphs, at worst we'll have O(N^2), as most blocks have
             only one or two exits. Most graphs will be small.

             For each loop we find, locate the arc with the smallest
             transition count, and add that to the cumulative
             count.  Decrease flow over the cycle and remove the arc
             from consideration.  */

Reply via email to