Skip to content

Commit d45a905

Browse files
authored
Fix rounding error in getLikelyClassesOrMethods (#86965)
1 parent f5e0935 commit d45a905

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/coreclr/jit/likelyclass.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ static unsigned getLikelyClassesOrMethods(LikelyClassMethodRecord*
121121
int32_t ilOffset,
122122
bool types)
123123
{
124+
if (maxLikelyClasses == 0)
125+
{
126+
return 0;
127+
}
128+
124129
ICorJitInfo::PgoInstrumentationKind histogramKind =
125130
types ? ICorJitInfo::PgoInstrumentationKind::HandleHistogramTypes
126131
: ICorJitInfo::PgoInstrumentationKind::HandleHistogramMethods;
@@ -235,6 +240,12 @@ static unsigned getLikelyClassesOrMethods(LikelyClassMethodRecord*
235240
}
236241
}
237242

243+
if (knownHandles == 0)
244+
{
245+
// We don't have known handles
246+
return 0;
247+
}
248+
238249
// sort by m_count (descending)
239250
jitstd::sort(sortedEntries, sortedEntries + knownHandles,
240251
[](const LikelyClassMethodHistogramEntry& h1,
@@ -244,12 +255,27 @@ static unsigned getLikelyClassesOrMethods(LikelyClassMethodRecord*
244255

245256
const UINT32 numberOfClasses = min(knownHandles, maxLikelyClasses);
246257

258+
UINT32 totalLikelihood = 0;
247259
for (size_t hIdx = 0; hIdx < numberOfClasses; hIdx++)
248260
{
249261
LikelyClassMethodHistogramEntry const hc = sortedEntries[hIdx];
250262
pLikelyEntries[hIdx].handle = hc.m_handle;
251263
pLikelyEntries[hIdx].likelihood = hc.m_count * 100 / h.m_totalCount;
264+
totalLikelihood += pLikelyEntries[hIdx].likelihood;
265+
}
266+
267+
assert(totalLikelihood <= 100);
268+
269+
// Distribute the rounding error and just apply it to the first entry.
270+
// Assume that there is no error If we have unknown handles.
271+
if (numberOfClasses == h.m_totalCount)
272+
{
273+
assert(numberOfClasses > 0);
274+
assert(totalLikelihood > 0);
275+
pLikelyEntries[0].likelihood += 100 - totalLikelihood;
276+
assert(pLikelyEntries[0].likelihood <= 100);
252277
}
278+
253279
return numberOfClasses;
254280
}
255281
}

0 commit comments

Comments
 (0)