[turbofan] Brokerize JSContextSpecialization
Bug: v8:7790 Change-Id: Ief620bc24b59c2a4e0c823a7f7cebf5df114b9a6 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1787430 Commit-Queue: Maya Lekova <mslekova@chromium.org> Reviewed-by: Georg Neis <neis@chromium.org> Reviewed-by: Michael Stanton <mvstanton@chromium.org> Cr-Commit-Position: refs/heads/master@{#63714}
This commit is contained in:
parent
23d7e79829
commit
27df753f45
@ -38,7 +38,7 @@ Reduction JSContextSpecialization::ReduceParameter(Node* node) {
|
|||||||
// Constant-fold the function parameter {node}.
|
// Constant-fold the function parameter {node}.
|
||||||
Handle<JSFunction> function;
|
Handle<JSFunction> function;
|
||||||
if (closure().ToHandle(&function)) {
|
if (closure().ToHandle(&function)) {
|
||||||
Node* value = jsgraph()->HeapConstant(function);
|
Node* value = jsgraph()->Constant(JSFunctionRef(broker_, function));
|
||||||
return Replace(value);
|
return Replace(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,6 +107,23 @@ static constexpr char kRegisterAllocationZoneName[] =
|
|||||||
"register-allocation-zone";
|
"register-allocation-zone";
|
||||||
static constexpr char kRegisterAllocatorVerifierZoneName[] =
|
static constexpr char kRegisterAllocatorVerifierZoneName[] =
|
||||||
"register-allocator-verifier-zone";
|
"register-allocator-verifier-zone";
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
Maybe<OuterContext> GetModuleContext(Handle<JSFunction> closure) {
|
||||||
|
Context current = closure->context();
|
||||||
|
size_t distance = 0;
|
||||||
|
while (!current.IsNativeContext()) {
|
||||||
|
if (current.IsModuleContext()) {
|
||||||
|
return Just(
|
||||||
|
OuterContext(handle(current, current.GetIsolate()), distance));
|
||||||
|
}
|
||||||
|
current = current.previous();
|
||||||
|
distance++;
|
||||||
|
}
|
||||||
|
return Nothing<OuterContext>();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
class PipelineData {
|
class PipelineData {
|
||||||
public:
|
public:
|
||||||
@ -338,6 +355,20 @@ class PipelineData {
|
|||||||
return assembler_options_;
|
return assembler_options_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChooseSpecializationContext() {
|
||||||
|
if (info()->is_function_context_specializing()) {
|
||||||
|
DCHECK(info()->has_context());
|
||||||
|
specialization_context_ =
|
||||||
|
Just(OuterContext(handle(info()->context(), isolate()), 0));
|
||||||
|
} else {
|
||||||
|
specialization_context_ = GetModuleContext(info()->closure());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Maybe<OuterContext> specialization_context() const {
|
||||||
|
return specialization_context_;
|
||||||
|
}
|
||||||
|
|
||||||
size_t* address_of_max_unoptimized_frame_height() {
|
size_t* address_of_max_unoptimized_frame_height() {
|
||||||
return &max_unoptimized_frame_height_;
|
return &max_unoptimized_frame_height_;
|
||||||
}
|
}
|
||||||
@ -546,6 +577,7 @@ class PipelineData {
|
|||||||
|
|
||||||
JumpOptimizationInfo* jump_optimization_info_ = nullptr;
|
JumpOptimizationInfo* jump_optimization_info_ = nullptr;
|
||||||
AssemblerOptions assembler_options_;
|
AssemblerOptions assembler_options_;
|
||||||
|
Maybe<OuterContext> specialization_context_ = Nothing<OuterContext>();
|
||||||
|
|
||||||
// The maximal combined height of all inlined frames in their unoptimized
|
// The maximal combined height of all inlined frames in their unoptimized
|
||||||
// state. Calculated during instruction selection, applied during code
|
// state. Calculated during instruction selection, applied during code
|
||||||
@ -999,6 +1031,7 @@ PipelineCompilationJob::Status PipelineCompilationJob::PrepareJobImpl(
|
|||||||
if (compilation_info()->closure()->raw_feedback_cell().map() ==
|
if (compilation_info()->closure()->raw_feedback_cell().map() ==
|
||||||
ReadOnlyRoots(isolate).one_closure_cell_map()) {
|
ReadOnlyRoots(isolate).one_closure_cell_map()) {
|
||||||
compilation_info()->MarkAsFunctionContextSpecializing();
|
compilation_info()->MarkAsFunctionContextSpecializing();
|
||||||
|
data_.ChooseSpecializationContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compilation_info()->is_source_positions_enabled()) {
|
if (compilation_info()->is_source_positions_enabled()) {
|
||||||
@ -1032,6 +1065,7 @@ PipelineCompilationJob::Status PipelineCompilationJob::ExecuteJobImpl() {
|
|||||||
TRACE_DISABLED_BY_DEFAULT("v8.compile"), "v8.optimizingCompile.execute",
|
TRACE_DISABLED_BY_DEFAULT("v8.compile"), "v8.optimizingCompile.execute",
|
||||||
this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "function",
|
this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "function",
|
||||||
compilation_info()->shared_info()->TraceIDRef());
|
compilation_info()->shared_info()->TraceIDRef());
|
||||||
|
|
||||||
bool success;
|
bool success;
|
||||||
if (FLAG_turboprop) {
|
if (FLAG_turboprop) {
|
||||||
success = pipeline_.OptimizeGraphForMidTier(linkage_);
|
success = pipeline_.OptimizeGraphForMidTier(linkage_);
|
||||||
@ -1239,38 +1273,10 @@ struct GraphBuilderPhase {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
Maybe<OuterContext> GetModuleContext(Handle<JSFunction> closure) {
|
|
||||||
Context current = closure->context();
|
|
||||||
size_t distance = 0;
|
|
||||||
while (!current.IsNativeContext()) {
|
|
||||||
if (current.IsModuleContext()) {
|
|
||||||
return Just(
|
|
||||||
OuterContext(handle(current, current.GetIsolate()), distance));
|
|
||||||
}
|
|
||||||
current = current.previous();
|
|
||||||
distance++;
|
|
||||||
}
|
|
||||||
return Nothing<OuterContext>();
|
|
||||||
}
|
|
||||||
|
|
||||||
Maybe<OuterContext> ChooseSpecializationContext(
|
|
||||||
Isolate* isolate, OptimizedCompilationInfo* info) {
|
|
||||||
if (info->is_function_context_specializing()) {
|
|
||||||
DCHECK(info->has_context());
|
|
||||||
return Just(OuterContext(handle(info->context(), isolate), 0));
|
|
||||||
}
|
|
||||||
return GetModuleContext(info->closure());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // anonymous namespace
|
|
||||||
|
|
||||||
struct InliningPhase {
|
struct InliningPhase {
|
||||||
static const char* phase_name() { return "V8.TFInlining"; }
|
static const char* phase_name() { return "V8.TFInlining"; }
|
||||||
|
|
||||||
void Run(PipelineData* data, Zone* temp_zone) {
|
void Run(PipelineData* data, Zone* temp_zone) {
|
||||||
Isolate* isolate = data->isolate();
|
|
||||||
OptimizedCompilationInfo* info = data->info();
|
OptimizedCompilationInfo* info = data->info();
|
||||||
GraphReducer graph_reducer(temp_zone, data->graph(), &info->tick_counter(),
|
GraphReducer graph_reducer(temp_zone, data->graph(), &info->tick_counter(),
|
||||||
data->jsgraph()->Dead());
|
data->jsgraph()->Dead());
|
||||||
@ -1287,7 +1293,7 @@ struct InliningPhase {
|
|||||||
data->dependencies());
|
data->dependencies());
|
||||||
JSContextSpecialization context_specialization(
|
JSContextSpecialization context_specialization(
|
||||||
&graph_reducer, data->jsgraph(), data->broker(),
|
&graph_reducer, data->jsgraph(), data->broker(),
|
||||||
ChooseSpecializationContext(isolate, data->info()),
|
data->specialization_context(),
|
||||||
data->info()->is_function_context_specializing()
|
data->info()->is_function_context_specializing()
|
||||||
? data->info()->closure()
|
? data->info()->closure()
|
||||||
: MaybeHandle<JSFunction>());
|
: MaybeHandle<JSFunction>());
|
||||||
@ -1419,6 +1425,10 @@ struct SerializationPhase {
|
|||||||
RunSerializerForBackgroundCompilation(data->broker(), data->dependencies(),
|
RunSerializerForBackgroundCompilation(data->broker(), data->dependencies(),
|
||||||
temp_zone, data->info()->closure(),
|
temp_zone, data->info()->closure(),
|
||||||
flags, data->info()->osr_offset());
|
flags, data->info()->osr_offset());
|
||||||
|
if (data->specialization_context().IsJust()) {
|
||||||
|
ContextRef(data->broker(),
|
||||||
|
data->specialization_context().FromJust().context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1969,6 +1969,7 @@ void SerializerForBackgroundCompilation::ProcessBuiltinCall(
|
|||||||
case Builtins::kPromiseResolveTrampoline:
|
case Builtins::kPromiseResolveTrampoline:
|
||||||
// For JSCallReducer::ReducePromiseInternalResolve and
|
// For JSCallReducer::ReducePromiseInternalResolve and
|
||||||
// JSNativeContextSpecialization::ReduceJSResolvePromise.
|
// JSNativeContextSpecialization::ReduceJSResolvePromise.
|
||||||
|
// TODO(mslekova): Check if this condition is redundant.
|
||||||
if (arguments.size() >= 1) {
|
if (arguments.size() >= 1) {
|
||||||
Hints const& resolution_hints =
|
Hints const& resolution_hints =
|
||||||
arguments.size() >= 2
|
arguments.size() >= 2
|
||||||
|
Loading…
Reference in New Issue
Block a user