OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/wasm-compiler.h" | 5 #include "src/compiler/wasm-compiler.h" |
6 | 6 |
7 #include "src/isolate-inl.h" | 7 #include "src/isolate-inl.h" |
8 | 8 |
9 #include "src/base/platform/elapsed-timer.h" | 9 #include "src/base/platform/elapsed-timer.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 2082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2093 case wasm::kAstF64: | 2093 case wasm::kAstF64: |
2094 return graph()->NewNode(simplified.ChangeFloat64ToTagged(), node); | 2094 return graph()->NewNode(simplified.ChangeFloat64ToTagged(), node); |
2095 case wasm::kAstStmt: | 2095 case wasm::kAstStmt: |
2096 return jsgraph()->UndefinedConstant(); | 2096 return jsgraph()->UndefinedConstant(); |
2097 default: | 2097 default: |
2098 UNREACHABLE(); | 2098 UNREACHABLE(); |
2099 return nullptr; | 2099 return nullptr; |
2100 } | 2100 } |
2101 } | 2101 } |
2102 | 2102 |
| 2103 Node* WasmGraphBuilder::BuildJavaScriptToNumber(Node* node, Node* context, |
| 2104 Node* effect, Node* control) { |
| 2105 Callable callable = CodeFactory::ToNumber(jsgraph()->isolate()); |
| 2106 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 2107 jsgraph()->isolate(), jsgraph()->zone(), callable.descriptor(), 0, |
| 2108 CallDescriptor::kNeedsFrameState, Operator::kNoProperties); |
| 2109 Node* stub_code = jsgraph()->HeapConstant(callable.code()); |
| 2110 |
| 2111 Node* result = |
| 2112 graph()->NewNode(jsgraph()->common()->Call(desc), stub_code, node, |
| 2113 context, jsgraph()->EmptyFrameState(), effect, control); |
| 2114 |
| 2115 *control_ = result; |
| 2116 *effect_ = result; |
| 2117 |
| 2118 return result; |
| 2119 } |
2103 | 2120 |
2104 Node* WasmGraphBuilder::FromJS(Node* node, Node* context, | 2121 Node* WasmGraphBuilder::FromJS(Node* node, Node* context, |
2105 wasm::LocalType type) { | 2122 wasm::LocalType type) { |
2106 // Do a JavaScript ToNumber. | 2123 // Do a JavaScript ToNumber. |
2107 Node* num = | 2124 Node* num = BuildJavaScriptToNumber(node, context, *effect_, *control_); |
2108 graph()->NewNode(jsgraph()->javascript()->ToNumber(), node, context, | |
2109 jsgraph()->EmptyFrameState(), *effect_, *control_); | |
2110 *control_ = num; | |
2111 *effect_ = num; | |
2112 | 2125 |
2113 // Change representation. | 2126 // Change representation. |
2114 SimplifiedOperatorBuilder simplified(jsgraph()->zone()); | 2127 SimplifiedOperatorBuilder simplified(jsgraph()->zone()); |
2115 num = graph()->NewNode(simplified.ChangeTaggedToFloat64(), num); | 2128 num = graph()->NewNode(simplified.ChangeTaggedToFloat64(), num); |
2116 | 2129 |
2117 switch (type) { | 2130 switch (type) { |
2118 case wasm::kAstI32: { | 2131 case wasm::kAstI32: { |
2119 num = graph()->NewNode(jsgraph()->machine()->TruncateFloat64ToInt32( | 2132 num = graph()->NewNode(jsgraph()->machine()->TruncateFloat64ToInt32( |
2120 TruncationMode::kJavaScript), | 2133 TruncationMode::kJavaScript), |
2121 num); | 2134 num); |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2501 isolate->wasm_function_map(), name, MaybeHandle<Code>()); | 2514 isolate->wasm_function_map(), name, MaybeHandle<Code>()); |
2502 function->SetInternalField(0, *module_object); | 2515 function->SetInternalField(0, *module_object); |
2503 function->set_shared(*shared); | 2516 function->set_shared(*shared); |
2504 | 2517 |
2505 //---------------------------------------------------------------------------- | 2518 //---------------------------------------------------------------------------- |
2506 // Create the Graph | 2519 // Create the Graph |
2507 //---------------------------------------------------------------------------- | 2520 //---------------------------------------------------------------------------- |
2508 Zone zone(isolate->allocator()); | 2521 Zone zone(isolate->allocator()); |
2509 Graph graph(&zone); | 2522 Graph graph(&zone); |
2510 CommonOperatorBuilder common(&zone); | 2523 CommonOperatorBuilder common(&zone); |
2511 JSOperatorBuilder javascript(&zone); | |
2512 MachineOperatorBuilder machine(&zone); | 2524 MachineOperatorBuilder machine(&zone); |
2513 JSGraph jsgraph(isolate, &graph, &common, &javascript, nullptr, &machine); | 2525 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); |
2514 | 2526 |
2515 Node* control = nullptr; | 2527 Node* control = nullptr; |
2516 Node* effect = nullptr; | 2528 Node* effect = nullptr; |
2517 | 2529 |
2518 WasmGraphBuilder builder(&zone, &jsgraph, func->sig); | 2530 WasmGraphBuilder builder(&zone, &jsgraph, func->sig); |
2519 builder.set_control_ptr(&control); | 2531 builder.set_control_ptr(&control); |
2520 builder.set_effect_ptr(&effect); | 2532 builder.set_effect_ptr(&effect); |
2521 builder.set_module(module); | 2533 builder.set_module(module); |
2522 builder.BuildJSToWasmWrapper(wasm_code, func->sig); | 2534 builder.BuildJSToWasmWrapper(wasm_code, func->sig); |
2523 | 2535 |
2524 //---------------------------------------------------------------------------- | 2536 //---------------------------------------------------------------------------- |
2525 // Run the compilation pipeline. | 2537 // Run the compilation pipeline. |
2526 //---------------------------------------------------------------------------- | 2538 //---------------------------------------------------------------------------- |
2527 { | 2539 { |
2528 // Changes lowering requires types. | 2540 // Changes lowering requires types. |
2529 Typer typer(isolate, &graph); | 2541 Typer typer(isolate, &graph); |
2530 NodeVector roots(&zone); | 2542 NodeVector roots(&zone); |
2531 jsgraph.GetCachedNodes(&roots); | 2543 jsgraph.GetCachedNodes(&roots); |
2532 typer.Run(roots); | 2544 typer.Run(roots); |
2533 | 2545 |
2534 // Run generic and change lowering. | 2546 // Run generic and change lowering. |
2535 JSGenericLowering generic(&jsgraph); | |
2536 ChangeLowering changes(&jsgraph); | 2547 ChangeLowering changes(&jsgraph); |
2537 GraphReducer graph_reducer(&zone, &graph, jsgraph.Dead()); | 2548 GraphReducer graph_reducer(&zone, &graph, jsgraph.Dead()); |
2538 graph_reducer.AddReducer(&changes); | 2549 graph_reducer.AddReducer(&changes); |
2539 graph_reducer.AddReducer(&generic); | |
2540 graph_reducer.ReduceGraph(); | 2550 graph_reducer.ReduceGraph(); |
2541 | 2551 |
2542 if (FLAG_trace_turbo_graph) { // Simple textual RPO. | 2552 if (FLAG_trace_turbo_graph) { // Simple textual RPO. |
2543 OFStream os(stdout); | 2553 OFStream os(stdout); |
2544 os << "-- Graph after change lowering -- " << std::endl; | 2554 os << "-- Graph after change lowering -- " << std::endl; |
2545 os << AsRPO(graph); | 2555 os << AsRPO(graph); |
2546 } | 2556 } |
2547 | 2557 |
2548 // Schedule and compile to machine code. | 2558 // Schedule and compile to machine code. |
2549 int params = static_cast<int>( | 2559 int params = static_cast<int>( |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2593 Handle<JSFunction> function, | 2603 Handle<JSFunction> function, |
2594 wasm::FunctionSig* sig, | 2604 wasm::FunctionSig* sig, |
2595 wasm::WasmName module_name, | 2605 wasm::WasmName module_name, |
2596 wasm::WasmName function_name) { | 2606 wasm::WasmName function_name) { |
2597 //---------------------------------------------------------------------------- | 2607 //---------------------------------------------------------------------------- |
2598 // Create the Graph | 2608 // Create the Graph |
2599 //---------------------------------------------------------------------------- | 2609 //---------------------------------------------------------------------------- |
2600 Zone zone(isolate->allocator()); | 2610 Zone zone(isolate->allocator()); |
2601 Graph graph(&zone); | 2611 Graph graph(&zone); |
2602 CommonOperatorBuilder common(&zone); | 2612 CommonOperatorBuilder common(&zone); |
2603 JSOperatorBuilder javascript(&zone); | |
2604 MachineOperatorBuilder machine(&zone); | 2613 MachineOperatorBuilder machine(&zone); |
2605 JSGraph jsgraph(isolate, &graph, &common, &javascript, nullptr, &machine); | 2614 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); |
2606 | 2615 |
2607 Node* control = nullptr; | 2616 Node* control = nullptr; |
2608 Node* effect = nullptr; | 2617 Node* effect = nullptr; |
2609 | 2618 |
2610 WasmGraphBuilder builder(&zone, &jsgraph, sig); | 2619 WasmGraphBuilder builder(&zone, &jsgraph, sig); |
2611 builder.set_control_ptr(&control); | 2620 builder.set_control_ptr(&control); |
2612 builder.set_effect_ptr(&effect); | 2621 builder.set_effect_ptr(&effect); |
2613 builder.set_module(module); | 2622 builder.set_module(module); |
2614 builder.BuildWasmToJSWrapper(function, sig); | 2623 builder.BuildWasmToJSWrapper(function, sig); |
2615 | 2624 |
2616 Handle<Code> code = Handle<Code>::null(); | 2625 Handle<Code> code = Handle<Code>::null(); |
2617 { | 2626 { |
2618 // Changes lowering requires types. | 2627 // Changes lowering requires types. |
2619 Typer typer(isolate, &graph); | 2628 Typer typer(isolate, &graph); |
2620 NodeVector roots(&zone); | 2629 NodeVector roots(&zone); |
2621 jsgraph.GetCachedNodes(&roots); | 2630 jsgraph.GetCachedNodes(&roots); |
2622 typer.Run(roots); | 2631 typer.Run(roots); |
2623 | 2632 |
2624 // Run generic and change lowering. | 2633 // Run generic and change lowering. |
2625 JSGenericLowering generic(&jsgraph); | |
2626 ChangeLowering changes(&jsgraph); | 2634 ChangeLowering changes(&jsgraph); |
2627 GraphReducer graph_reducer(&zone, &graph, jsgraph.Dead()); | 2635 GraphReducer graph_reducer(&zone, &graph, jsgraph.Dead()); |
2628 graph_reducer.AddReducer(&changes); | 2636 graph_reducer.AddReducer(&changes); |
2629 graph_reducer.AddReducer(&generic); | |
2630 graph_reducer.ReduceGraph(); | 2637 graph_reducer.ReduceGraph(); |
2631 | 2638 |
2632 if (FLAG_trace_turbo_graph) { // Simple textual RPO. | 2639 if (FLAG_trace_turbo_graph) { // Simple textual RPO. |
2633 OFStream os(stdout); | 2640 OFStream os(stdout); |
2634 os << "-- Graph after change lowering -- " << std::endl; | 2641 os << "-- Graph after change lowering -- " << std::endl; |
2635 os << AsRPO(graph); | 2642 os << AsRPO(graph); |
2636 } | 2643 } |
2637 | 2644 |
2638 // Schedule and compile to machine code. | 2645 // Schedule and compile to machine code. |
2639 CallDescriptor* incoming = | 2646 CallDescriptor* incoming = |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2785 // TODO(bradnelson): Improve histogram handling of size_t. | 2792 // TODO(bradnelson): Improve histogram handling of size_t. |
2786 isolate->counters()->wasm_compile_function_peak_memory_bytes()->AddSample( | 2793 isolate->counters()->wasm_compile_function_peak_memory_bytes()->AddSample( |
2787 static_cast<int>(zone.allocation_size())); | 2794 static_cast<int>(zone.allocation_size())); |
2788 return code; | 2795 return code; |
2789 } | 2796 } |
2790 | 2797 |
2791 | 2798 |
2792 } // namespace compiler | 2799 } // namespace compiler |
2793 } // namespace internal | 2800 } // namespace internal |
2794 } // namespace v8 | 2801 } // namespace v8 |
OLD | NEW |