RegionDescPtr selectHotRegion(TransID transId, MCGenerator* mcg) { auto const profData = jit::profData(); assertx(profData); auto const& func = *profData->transRec(transId)->func(); FuncId funcId = func.getFuncId(); TransCFG cfg(funcId, profData, mcg->srcDB()); assertx(regionMode() != RegionMode::Method); RegionDescPtr region; HotTransContext ctx; ctx.cfg = &cfg; ctx.profData = profData; ctx.tid = transId; ctx.maxBCInstrs = RuntimeOption::EvalJitMaxRegionInstrs; switch (pgoRegionMode(func)) { case PGORegionMode::Hottrace: region = selectHotTrace(ctx); break; case PGORegionMode::Hotblock: region = selectHotBlock(transId, profData, cfg); break; case PGORegionMode::WholeCFG: case PGORegionMode::HotCFG: region = selectHotCFG(ctx); break; } assertx(region); if (Trace::moduleEnabled(HPHP::Trace::pgo, 5)) { std::string dotFileName = std::string("/tmp/trans-cfg-") + folly::to<std::string>(transId) + ".dot"; std::ofstream outFile(dotFileName); if (outFile.is_open()) { cfg.print(outFile, funcId, profData); outFile.close(); } FTRACE(5, "selectHotRegion: New Translation (file: {}) {}\n", dotFileName, region ? show(*region) : std::string("empty region")); } always_assert(region->instrSize() <= RuntimeOption::EvalJitMaxRegionInstrs); if (region->empty()) return nullptr; return region; }
RegionDescPtr selectHotRegion(TransID transId, MCGenerator* mcg) { assertx(RuntimeOption::EvalJitPGO); const ProfData* profData = mcg->tx().profData(); auto const& func = *(profData->transFunc(transId)); FuncId funcId = func.getFuncId(); TransCFG cfg(funcId, profData, mcg->tx().getSrcDB(), mcg->getJmpToTransIDMap()); TransIDSet selectedTIDs; assertx(regionMode() != RegionMode::Method); RegionDescPtr region; HotTransContext ctx; ctx.cfg = &cfg; ctx.profData = profData; ctx.tid = transId; ctx.maxBCInstrs = RuntimeOption::EvalJitMaxRegionInstrs; switch (pgoRegionMode(func)) { case PGORegionMode::Hottrace: region = selectHotTrace(ctx, selectedTIDs); break; case PGORegionMode::Hotblock: region = selectHotBlock(transId, profData, cfg); break; case PGORegionMode::WholeCFG: case PGORegionMode::HotCFG: region = selectHotCFG(ctx, selectedTIDs); break; } assertx(region); if (Trace::moduleEnabled(HPHP::Trace::pgo, 5)) { std::string dotFileName = std::string("/tmp/trans-cfg-") + folly::to<std::string>(transId) + ".dot"; cfg.print(dotFileName, funcId, profData, &selectedTIDs); FTRACE(5, "selectHotRegion: New Translation {} (file: {}) {}\n", mcg->tx().profData()->curTransID(), dotFileName, region ? show(*region) : std::string("empty region")); } always_assert(region->instrSize() <= RuntimeOption::EvalJitMaxRegionInstrs); return region; }
RegionDescPtr selectHotRegion(TransID transId, TranslatorX64* tx64) { assert(RuntimeOption::EvalJitPGO); const ProfData* profData = tx64->profData(); FuncId funcId = profData->transFuncId(transId); TransCFG cfg(funcId, profData, tx64->getSrcDB(), tx64->getJmpToTransIDMap()); TransIDSet selectedTIDs; RegionDescPtr region = nullptr; RegionMode mode = regionMode(); switch (mode) { case RegionMode::None: region = RegionDescPtr{nullptr}; break; case RegionMode::HotBlock: region = selectHotBlock(transId, profData, cfg); break; case RegionMode::HotTrace: region = selectHotTrace(transId, profData, cfg, selectedTIDs); break; case RegionMode::OneBC: case RegionMode::Method: case RegionMode::Tracelet: case RegionMode::Legacy: always_assert(0 && "unsupported region mode"); } if (Trace::moduleEnabled(HPHP::Trace::pgo, 5)) { std::string dotFileName = string("/tmp/trans-cfg-") + lexical_cast<std::string>(transId) + ".dot"; cfg.print(dotFileName, funcId, profData, &selectedTIDs); FTRACE(5, "selectHotRegion: New Translation {} (file: {}) {}\n", tx64->profData()->curTransID(), dotFileName, region ? show(*region) : std::string("empty region")); } return region; }
RegionDescPtr selectHotRegion(TransID transId, MCGenerator* mcg) { assert(RuntimeOption::EvalJitPGO); const ProfData* profData = mcg->tx().profData(); FuncId funcId = profData->transFuncId(transId); TransCFG cfg(funcId, profData, mcg->tx().getSrcDB(), mcg->getJmpToTransIDMap()); TransIDSet selectedTIDs; assert(regionMode() != RegionMode::Method); RegionDescPtr region; switch (pgoRegionMode()) { case PGORegionMode::Hottrace: region = selectHotTrace(transId, profData, cfg, selectedTIDs); break; case PGORegionMode::Hotblock: region = selectHotBlock(transId, profData, cfg); break; case PGORegionMode::WholeCFG: region = selectWholeCFG(transId, profData, cfg, selectedTIDs); break; } assert(region); if (Trace::moduleEnabled(HPHP::Trace::pgo, 5)) { std::string dotFileName = std::string("/tmp/trans-cfg-") + folly::to<std::string>(transId) + ".dot"; cfg.print(dotFileName, funcId, profData, &selectedTIDs); FTRACE(5, "selectHotRegion: New Translation {} (file: {}) {}\n", mcg->tx().profData()->curTransID(), dotFileName, region ? show(*region) : std::string("empty region")); } return region; }