Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Unified Diff: src/compiler.cc

Issue 1906823002: Move of the type feedback vector to the closure. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler.cc
diff --git a/src/compiler.cc b/src/compiler.cc
index 8eb6ff577308015c0ec7ee0e7984d04d4e43ac81..a1139c83dc7f6ec4e735d81c628a5bd29b72e7c2 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -405,25 +405,25 @@ void RecordFunctionCompilation(Logger::LogEventsAndTags tag,
}
}
-void EnsureFeedbackVector(CompilationInfo* info) {
+void EnsureFeedbackMetadata(CompilationInfo* info) {
DCHECK(info->has_shared_info());
- // If no type feedback vector exists, we create one now. At this point the
+ // If no type feedback metadata exists, we create it now. At this point the
// AstNumbering pass has already run. Note the snapshot can contain outdated
// vectors for a different configuration, hence we also recreate a new vector
// when the function is not compiled (i.e. no code was serialized).
- if (info->shared_info()->feedback_vector()->is_empty() ||
+
+ // TODO(mvstanton): reintroduce is_empty() predicate to feedback_metadata().
+ if (info->shared_info()->feedback_metadata()->length() == 0 ||
!info->shared_info()->is_compiled()) {
Handle<TypeFeedbackMetadata> feedback_metadata = TypeFeedbackMetadata::New(
info->isolate(), info->literal()->feedback_vector_spec());
- Handle<TypeFeedbackVector> feedback_vector =
- TypeFeedbackVector::New(info->isolate(), feedback_metadata);
- info->shared_info()->set_feedback_vector(*feedback_vector);
+ info->shared_info()->set_feedback_metadata(*feedback_metadata);
}
// It's very important that recompiles do not alter the structure of the type
// feedback vector. Verify that the structure fits the function literal.
- CHECK(!info->shared_info()->feedback_vector()->metadata()->SpecDiffersFrom(
+ CHECK(!info->shared_info()->feedback_metadata()->SpecDiffersFrom(
info->literal()->feedback_vector_spec()));
}
@@ -463,7 +463,7 @@ int CodeAndMetadataSize(CompilationInfo* info) {
bool GenerateUnoptimizedCode(CompilationInfo* info) {
bool success;
- EnsureFeedbackVector(info);
+ EnsureFeedbackMetadata(info);
if (FLAG_ignition && UseIgnition(info)) {
success = interpreter::Interpreter::MakeBytecode(info);
} else {
@@ -516,7 +516,12 @@ MUST_USE_RESULT MaybeHandle<Code> GetUnoptimizedCode(CompilationInfo* info) {
// Parse and update CompilationInfo with the results.
if (!Parser::ParseStatic(info->parse_info())) return MaybeHandle<Code>();
Handle<SharedFunctionInfo> shared = info->shared_info();
- DCHECK_EQ(shared->language_mode(), info->literal()->language_mode());
+
+ // TODO(mvstanton): can I eliminate this? MStarzinger got rid of this
+ // boilerplate stuff before.
+ FunctionLiteral* lit = info->literal();
+ DCHECK_EQ(shared->language_mode(), lit->language_mode());
+ shared->set_num_literals(lit->materialized_literal_count());
Michael Starzinger 2016/05/10 13:47:20 Depending on who computes the literals count for a
mvstanton 2016/05/24 16:31:49 Happily, I could eliminate this piece completely (
// Compile either unoptimized code or bytecode for the interpreter.
if (!CompileUnoptimizedCode(info)) return MaybeHandle<Code>();
@@ -634,6 +639,9 @@ bool GetOptimizedCodeNow(CompilationJob* job) {
if (!Compiler::ParseAndAnalyze(info->parse_info())) return false;
}
+ EnsureFeedbackMetadata(info);
+ JSFunction::EnsureLiterals(info->closure());
+
TimerEventScope<TimerEventRecompileSynchronous> timer(isolate);
TRACE_EVENT0("v8", "V8.RecompileSynchronous");
@@ -678,6 +686,8 @@ bool GetOptimizedCodeLater(CompilationJob* job) {
if (!Compiler::ParseAndAnalyze(info->parse_info())) return false;
}
+ JSFunction::EnsureLiterals(info->closure());
+
// Reopen handles in the new CompilationHandleScope.
info->ReopenHandlesInNewHandleScope();
info->parse_info()->ReopenHandlesInNewHandleScope();
@@ -1123,6 +1133,7 @@ bool Compiler::Compile(Handle<JSFunction> function, ClearExceptionFlag flag) {
// Install code on closure.
function->ReplaceCode(*code);
+ JSFunction::EnsureLiterals(function);
// Check postconditions on success.
DCHECK(!isolate->has_pending_exception());
@@ -1179,6 +1190,7 @@ bool Compiler::CompileOptimized(Handle<JSFunction> function,
// Install code on closure.
function->ReplaceCode(*code);
+ JSFunction::EnsureLiterals(function);
// Check postconditions on success.
DCHECK(!isolate->has_pending_exception());
@@ -1285,7 +1297,7 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) {
shared->code()->has_reloc_info_for_serialization()) {
unoptimized.PrepareForSerializing();
}
- EnsureFeedbackVector(&unoptimized);
+ EnsureFeedbackMetadata(&unoptimized);
if (!FullCodeGenerator::MakeCode(&unoptimized)) return false;
// TODO(4280): For now we play it safe and remove the bytecode array when we
@@ -1660,7 +1672,7 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForNative(
name, literals, FunctionKind::kNormalFunction, code,
Handle<ScopeInfo>(fun->shared()->scope_info()));
shared->set_construct_stub(*construct_stub);
- shared->set_feedback_vector(fun->shared()->feedback_vector());
+ shared->set_feedback_metadata(fun->shared()->feedback_metadata());
// Copy the function data to the shared function info.
shared->set_function_data(fun->shared()->function_data());
@@ -1747,21 +1759,11 @@ void Compiler::PostInstantiation(Handle<JSFunction> function,
}
if (cached.literals != nullptr) {
+ DCHECK(shared->is_compiled());
function->set_literals(cached.literals);
- } else {
- Isolate* isolate = function->GetIsolate();
- int number_of_literals = shared->num_literals();
- Handle<LiteralsArray> literals =
- LiteralsArray::New(isolate, handle(shared->feedback_vector()),
- number_of_literals, pretenure);
- function->set_literals(*literals);
-
- // Cache context-specific literals.
- MaybeHandle<Code> code;
- if (cached.code != nullptr) code = handle(cached.code);
- Handle<Context> native_context(function->context()->native_context());
- SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code,
- literals, BailoutId::None());
+ } else if (shared->is_compiled()) {
+ // TODO(mvstanton): pass pretenure flag to EnsureLiterals.
+ JSFunction::EnsureLiterals(function);
}
}

Powered by Google App Engine
This is Rietveld 408576698