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

Unified Diff: src/compiler/wasm-compiler.cc

Issue 1900713005: [wasm] First step to separate graph construction from graph compilation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 8 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
« no previous file with comments | « src/compiler/pipeline.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/wasm-compiler.cc
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
index 57266aeaa601f097d84496191403f1c829e05c38..346fafab887ca43960dc8ec617cb3a457e9fb13c 100644
--- a/src/compiler/wasm-compiler.cc
+++ b/src/compiler/wasm-compiler.cc
@@ -12,8 +12,8 @@
#include "src/compiler/access-builder.h"
#include "src/compiler/common-operator.h"
#include "src/compiler/diamond.h"
-#include "src/compiler/graph.h"
#include "src/compiler/graph-visualizer.h"
+#include "src/compiler/graph.h"
#include "src/compiler/instruction-selector.h"
#include "src/compiler/int64-lowering.h"
#include "src/compiler/js-generic-lowering.h"
@@ -24,6 +24,7 @@
#include "src/compiler/node-matchers.h"
#include "src/compiler/pipeline.h"
#include "src/compiler/source-position.h"
+#include "src/compiler/zone-pool.h"
#include "src/code-factory.h"
#include "src/code-stubs.h"
@@ -2981,35 +2982,24 @@ Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, wasm::ModuleEnv* module,
return code;
}
-
-// Helper function to compile a single function.
-Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
- wasm::ModuleEnv* module_env,
- const wasm::WasmFunction& function) {
- HistogramTimerScope wasm_compile_function_time_scope(
- isolate->counters()->wasm_compile_function_time());
- if (FLAG_trace_wasm_compiler) {
- OFStream os(stdout);
- os << "Compiling WASM function "
- << wasm::WasmFunctionName(&function, module_env) << std::endl;
- os << std::endl;
- }
-
- double decode_ms = 0;
+JSGraph* BuildGraphForWasmFunction(Zone* zone, wasm::ErrorThrower& thrower,
+ Isolate* isolate,
+ wasm::ModuleEnv*& module_env,
+ const wasm::WasmFunction& function,
+ double* decode_ms) {
base::ElapsedTimer decode_timer;
if (FLAG_trace_wasm_decode_time) {
decode_timer.Start();
}
-
// Create a TF graph during decoding.
- Zone zone(isolate->allocator());
- Graph graph(&zone);
- CommonOperatorBuilder common(&zone);
- MachineOperatorBuilder machine(
- &zone, MachineType::PointerRepresentation(),
+ Graph* graph = new (zone) Graph(zone);
+ CommonOperatorBuilder* common = new (zone) CommonOperatorBuilder(zone);
+ MachineOperatorBuilder* machine = new (zone) MachineOperatorBuilder(
+ zone, MachineType::PointerRepresentation(),
InstructionSelector::SupportedMachineOperatorFlags());
- JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine);
- WasmGraphBuilder builder(&zone, &jsgraph, function.sig);
+ JSGraph* jsgraph =
+ new (zone) JSGraph(isolate, graph, common, nullptr, nullptr, machine);
+ WasmGraphBuilder builder(zone, jsgraph, function.sig);
wasm::FunctionBody body = {
module_env, function.sig, module_env->module->module_start,
module_env->module->module_start + function.code_start_offset,
@@ -3017,8 +3007,8 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
wasm::TreeResult result =
wasm::BuildTFGraph(isolate->allocator(), &builder, body);
- if (machine.Is32()) {
- Int64Lowering r(&graph, &machine, &common, &zone, function.sig);
+ if (machine->Is32()) {
+ Int64Lowering r(graph, machine, common, zone, function.sig);
r.LowerGraph();
}
@@ -3034,16 +3024,40 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:",
function.func_index, name.length, name.name);
thrower.Failed(buffer.start(), result);
- return Handle<Code>::null();
+ return nullptr;
}
-
int index = static_cast<int>(function.func_index);
if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) {
PrintAst(isolate->allocator(), body);
}
-
if (FLAG_trace_wasm_decode_time) {
- decode_ms = decode_timer.Elapsed().InMillisecondsF();
+ *decode_ms = decode_timer.Elapsed().InMillisecondsF();
+ }
+ return jsgraph;
+}
+
+// Helper function to compile a single function.
+Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
+ wasm::ModuleEnv* module_env,
+ const wasm::WasmFunction& function) {
+ HistogramTimerScope wasm_compile_function_time_scope(
+ isolate->counters()->wasm_compile_function_time());
+ if (FLAG_trace_wasm_compiler) {
+ OFStream os(stdout);
+ os << "Compiling WASM function "
+ << wasm::WasmFunctionName(&function, module_env) << std::endl;
+ os << std::endl;
+ }
+
+ compiler::ZonePool zone_pool(isolate->allocator());
+ compiler::ZonePool::Scope graph_zone_scope(&zone_pool);
+ double decode_ms = 0;
+ JSGraph* jsgraph =
+ BuildGraphForWasmFunction(graph_zone_scope.zone(), thrower, isolate,
+ module_env, function, &decode_ms);
+
+ if (jsgraph == nullptr) {
+ return Handle<Code>::null();
}
base::ElapsedTimer compile_timer;
@@ -3051,10 +3065,11 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
compile_timer.Start();
}
// Run the compiler pipeline to generate machine code.
- CallDescriptor* descriptor =
- wasm::ModuleEnv::GetWasmCallDescriptor(&zone, function.sig);
- if (machine.Is32()) {
- descriptor = module_env->GetI32WasmCallDescriptor(&zone, descriptor);
+ CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor(
+ jsgraph->graph()->zone(), function.sig);
+ if (jsgraph->machine()->Is32()) {
+ descriptor = module_env->GetI32WasmCallDescriptor(jsgraph->graph()->zone(),
+ descriptor);
}
Code::Flags flags = Code::ComputeFlags(Code::WASM_FUNCTION);
// add flags here if a meaningful name is helpful for debugging.
@@ -3074,10 +3089,14 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
name.name);
func_name = buffer.start();
}
- CompilationInfo info(func_name, isolate, &zone, flags);
-
- Handle<Code> code =
- Pipeline::GenerateCodeForTesting(&info, descriptor, &graph);
+ CompilationInfo info(func_name, isolate, jsgraph->graph()->zone(), flags);
+ compiler::ZonePool::Scope pipeline_zone_scope(&zone_pool);
+ Pipeline pipeline(&info);
+ pipeline.InitializeWasmCompilation(pipeline_zone_scope.zone(), &zone_pool,
+ jsgraph->graph());
+ Handle<Code> code = pipeline.ScheduleAndGenerateCode(descriptor);
+ pipeline.FinalizeWasmCompilation();
+ pipeline_zone_scope.Destroy();
if (debugging) {
buffer.Dispose();
}
@@ -3094,11 +3113,12 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
"wasm-compile ok: %d bytes, %0.3f ms decode, %d nodes, %0.3f ms "
"compile\n",
static_cast<int>(function.code_end_offset - function.code_start_offset),
- decode_ms, static_cast<int>(graph.NodeCount()), compile_ms);
+ decode_ms, static_cast<int>(jsgraph->graph()->NodeCount()), compile_ms);
}
// TODO(bradnelson): Improve histogram handling of size_t.
isolate->counters()->wasm_compile_function_peak_memory_bytes()->AddSample(
- static_cast<int>(zone.allocation_size()));
+ static_cast<int>(jsgraph->graph()->zone()->allocation_size()));
+ graph_zone_scope.Destroy();
return code;
}
« no previous file with comments | « src/compiler/pipeline.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698