in core/src/main/java/org/adoptopenjdk/jitwatch/report/suggestion/SuggestionWalker.java [473:546]
private void handleBranchTag(Map<String, String> attrs, int currentBytecode, IMetaMember caller)
{
String countStr = attrs.get(ATTR_BRANCH_COUNT);
String probStr = attrs.get(ATTR_BRANCH_PROB);
long count = 0;
double probability = 0.0;
if (countStr != null)
{
try
{
count = (long) ParseUtil.parseLocaleSafeDouble(countStr);
}
catch (NumberFormatException nfe)
{
logger.error("Couldn't parse branch tag attribute {}", countStr, nfe);
}
}
if (probStr != null)
{
if (BRANCH_TAKEN_NEVER.equalsIgnoreCase(probStr) || BRANCH_TAKEN_MIN.equalsIgnoreCase(probStr))
{
probability = 0;
}
else if (BRANCH_TAKEN_ALWAYS.equalsIgnoreCase(probStr) || BRANCH_TAKEN_MAX.equalsIgnoreCase(probStr))
{
probability = 1;
}
else
{
try
{
probability = ParseUtil.parseLocaleSafeDouble(probStr);
}
catch (NumberFormatException nfe)
{
logger.error("Unrecognised branch probability: {}", probStr, nfe);
}
}
}
double score = 0;
if (probability > 0.45 && probability < 0.55 && count >= MIN_BRANCH_INVOCATIONS)
{
score = scoreMap.get(REASON_UNCERTAIN_BRANCH);
score *= count;
}
if (score > 0)
{
StringBuilder reasonBuilder = new StringBuilder();
reasonBuilder.append("Method contains an unpredictable branch at bytecode ");
reasonBuilder.append(currentBytecode);
reasonBuilder.append(" that was observed ");
reasonBuilder.append(count);
reasonBuilder.append(" times and is taken with probability ");
reasonBuilder.append(probability);
reasonBuilder.append(
".\nIt may be possbile to modify the branch (for example by sorting a Collection before iterating) to make it more predictable.");
Report suggestion = new Report(caller, compilationIndex, currentBytecode, reasonBuilder.toString(), ReportType.BRANCH,
(int) Math.ceil(score));
if (!reportList.contains(suggestion))
{
reportList.add(suggestion);
}
}
}