[turbofan] Add --csa-verify flag that enables machine graph verification of code stubs.
The flag must be used only by CodeStubAssemblerGraphsCorrectness cctest for now and once all the verification issues are fixed the flag will be enabled in debug mode by default. BUG= Review-Url: https://codereview.chromium.org/2551933002 Cr-Commit-Position: refs/heads/master@{#41531}
This commit is contained in:
parent
f897e36c8c
commit
292b3548f6
@ -1762,10 +1762,15 @@ bool PipelineImpl::ScheduleAndSelectInstructions(Linkage* linkage,
|
|||||||
info(), data->graph(), data->schedule()));
|
info(), data->graph(), data->schedule()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FLAG_turbo_verify_machine_graph != nullptr &&
|
// TODO(ishell): Always enable graph verification of stubs in debug mode
|
||||||
(!strcmp(FLAG_turbo_verify_machine_graph, "*") ||
|
// once all the issues are fixed.
|
||||||
!strcmp(FLAG_turbo_verify_machine_graph,
|
bool verify_stub_graph =
|
||||||
data->info()->GetDebugName().get()))) {
|
DEBUG_BOOL && FLAG_csa_verify && data->info()->IsStub();
|
||||||
|
|
||||||
|
if (verify_stub_graph || (FLAG_turbo_verify_machine_graph != nullptr &&
|
||||||
|
(!strcmp(FLAG_turbo_verify_machine_graph, "*") ||
|
||||||
|
!strcmp(FLAG_turbo_verify_machine_graph,
|
||||||
|
data->info()->GetDebugName().get())))) {
|
||||||
Zone temp_zone(data->isolate()->allocator(), ZONE_NAME);
|
Zone temp_zone(data->isolate()->allocator(), ZONE_NAME);
|
||||||
MachineGraphVerifier::Run(data->graph(), data->schedule(), linkage,
|
MachineGraphVerifier::Run(data->graph(), data->schedule(), linkage,
|
||||||
&temp_zone);
|
&temp_zone);
|
||||||
|
@ -444,6 +444,7 @@ DEFINE_BOOL(turbo_asm_deoptimization, false,
|
|||||||
DEFINE_BOOL(turbo_verify, DEBUG_BOOL, "verify TurboFan graphs at each phase")
|
DEFINE_BOOL(turbo_verify, DEBUG_BOOL, "verify TurboFan graphs at each phase")
|
||||||
DEFINE_STRING(turbo_verify_machine_graph, nullptr,
|
DEFINE_STRING(turbo_verify_machine_graph, nullptr,
|
||||||
"verify TurboFan machine graph before instruction selection")
|
"verify TurboFan machine graph before instruction selection")
|
||||||
|
DEFINE_BOOL(csa_verify, false, "verify TurboFan machine graph of code stubs")
|
||||||
DEFINE_BOOL(turbo_stats, false, "print TurboFan statistics")
|
DEFINE_BOOL(turbo_stats, false, "print TurboFan statistics")
|
||||||
DEFINE_BOOL(turbo_stats_nvp, false,
|
DEFINE_BOOL(turbo_stats_nvp, false,
|
||||||
"print TurboFan statistics in machine-readable format")
|
"print TurboFan statistics in machine-readable format")
|
||||||
|
@ -1927,5 +1927,44 @@ TEST(BuildAppendJSArrayFastDoubleElementsObject) {
|
|||||||
isolate->heap()->undefined_value(), Smi::FromInt(6), 6, 4);
|
isolate->heap()->undefined_value(), Smi::FromInt(6), 6, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(CodeStubAssemblerGraphsCorrectness) {
|
||||||
|
// The test does not work with interpreter because bytecode handlers taken
|
||||||
|
// from the snapshot already refer to precompiled stubs from the snapshot
|
||||||
|
// and there is no way to trigger bytecode handlers recompilation.
|
||||||
|
if (i::FLAG_ignition || i::FLAG_turbo) return;
|
||||||
|
|
||||||
|
i::FLAG_csa_verify = true;
|
||||||
|
|
||||||
|
v8::Isolate::CreateParams create_params;
|
||||||
|
create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
|
||||||
|
v8::Isolate* isolate = v8::Isolate::New(create_params);
|
||||||
|
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
||||||
|
|
||||||
|
{
|
||||||
|
v8::Isolate::Scope isolate_scope(isolate);
|
||||||
|
LocalContext env(isolate);
|
||||||
|
v8::HandleScope scope(isolate);
|
||||||
|
|
||||||
|
{
|
||||||
|
// Enforce recompilation of the following stubs.
|
||||||
|
i::CodeStub::Major code_stub_keys[] = {
|
||||||
|
i::CodeStub::LoadIC, i::CodeStub::LoadICTrampoline,
|
||||||
|
i::CodeStub::LoadGlobalIC, i::CodeStub::LoadGlobalICTrampoline,
|
||||||
|
i::CodeStub::KeyedLoadICTF, i::CodeStub::KeyedLoadICTrampolineTF,
|
||||||
|
i::CodeStub::StoreIC, i::CodeStub::StoreICTrampoline,
|
||||||
|
i::CodeStub::KeyedStoreICTF, i::CodeStub::KeyedStoreICTrampolineTF,
|
||||||
|
};
|
||||||
|
i::Heap* heap = i_isolate->heap();
|
||||||
|
i::Handle<i::UnseededNumberDictionary> dict(heap->code_stubs());
|
||||||
|
for (size_t i = 0; i < arraysize(code_stub_keys); i++) {
|
||||||
|
dict = i::UnseededNumberDictionary::DeleteKey(dict, code_stub_keys[i]);
|
||||||
|
}
|
||||||
|
heap->SetRootCodeStubs(*dict);
|
||||||
|
}
|
||||||
|
// Generate some stubs here.
|
||||||
|
}
|
||||||
|
isolate->Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
} // namespace v8
|
} // namespace v8
|
||||||
|
Loading…
Reference in New Issue
Block a user