From 49d245b059e58f02a1e24564138c5eaa8a91041f Mon Sep 17 00:00:00 2001 From: Brian Sullivan Date: Wed, 22 Mar 2017 11:23:19 -0700 Subject: [PATCH] Improve the dumping of BasicBlock weights and edge counts in the JIT Weights are now printed to fit into a 6 character field in one of three forms: standard (ddd or ddd.dd), large (ddddd.) or very large (dddddk) Commit migrated from https://github.com/dotnet/coreclr/commit/3dd1518ca4e71e290e914becfa9ebcfd9a27042a --- src/coreclr/src/jit/flowgraph.cpp | 44 ++++++++++++++++++++++++++++----------- src/coreclr/src/jit/utils.cpp | 20 +++++++++++------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/coreclr/src/jit/flowgraph.cpp b/src/coreclr/src/jit/flowgraph.cpp index dbaff9a..b21c29e 100644 --- a/src/coreclr/src/jit/flowgraph.cpp +++ b/src/coreclr/src/jit/flowgraph.cpp @@ -12471,7 +12471,7 @@ void Compiler::fgPrintEdgeWeights() if (edge->flEdgeWeightMin < BB_MAX_WEIGHT) { - printf("(%s", refCntWtd2str(edge->flEdgeWeightMin)); + printf("(%u", edge->flEdgeWeightMin); } else { @@ -12481,7 +12481,7 @@ void Compiler::fgPrintEdgeWeights() { if (edge->flEdgeWeightMax < BB_MAX_WEIGHT) { - printf("..%s", refCntWtd2str(edge->flEdgeWeightMax)); + printf("..%u", edge->flEdgeWeightMax); } else { @@ -19522,8 +19522,28 @@ void Compiler::fgTableDispBasicBlock(BasicBlock* block, int ibcColWidth /* = 0 * } else { - printf("%6s", refCntWtd2str(block->getBBWeight(this))); + BasicBlock::weight_t weight = block->getBBWeight(this); + + if (weight > 99999) // Is it going to be more than 6 characters? + { + if (weight <= 99999 * BB_UNITY_WEIGHT) + { + // print weight in this format ddddd. + printf("%5u.", (weight + (BB_UNITY_WEIGHT / 2)) / BB_UNITY_WEIGHT); + } + else // print weight in terms of k (i.e. 156k ) + { + // print weight in this format dddddk + BasicBlock::weight_t weightK = weight / 1000; + printf("%5uk", (weightK + (BB_UNITY_WEIGHT / 2)) / BB_UNITY_WEIGHT); + } + } + else // print weight in this format ddd.dd + { + printf("%6s", refCntWtd2str(weight)); + } } + printf(" "); // // Display optional IBC weight column. @@ -19811,11 +19831,11 @@ void Compiler::fgDispBasicBlocks(BasicBlock* firstBlock, BasicBlock* lastBlock, // clang-format off printf("\n"); - printf("------%*s------------------------------------%*s-----------------------%*s----------------------------------------\n", + printf("------%*s-------------------------------------%*s-----------------------%*s----------------------------------------\n", padWidth, "------------", ibcColWidth, "------------", maxBlockNumWidth, "----"); - printf("BBnum %*sdescAddr ref try hnd %s weight %*s%s [IL range] [jump]%*s [EH region] [flags]\n", + printf("BBnum %*sdescAddr ref try hnd %s weight %*s%s [IL range] [jump]%*s [EH region] [flags]\n", padWidth, "", fgCheapPredsValid ? "cheap preds" : (fgComputePredsDone ? "preds " @@ -19825,7 +19845,7 @@ void Compiler::fgDispBasicBlocks(BasicBlock* firstBlock, BasicBlock* lastBlock, : ""), maxBlockNumWidth, "" ); - printf("------%*s------------------------------------%*s-----------------------%*s----------------------------------------\n", + printf("------%*s-------------------------------------%*s-----------------------%*s----------------------------------------\n", padWidth, "------------", ibcColWidth, "------------", maxBlockNumWidth, "----"); @@ -19849,16 +19869,16 @@ void Compiler::fgDispBasicBlocks(BasicBlock* firstBlock, BasicBlock* lastBlock, if (block == fgFirstColdBlock) { - printf("~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~~~" - "~~~~~~~~~~~~~~~\n", + printf("~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~~" + "~~~~~~~~~~~~~~~~\n", padWidth, "~~~~~~~~~~~~", ibcColWidth, "~~~~~~~~~~~~", maxBlockNumWidth, "~~~~"); } #if FEATURE_EH_FUNCLETS if (block == fgFirstFuncletBB) { - printf("++++++%*s++++++++++++++++++++++++++++++++++++%*s+++++++++++++++++++++++%*s+++++++++++++++++++++++++" - "+++++++++++++++ funclets follow\n", + printf("++++++%*s+++++++++++++++++++++++++++++++++++++%*s+++++++++++++++++++++++%*s++++++++++++++++++++++++" + "++++++++++++++++ funclets follow\n", padWidth, "++++++++++++", ibcColWidth, "++++++++++++", maxBlockNumWidth, "++++"); } #endif // FEATURE_EH_FUNCLETS @@ -19871,8 +19891,8 @@ void Compiler::fgDispBasicBlocks(BasicBlock* firstBlock, BasicBlock* lastBlock, } } - printf("------%*s------------------------------------%*s-----------------------%*s---------------------------------" - "-------\n", + printf("------%*s-------------------------------------%*s-----------------------%*s--------------------------------" + "--------\n", padWidth, "------------", ibcColWidth, "------------", maxBlockNumWidth, "----"); if (dumpTrees) diff --git a/src/coreclr/src/jit/utils.cpp b/src/coreclr/src/jit/utils.cpp index b110525..9fbe394 100644 --- a/src/coreclr/src/jit/utils.cpp +++ b/src/coreclr/src/jit/utils.cpp @@ -698,18 +698,24 @@ const char* refCntWtd2str(unsigned refCntWtd) nump = (nump == num1) ? num2 : num1; - unsigned valueInt = refCntWtd / BB_UNITY_WEIGHT; - unsigned valueFrac = refCntWtd % BB_UNITY_WEIGHT; - - if (valueFrac == 0) + if (refCntWtd == BB_MAX_WEIGHT) { - sprintf_s(temp, bufSize, "%2u ", valueInt); + sprintf_s(temp, bufSize, "MAX "); } else { - sprintf_s(temp, bufSize, "%2u.%1u", valueInt, (valueFrac * 10 / BB_UNITY_WEIGHT)); - } + unsigned valueInt = refCntWtd / BB_UNITY_WEIGHT; + unsigned valueFrac = refCntWtd % BB_UNITY_WEIGHT; + if (valueFrac == 0) + { + sprintf_s(temp, bufSize, "%u ", valueInt); + } + else + { + sprintf_s(temp, bufSize, "%u.%02u", valueInt, (valueFrac * 100 / BB_UNITY_WEIGHT)); + } + } return temp; } -- 2.7.4