Files
clang-p2996/compiler-rt/test/profile/gcov-complex-line.c
Xinhao Yuan 97260ab478 [llvm-cov][gcov] Optimize the cycle counting algorithm by skipping zero count cycles
This change is similar to http://gcc.gnu.org/PR90380

This reduces the complexity from exponential to polynomial of the arcs.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D93036
2020-12-10 15:22:29 -08:00

56 lines
1.2 KiB
C

// This test checks that the cycle detection algorithm in llvm-cov is able to
// handle complex block graphs by skipping zero count cycles.
//
// RUN: mkdir -p %t.dir && cd %t.dir
// RUN: %clang --coverage %s -o %t
// RUN: rm -f gcov-complex-line.gcda && %run %t
// RUN: llvm-cov gcov -t gcov-complex-line.c | FileCheck %s
#define M_0 \
do { \
if (x == 0) \
x = 0; \
else \
x = 1; \
} while (0)
#define M_1 \
do { \
M_0; \
M_0; \
M_0; \
M_0; \
} while (0)
#define M_2 \
do { \
M_1; \
M_1; \
M_1; \
M_1; \
} while (0)
#define M_3 \
do { \
M_2; \
M_2; \
M_2; \
M_2; \
} while (0)
#define M_4 \
do { \
M_3; \
M_3; \
M_3; \
M_3; \
} while (0)
#define COMPLEX_LINE \
do { \
for (int i = 0; i < 100; ++i) \
M_4; \
} while (0)
int main() {
volatile int x = 0;
// In the following line, the number of cycles in the block graph is at least
// 2^256, where 256 is the number of expansions of M_0.
COMPLEX_LINE; // CHECK: 101: [[#@LINE]]: COMPLEX_LINE;
}