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")); } always_assert(region->instrSize() <= RuntimeOption::EvalJitMaxRegionInstrs); return region; }
RegionDescPtr selectRegion(const RegionContext& context, const JIT::Tracelet* t) { auto const mode = regionMode(); FTRACE(1, "Select region: mode={} context:\n{}", static_cast<int>(mode), show(context) ); auto region = [&]{ try { switch (mode) { case RegionMode::None: return RegionDescPtr{nullptr}; case RegionMode::OneBC: return selectOneBC(context); case RegionMode::Method: return selectMethod(context); case RegionMode::Tracelet: return selectTracelet(context, 0); case RegionMode::Legacy: always_assert(t); return selectTraceletLegacy(context.spOffset, *t); case RegionMode::HotBlock: case RegionMode::HotTrace: always_assert(0 && "unsupported region mode"); } not_reached(); } catch (const std::exception& e) { FTRACE(1, "region selector threw: {}\n", e.what()); return RegionDescPtr{nullptr}; } }(); if (region) { FTRACE(3, "{}", show(*region)); } else { FTRACE(1, "no region selectable; using tracelet compiler\n"); } return region; }
RegionDescPtr selectRegion(const RegionContext& context, TransKind kind) { auto const mode = regionMode(); FTRACE(1, "Select region: mode={} context:\n{}", static_cast<int>(mode), show(context) ); auto region = [&]{ try { switch (mode) { case RegionMode::None: return RegionDescPtr{nullptr}; case RegionMode::Method: return selectMethod(context); case RegionMode::Tracelet: return selectTracelet( context, kind, RuntimeOption::EvalJitMaxRegionInstrs ); } not_reached(); } catch (const std::exception& e) { FTRACE(1, "region selector threw: {}\n", e.what()); return RegionDescPtr{nullptr}; } }(); if (region) { FTRACE(3, "{}", show(*region)); always_assert(region->instrSize() <= RuntimeOption::EvalJitMaxRegionInstrs); } else { FTRACE(1, "no region selectable; using tracelet compiler\n"); } return region; }