}
// this block will inherit the same weight and relevant bbFlags as bSrc
+ //
void inheritWeight(BasicBlock* bSrc)
{
- this->bbWeight = bSrc->bbWeight;
-
- if (bSrc->hasProfileWeight())
- {
- this->bbFlags |= BBF_PROF_WEIGHT;
- }
- else
- {
- this->bbFlags &= ~BBF_PROF_WEIGHT;
- }
-
- if (this->bbWeight == 0)
- {
- this->bbFlags |= BBF_RUN_RARELY;
- }
- else
- {
- this->bbFlags &= ~BBF_RUN_RARELY;
- }
+ inheritWeightPercentage(bSrc, 100);
}
// Similar to inheritWeight(), but we're splitting a block (such as creating blocks for qmark removal).
- // So, specify a percentage (0 to 99; if it's 100, just use inheritWeight()) of the weight that we're
- // going to inherit. Since the number isn't exact, clear the BBF_PROF_WEIGHT flag.
+ // So, specify a percentage (0 to 100) of the weight the block should inherit.
+ //
void inheritWeightPercentage(BasicBlock* bSrc, unsigned percentage)
{
- assert(0 <= percentage && percentage < 100);
+ assert(0 <= percentage && percentage <= 100);
// Check for overflow
- if (bSrc->bbWeight * 100 <= bSrc->bbWeight)
+ if ((bSrc->bbWeight * 100) <= bSrc->bbWeight)
{
this->bbWeight = bSrc->bbWeight;
}
else
{
- this->bbWeight = bSrc->bbWeight * percentage / 100;
+ this->bbWeight = (bSrc->bbWeight * percentage) / 100;
}
- this->bbFlags &= ~BBF_PROF_WEIGHT;
+ if (bSrc->hasProfileWeight())
+ {
+ this->bbFlags |= BBF_PROF_WEIGHT;
+ }
+ else
+ {
+ this->bbFlags &= ~BBF_PROF_WEIGHT;
+ }
if (this->bbWeight == 0)
{
JITDUMP("****\n**** JIT Tier0 jit request switching to Tier1 because of loop\n****\n");
assert(opts.jitFlags->IsSet(JitFlags::JIT_FLAG_TIER0));
opts.jitFlags->Clear(JitFlags::JIT_FLAG_TIER0);
+ opts.jitFlags->Clear(JitFlags::JIT_FLAG_BBINSTR);
// Leave a note for jit diagnostics
compSwitchedToOptimized = true;
return false;
}
bool validWeights = fgHaveValidEdgeWeights;
- unsigned calledCount = max(fgCalledCount, BB_UNITY_WEIGHT) / BB_UNITY_WEIGHT;
- double weightDivisor = (double)(calledCount * BB_UNITY_WEIGHT);
+ double weightDivisor = (double)fgCalledCount;
const char* escapedString;
const char* regionString = "NONE";
if (fgHaveProfileData())
{
- fprintf(fgxFile, "\n calledCount=\"%d\"", calledCount);
+ fprintf(fgxFile, "\n calledCount=\"%d\"", fgCalledCount);
fprintf(fgxFile, "\n profileData=\"true\"");
}
if (compHndBBtabCount > 0)
{
fprintf(fgxFile, " " FMT_BB " -> " FMT_BB, bSource->bbNum, bTarget->bbNum);
+ const char* sep = "";
+
if (bSource->bbNum > bTarget->bbNum)
{
// Lexical backedge
- fprintf(fgxFile, " [color=green]\n");
+ fprintf(fgxFile, " [color=green");
+ sep = ", ";
}
else if ((bSource->bbNum + 1) == bTarget->bbNum)
{
// Lexical successor
- fprintf(fgxFile, " [color=blue, weight=20]\n");
+ fprintf(fgxFile, " [color=blue, weight=20");
+ sep = ", ";
}
else
{
- fprintf(fgxFile, ";\n");
+ fprintf(fgxFile, " [");
}
+
+ if (validWeights)
+ {
+ unsigned edgeWeight = (edge->edgeWeightMin() + edge->edgeWeightMax()) / 2;
+ fprintf(fgxFile, "%slabel=\"%7.2f\"", sep, (double)edgeWeight / weightDivisor);
+ }
+
+ fprintf(fgxFile, "];\n");
}
else
{