[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:
ishell 2016-12-06 08:18:15 -08:00 committed by Commit bot
parent f897e36c8c
commit 292b3548f6
3 changed files with 49 additions and 4 deletions

View File

@ -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);

View File

@ -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")

View File

@ -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