@@ -121,6 +121,11 @@ static unsigned getLikelyClassesOrMethods(LikelyClassMethodRecord*
121
121
int32_t ilOffset,
122
122
bool types)
123
123
{
124
+ if (maxLikelyClasses == 0 )
125
+ {
126
+ return 0 ;
127
+ }
128
+
124
129
ICorJitInfo::PgoInstrumentationKind histogramKind =
125
130
types ? ICorJitInfo::PgoInstrumentationKind::HandleHistogramTypes
126
131
: ICorJitInfo::PgoInstrumentationKind::HandleHistogramMethods;
@@ -235,6 +240,12 @@ static unsigned getLikelyClassesOrMethods(LikelyClassMethodRecord*
235
240
}
236
241
}
237
242
243
+ if (knownHandles == 0 )
244
+ {
245
+ // We don't have known handles
246
+ return 0 ;
247
+ }
248
+
238
249
// sort by m_count (descending)
239
250
jitstd::sort (sortedEntries, sortedEntries + knownHandles,
240
251
[](const LikelyClassMethodHistogramEntry& h1,
@@ -244,12 +255,27 @@ static unsigned getLikelyClassesOrMethods(LikelyClassMethodRecord*
244
255
245
256
const UINT32 numberOfClasses = min (knownHandles, maxLikelyClasses);
246
257
258
+ UINT32 totalLikelihood = 0 ;
247
259
for (size_t hIdx = 0 ; hIdx < numberOfClasses; hIdx++)
248
260
{
249
261
LikelyClassMethodHistogramEntry const hc = sortedEntries[hIdx];
250
262
pLikelyEntries[hIdx].handle = hc.m_handle ;
251
263
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 );
252
277
}
278
+
253
279
return numberOfClasses;
254
280
}
255
281
}
0 commit comments