Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}