|
@@ -394,21 +394,10 @@ VM::InterpreterExecutionScope Interpreter::ast_interpreter_scope(Realm& realm)
|
|
|
return { *m_ast_interpreter };
|
|
|
}
|
|
|
|
|
|
-AK::Array<OwnPtr<PassManager>, static_cast<UnderlyingType<Interpreter::OptimizationLevel>>(Interpreter::OptimizationLevel::__Count)> Interpreter::s_optimization_pipelines {};
|
|
|
-
|
|
|
-Bytecode::PassManager& Interpreter::optimization_pipeline(Interpreter::OptimizationLevel level)
|
|
|
+Bytecode::PassManager& Interpreter::optimization_pipeline()
|
|
|
{
|
|
|
- auto underlying_level = to_underlying(level);
|
|
|
- VERIFY(underlying_level <= to_underlying(Interpreter::OptimizationLevel::__Count));
|
|
|
- auto& entry = s_optimization_pipelines[underlying_level];
|
|
|
-
|
|
|
- if (entry)
|
|
|
- return *entry;
|
|
|
-
|
|
|
- auto pm = make<PassManager>();
|
|
|
- if (level == OptimizationLevel::None) {
|
|
|
- // No optimization.
|
|
|
- } else if (level == OptimizationLevel::Optimize) {
|
|
|
+ static auto s_optimization_pipeline = [] {
|
|
|
+ auto pm = make<Bytecode::PassManager>();
|
|
|
pm->add<Passes::GenerateCFG>();
|
|
|
pm->add<Passes::UnifySameBlocks>();
|
|
|
pm->add<Passes::GenerateCFG>();
|
|
@@ -420,14 +409,9 @@ Bytecode::PassManager& Interpreter::optimization_pipeline(Interpreter::Optimizat
|
|
|
pm->add<Passes::GenerateCFG>();
|
|
|
pm->add<Passes::PlaceBlocks>();
|
|
|
pm->add<Passes::EliminateLoads>();
|
|
|
- } else {
|
|
|
- VERIFY_NOT_REACHED();
|
|
|
- }
|
|
|
-
|
|
|
- auto& passes = *pm;
|
|
|
- entry = move(pm);
|
|
|
-
|
|
|
- return passes;
|
|
|
+ return pm;
|
|
|
+ }();
|
|
|
+ return *s_optimization_pipeline;
|
|
|
}
|
|
|
|
|
|
size_t Interpreter::pc() const
|
|
@@ -448,12 +432,16 @@ ThrowCompletionOr<NonnullOwnPtr<Bytecode::Executable>> compile(VM& vm, ASTNode c
|
|
|
|
|
|
auto bytecode_executable = executable_result.release_value();
|
|
|
bytecode_executable->name = name;
|
|
|
- auto& passes = Bytecode::Interpreter::optimization_pipeline();
|
|
|
- passes.perform(*bytecode_executable);
|
|
|
- if constexpr (JS_BYTECODE_DEBUG) {
|
|
|
- dbgln("Optimisation passes took {}us", passes.elapsed());
|
|
|
- dbgln("Compiled Bytecode::Block for function '{}':", name);
|
|
|
+
|
|
|
+ if (s_optimizations_enabled) {
|
|
|
+ auto& passes = Bytecode::Interpreter::optimization_pipeline();
|
|
|
+ passes.perform(*bytecode_executable);
|
|
|
+ if constexpr (JS_BYTECODE_DEBUG) {
|
|
|
+ dbgln("Optimisation passes took {}us", passes.elapsed());
|
|
|
+ dbgln("Compiled Bytecode::Block for function '{}':", name);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
if (Bytecode::g_dump_bytecode)
|
|
|
bytecode_executable->dump();
|
|
|
|