[wasm][debug] Make recompilation isolate-independent

Passing an isolate to {RecompileNativeModule} feels wrong, since
compilation and the generated code are totally isolate-independent. In
fact, the isolate is only used for updating counters.
Instead of passing the counters instead, this CL just refactors the code
to support a nullptr for the counters everywhere (some code paths
already supported that). The few recompilation would not make a
significant difference in the histograms anyway, and even have the risk
of skewing the data.

Drive-by 1: Rename {TierUp} to {StartTierUp} and update comments.
Drive-by 2: Remove non-actionable TODO.

R=thibaudm@chromium.org

Bug: v8:10359
Change-Id: Ic027f939bbc55398b90784922130fe1fe5573b0c
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2187638
Reviewed-by: Thibaud Michaud <thibaudm@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#67708}
This commit is contained in:
Clemens Backes 2020-05-10 16:21:25 +02:00 committed by Commit Bot
parent ace32e55ea
commit 149843723d
9 changed files with 35 additions and 26 deletions

View File

@ -6788,9 +6788,10 @@ wasm::WasmCompilationResult ExecuteTurbofanWasmCompilation(
&info, wasm_engine, mcgraph, call_descriptor, source_positions, &info, wasm_engine, mcgraph, call_descriptor, source_positions,
node_origins, func_body, env->module, func_index); node_origins, func_body, env->module, func_index);
// TODO(bradnelson): Improve histogram handling of size_t. if (counters) {
counters->wasm_compile_function_peak_memory_bytes()->AddSample( counters->wasm_compile_function_peak_memory_bytes()->AddSample(
static_cast<int>(mcgraph->graph()->zone()->allocation_size())); static_cast<int>(mcgraph->graph()->zone()->allocation_size()));
}
auto result = info.ReleaseWasmCompilationResult(); auto result = info.ReleaseWasmCompilationResult();
CHECK_NOT_NULL(result); // Compilation expected to succeed. CHECK_NOT_NULL(result); // Compilation expected to succeed.
DCHECK_EQ(wasm::ExecutionTier::kTurbofan, result->result_tier); DCHECK_EQ(wasm::ExecutionTier::kTurbofan, result->result_tier);

View File

@ -1383,7 +1383,7 @@ RUNTIME_FUNCTION(Runtime_WasmTierDownModule) {
DCHECK_EQ(1, args.length()); DCHECK_EQ(1, args.length());
CONVERT_ARG_HANDLE_CHECKED(WasmInstanceObject, instance, 0); CONVERT_ARG_HANDLE_CHECKED(WasmInstanceObject, instance, 0);
auto* native_module = instance->module_object().native_module(); auto* native_module = instance->module_object().native_module();
native_module->TierDown(isolate); native_module->TierDown();
CHECK(!native_module->compilation_state()->failed()); CHECK(!native_module->compilation_state()->failed());
return ReadOnlyRoots(isolate).undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
@ -1393,7 +1393,7 @@ RUNTIME_FUNCTION(Runtime_WasmTierUpModule) {
DCHECK_EQ(1, args.length()); DCHECK_EQ(1, args.length());
CONVERT_ARG_HANDLE_CHECKED(WasmInstanceObject, instance, 0); CONVERT_ARG_HANDLE_CHECKED(WasmInstanceObject, instance, 0);
auto* native_module = instance->module_object().native_module(); auto* native_module = instance->module_object().native_module();
native_module->TierUp(isolate); native_module->StartTierUp();
CHECK(!native_module->compilation_state()->failed()); CHECK(!native_module->compilation_state()->failed());
return ReadOnlyRoots(isolate).undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }

View File

@ -130,7 +130,7 @@ WasmCompilationResult WasmCompilationUnit::ExecuteCompilation(
counters, detected); counters, detected);
} }
if (result.succeeded()) { if (result.succeeded() && counters) {
counters->wasm_generated_code_size()->Increment( counters->wasm_generated_code_size()->Increment(
result.code_desc.instr_size); result.code_desc.instr_size);
counters->wasm_reloc_size()->Increment(result.code_desc.reloc_size); counters->wasm_reloc_size()->Increment(result.code_desc.reloc_size);
@ -163,12 +163,16 @@ WasmCompilationResult WasmCompilationUnit::ExecuteFunctionCompilation(
wasm::FunctionBody func_body{func->sig, func->code.offset(), code.begin(), wasm::FunctionBody func_body{func->sig, func->code.offset(), code.begin(),
code.end()}; code.end()};
auto size_histogram = SELECT_WASM_COUNTER(counters, env->module->origin, wasm, base::Optional<TimedHistogramScope> wasm_compile_function_time_scope;
function_size_bytes); if (counters) {
size_histogram->AddSample(static_cast<int>(func_body.end - func_body.start)); auto size_histogram = SELECT_WASM_COUNTER(counters, env->module->origin,
auto timed_histogram = SELECT_WASM_COUNTER(counters, env->module->origin, wasm, function_size_bytes);
wasm_compile, function_time); size_histogram->AddSample(
TimedHistogramScope wasm_compile_function_time_scope(timed_histogram); static_cast<int>(func_body.end - func_body.start));
auto timed_histogram = SELECT_WASM_COUNTER(counters, env->module->origin,
wasm_compile, function_time);
wasm_compile_function_time_scope.emplace(timed_histogram);
}
if (FLAG_trace_wasm_compiler) { if (FLAG_trace_wasm_compiler) {
PrintF("Compiling wasm function %d with %s\n", func_index_, PrintF("Compiling wasm function %d with %s\n", func_index_,

View File

@ -1466,7 +1466,7 @@ std::shared_ptr<NativeModule> CompileToNativeModule(
return native_module; return native_module;
} }
void RecompileNativeModule(Isolate* isolate, NativeModule* native_module, void RecompileNativeModule(NativeModule* native_module,
TieringState tiering_state) { TieringState tiering_state) {
// Install a callback to notify us once background recompilation finished. // Install a callback to notify us once background recompilation finished.
auto recompilation_finished_semaphore = std::make_shared<base::Semaphore>(0); auto recompilation_finished_semaphore = std::make_shared<base::Semaphore>(0);
@ -1484,8 +1484,9 @@ void RecompileNativeModule(Isolate* isolate, NativeModule* native_module,
// We only wait for tier down. Tier up can happen in the background. // We only wait for tier down. Tier up can happen in the background.
if (tiering_state == kTieredDown) { if (tiering_state == kTieredDown) {
// The main thread contributes to the compilation. // The main thread contributes to the compilation.
constexpr Counters* kNoCounters = nullptr;
while (ExecuteCompilationUnits( while (ExecuteCompilationUnits(
compilation_state->background_compile_token(), isolate->counters(), compilation_state->background_compile_token(), kNoCounters,
kMainThreadTaskId, kBaselineOnly)) { kMainThreadTaskId, kBaselineOnly)) {
// Continue executing compilation units. // Continue executing compilation units.
} }

View File

@ -44,7 +44,7 @@ std::shared_ptr<NativeModule> CompileToNativeModule(
std::shared_ptr<const WasmModule> module, const ModuleWireBytes& wire_bytes, std::shared_ptr<const WasmModule> module, const ModuleWireBytes& wire_bytes,
Handle<FixedArray>* export_wrappers_out); Handle<FixedArray>* export_wrappers_out);
void RecompileNativeModule(Isolate* isolate, NativeModule* native_module, void RecompileNativeModule(NativeModule* native_module,
TieringState new_tiering_state); TieringState new_tiering_state);
V8_EXPORT_PRIVATE V8_EXPORT_PRIVATE

View File

@ -1853,17 +1853,17 @@ bool NativeModule::IsTieredDown() {
return tiering_state_ == kTieredDown; return tiering_state_ == kTieredDown;
} }
void NativeModule::TierDown(Isolate* isolate) { void NativeModule::TierDown() {
// Do not tier down asm.js. // Do not tier down asm.js.
if (module()->origin != kWasmOrigin) return; if (module()->origin != kWasmOrigin) return;
// Set the module to tiered down state; return if it is already in that state. // Set the module to tiered down state; return if it is already in that state.
if (!SetTieredDown()) return; if (!SetTieredDown()) return;
RecompileNativeModule(isolate, this, kTieredDown); RecompileNativeModule(this, kTieredDown);
} }
void NativeModule::TierUp(Isolate* isolate) { void NativeModule::StartTierUp() {
// Do not tier up asm.js. // Do not tier up asm.js.
if (module()->origin != kWasmOrigin) return; if (module()->origin != kWasmOrigin) return;
@ -1873,7 +1873,7 @@ void NativeModule::TierUp(Isolate* isolate) {
tiering_state_ = kTieredUp; tiering_state_ = kTieredUp;
} }
RecompileNativeModule(isolate, this, kTieredUp); RecompileNativeModule(this, kTieredUp);
} }
void NativeModule::FreeCode(Vector<WasmCode* const> codes) { void NativeModule::FreeCode(Vector<WasmCode* const> codes) {

View File

@ -600,10 +600,13 @@ class V8_EXPORT_PRIVATE NativeModule final {
bool SetTieredDown(); bool SetTieredDown();
bool IsTieredDown(); bool IsTieredDown();
// Sets the flag, triggers recompilation of all methods to tier down or up, // Set the flag to keep this module tiered down, trigger recompilation of all
// waits for that to complete. // functions, and wait for recompilation to complete.
void TierDown(Isolate* isolate); void TierDown();
void TierUp(Isolate* isolate);
// Clear the flag to keep this module tiered down and trigger recompilation
// of all functions. Does not wait for completion of recompilation.
void StartTierUp();
// Free a set of functions of this module. Uncommits whole pages if possible. // Free a set of functions of this module. Uncommits whole pages if possible.
// The given vector must be ordered by the instruction start address, and all // The given vector must be ordered by the instruction start address, and all

View File

@ -626,7 +626,7 @@ void WasmEngine::TierDownAllModulesPerIsolate(Isolate* isolate) {
} }
} }
for (auto* native_module : native_modules) { for (auto* native_module : native_modules) {
native_module->TierDown(isolate); native_module->TierDown();
} }
} }
@ -640,7 +640,7 @@ void WasmEngine::TierUpAllModulesPerIsolate(Isolate* isolate) {
} }
} }
for (auto* native_module : native_modules) { for (auto* native_module : native_modules) {
native_module->TierUp(isolate); native_module->StartTierUp();
} }
} }

View File

@ -221,7 +221,7 @@ class TestingModuleBuilder {
void SetExecutable() { native_module_->SetExecutable(true); } void SetExecutable() { native_module_->SetExecutable(true); }
void TierDown() { void TierDown() {
native_module_->TierDown(isolate_); native_module_->TierDown();
execution_tier_ = ExecutionTier::kLiftoff; execution_tier_ = ExecutionTier::kLiftoff;
} }