From 0bfab27b4601c633884e096fff06add64cf4bdf3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 4 Jan 2018 23:09:03 -0800 Subject: [PATCH] irjit: Calculate bloat statistics. At least based on IR for now. Can do something else later. memset() was causing a crash on the std::map. --- Core/MIPS/IR/IRJit.cpp | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/IR/IRJit.cpp b/Core/MIPS/IR/IRJit.cpp index 3c6b6a511d..87cd45a46a 100644 --- a/Core/MIPS/IR/IRJit.cpp +++ b/Core/MIPS/IR/IRJit.cpp @@ -234,9 +234,33 @@ JitBlockDebugInfo IRBlockCache::GetBlockDebugInfo(int blockNum) const { } void IRBlockCache::ComputeStats(BlockCacheStats &bcStats) const { - // TODO: Implement properly - memset(&bcStats, 0, sizeof(bcStats)); + double totalBloat = 0.0; + double maxBloat = 0.0; + double minBloat = 1000000000.0; + for (const auto &b : blocks_) { + double codeSize = (double)b.GetNumInstructions() * sizeof(IRInst); + if (codeSize == 0) + continue; + + u32 origAddr, mipsBytes; + b.GetRange(origAddr, mipsBytes); + double origSize = (double)mipsBytes; + double bloat = codeSize / origSize; + if (bloat < minBloat) { + minBloat = bloat; + bcStats.minBloatBlock = origAddr; + } + if (bloat > maxBloat) { + maxBloat = bloat; + bcStats.maxBloatBlock = origAddr; + } + totalBloat += bloat; + bcStats.bloatMap[bloat] = origAddr; + } bcStats.numBlocks = (int)blocks_.size(); + bcStats.minBloat = minBloat; + bcStats.maxBloat = maxBloat; + bcStats.avgBloat = totalBloat / (double)blocks_.size(); } int IRBlockCache::GetBlockNumberFromStartAddress(u32 em_address, bool realBlocksOnly) const {