Fix TOP N counter update.

	PR tree-optimization/92924
	* libgcov-profiler.c (__gcov_topn_values_profiler_body): First
	try to find an existing value, then find an empty slot
	if not found.
parent 9c4fb565
2020-01-22 Martin Liska <mliska@suse.cz> 2020-01-22 Martin Liska <mliska@suse.cz>
PR tree-optimization/92924 PR tree-optimization/92924
* libgcov-profiler.c (__gcov_topn_values_profiler_body): First
try to find an existing value, then find an empty slot
if not found.
2020-01-22 Martin Liska <mliska@suse.cz>
PR tree-optimization/92924
* libgcov-driver.c (prune_topn_counter): New. * libgcov-driver.c (prune_topn_counter): New.
(prune_counters): Likewise. (prune_counters): Likewise.
(dump_one_gcov): Prune a run-time counter. (dump_one_gcov): Prune a run-time counter.
......
...@@ -119,35 +119,37 @@ __gcov_topn_values_profiler_body (gcov_type *counters, gcov_type value, ...@@ -119,35 +119,37 @@ __gcov_topn_values_profiler_body (gcov_type *counters, gcov_type value,
++counters; ++counters;
/* First try to find an existing value. */
int empty_counter = -1;
for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
if (value == counters[2 * i])
{
if (use_atomic)
__atomic_fetch_add (&counters[2 * i + 1], GCOV_TOPN_VALUES,
__ATOMIC_RELAXED);
else
counters[2 * i + 1] += GCOV_TOPN_VALUES;
return;
}
else if (counters[2 * i + 1] <= 0)
empty_counter = i;
/* Find an empty slot for a new value. */
if (empty_counter != -1)
{ {
if (value == counters[2 * i]) counters[2 * empty_counter] = value;
{ counters[2 * empty_counter + 1] = GCOV_TOPN_VALUES;
if (use_atomic) return;
__atomic_fetch_add (&counters[2 * i + 1], GCOV_TOPN_VALUES,
__ATOMIC_RELAXED);
else
counters[2 * i + 1] += GCOV_TOPN_VALUES;
return;
}
else if (counters[2 * i + 1] <= 0)
{
/* We found an empty slot. */
counters[2 * i] = value;
counters[2 * i + 1] = GCOV_TOPN_VALUES;
return;
}
} }
/* We haven't found an empty slot, then decrement all /* We haven't found an empty slot, then decrement all
counter values by one. */ counter values by one. */
for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++) for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
{ if (use_atomic)
if (use_atomic) __atomic_fetch_sub (&counters[2 * i + 1], 1, __ATOMIC_RELAXED);
__atomic_fetch_sub (&counters[2 * i + 1], 1, __ATOMIC_RELAXED); else
else counters[2 * i + 1]--;
counters[2 * i + 1]--;
}
} }
#ifdef L_gcov_topn_values_profiler #ifdef L_gcov_topn_values_profiler
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment