Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index 1380f9e3c8b428835debfc188dd612654f033f52..f8ad5ad84407d501c15441da203b3235dbf54c52 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -301,7 +301,6 @@ class WasmTrapHelper : public ZoneObject { |
} |
void BuildTrapCode(Node* reason_node, Node* position_node) { |
- Node* end; |
Node** control_ptr = builder_->control_; |
Node** effect_ptr = builder_->effect_; |
wasm::ModuleEnv* module = builder_->module_; |
@@ -332,16 +331,12 @@ class WasmTrapHelper : public ZoneObject { |
Node* thrw = |
graph()->NewNode(common()->Throw(), jsgraph()->ZeroConstant(), |
*effect_ptr, *control_ptr); |
- end = thrw; |
+ MergeControlToEnd(jsgraph(), thrw); |
} else { |
// End the control flow with returning 0xdeadbeef |
Node* ret_value = GetTrapValue(builder_->GetFunctionSignature()); |
- end = graph()->NewNode(jsgraph()->common()->Return(), |
- jsgraph()->Int32Constant(0), ret_value, |
- *effect_ptr, *control_ptr); |
+ builder_->Return(ret_value); |
} |
- |
- MergeControlToEnd(jsgraph(), end); |
} |
}; |
@@ -374,7 +369,7 @@ Node* WasmGraphBuilder::Start(unsigned params) { |
return start; |
} |
-Node* WasmGraphBuilder::Param(unsigned index, wasm::LocalType type) { |
+Node* WasmGraphBuilder::Param(unsigned index) { |
return graph()->NewNode(jsgraph()->common()->Parameter(index), |
graph()->start()); |
} |
@@ -1099,9 +1094,18 @@ Node* WasmGraphBuilder::Return(unsigned count, Node** vals) { |
DCHECK_NOT_NULL(*control_); |
DCHECK_NOT_NULL(*effect_); |
- Node** buf = Realloc(vals, count, count + 3); |
- memmove(buf + 1, buf, sizeof(void*) * count); |
+ static const int kStackAllocatedNodeBufferSize = 8; |
+ Node* stack_buffer[kStackAllocatedNodeBufferSize]; |
+ std::vector<Node*> heap_buffer; |
+ |
+ Node** buf = stack_buffer; |
+ if (count + 3 > kStackAllocatedNodeBufferSize) { |
+ heap_buffer.resize(count + 3); |
+ buf = heap_buffer.data(); |
+ } |
+ |
buf[0] = jsgraph()->Int32Constant(0); |
+ memcpy(buf + 1, vals, sizeof(void*) * count); |
buf[count + 1] = *effect_; |
buf[count + 2] = *control_; |
Node* ret = |
@@ -2763,8 +2767,7 @@ void WasmGraphBuilder::BuildJSToWasmWrapper(Handle<Code> wasm_code, |
// Convert JS parameters to WASM numbers. |
for (int i = 0; i < wasm_count; ++i) { |
- Node* param = |
- graph()->NewNode(jsgraph()->common()->Parameter(i + 1), start); |
+ Node* param = Param(i + 1); |
Node* wasm_param = FromJS(param, context, sig->GetParam(i)); |
args[pos++] = wasm_param; |
if (jsgraph()->machine()->Is32() && sig->GetParam(i) == wasm::kAstI64) { |
@@ -2784,6 +2787,7 @@ void WasmGraphBuilder::BuildJSToWasmWrapper(Handle<Code> wasm_code, |
desc = wasm::ModuleEnv::GetI32WasmCallDescriptor(jsgraph()->zone(), desc); |
} |
Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), count, args); |
+ *effect_ = call; |
Node* retval = call; |
if (jsgraph()->machine()->Is32() && sig->return_count() > 0 && |
sig->GetReturn(0) == wasm::kAstI64) { |
@@ -2793,10 +2797,7 @@ void WasmGraphBuilder::BuildJSToWasmWrapper(Handle<Code> wasm_code, |
} |
Node* jsval = ToJS( |
retval, sig->return_count() == 0 ? wasm::kAstStmt : sig->GetReturn()); |
- Node* ret = graph()->NewNode(jsgraph()->common()->Return(), |
- jsgraph()->Int32Constant(0), jsval, call, start); |
- |
- MergeControlToEnd(jsgraph(), ret); |
+ Return(jsval); |
} |
int WasmGraphBuilder::AddParameterNodes(Node** args, int pos, int param_count, |
@@ -2804,8 +2805,7 @@ int WasmGraphBuilder::AddParameterNodes(Node** args, int pos, int param_count, |
// Convert WASM numbers to JS values. |
int param_index = 0; |
for (int i = 0; i < param_count; ++i) { |
- Node* param = graph()->NewNode( |
- jsgraph()->common()->Parameter(param_index++), graph()->start()); |
+ Node* param = Param(param_index++); |
args[pos++] = ToJS(param, sig->GetParam(i)); |
if (jsgraph()->machine()->Is32() && sig->GetParam(i) == wasm::kAstI64) { |
// On 32 bit platforms we have to skip the high word of int64 |
@@ -2909,10 +2909,7 @@ void WasmGraphBuilder::BuildWasmToJSWrapper(Handle<JSReceiver> target, |
? i32_zero |
: FromJS(call, HeapConstant(isolate->native_context()), |
sig->GetReturn()); |
- Node* ret = graph()->NewNode(jsgraph()->common()->Return(), i32_zero, val, |
- *effect_, start); |
- |
- MergeControlToEnd(jsgraph(), ret); |
+ Return(val); |
} |
Node* WasmGraphBuilder::MemBuffer(uint32_t offset) { |