Coverage counters currently aren’t thread-safe but that’s easily fixed.
However, they significantly hurt performance when multithreading with large numbers of cores. For my parallel opt_merge pass doing multithreaded read-only access to RTLIL, on 20 cores I get 7.5x speedup over 1 core with (threadsafe) coverage enabled, 14.1x speedup with coverage disabled.
(With the current non-threadsafe data-racy counters, the speedup is even less than with the atomic counters, only 7x, which is a bit weird but suggests that the main cost is cache-line ownership ping-ponging between cores. The numbers might vary a lot depending on the hardware.)
Currently coverage is enabled by default on Linux and FreeBSD (and doesn’t work on other platforms). Personally I haven’t ever used its coverage data. Threading is enabled by default on most targets, and when we start using it for core passes like opt_merge most users should see significant benefits from turning off coverage. Should we disable coverage by default?