| Index: test/cctest/compiler/simplified-graph-builder.cc
|
| diff --git a/test/cctest/compiler/simplified-graph-builder.cc b/test/cctest/compiler/simplified-graph-builder.cc
|
| index c688399eaec5166e9eb54d27d64dda235e79aaf4..06f6a73b831b4536433b10fd59e608f171a09f2b 100644
|
| --- a/test/cctest/compiler/simplified-graph-builder.cc
|
| +++ b/test/cctest/compiler/simplified-graph-builder.cc
|
| @@ -4,6 +4,9 @@
|
|
|
| #include "test/cctest/compiler/simplified-graph-builder.h"
|
|
|
| +#include "src/compiler/operator-properties.h"
|
| +#include "src/compiler/operator-properties-inl.h"
|
| +
|
| namespace v8 {
|
| namespace internal {
|
| namespace compiler {
|
| @@ -11,7 +14,10 @@ namespace compiler {
|
| SimplifiedGraphBuilder::SimplifiedGraphBuilder(
|
| Graph* graph, CommonOperatorBuilder* common,
|
| MachineOperatorBuilder* machine, SimplifiedOperatorBuilder* simplified)
|
| - : StructuredGraphBuilder(graph, common),
|
| + : GraphBuilder(graph),
|
| + effect_(NULL),
|
| + return_(NULL),
|
| + common_(common),
|
| machine_(machine),
|
| simplified_(simplified) {}
|
|
|
| @@ -20,57 +26,62 @@ void SimplifiedGraphBuilder::Begin(int num_parameters) {
|
| DCHECK(graph()->start() == NULL);
|
| Node* start = graph()->NewNode(common()->Start(num_parameters));
|
| graph()->SetStart(start);
|
| - set_environment(new (zone()) Environment(this, start));
|
| + effect_ = start;
|
| }
|
|
|
|
|
| void SimplifiedGraphBuilder::Return(Node* value) {
|
| - Node* control = NewNode(common()->Return(), value);
|
| - UpdateControlDependencyToLeaveFunction(control);
|
| + return_ =
|
| + graph()->NewNode(common()->Return(), value, effect_, graph()->start());
|
| + effect_ = NULL;
|
| }
|
|
|
|
|
| void SimplifiedGraphBuilder::End() {
|
| - environment()->UpdateControlDependency(exit_control());
|
| - graph()->SetEnd(NewNode(common()->End()));
|
| -}
|
| -
|
| -
|
| -SimplifiedGraphBuilder::Environment::Environment(
|
| - SimplifiedGraphBuilder* builder, Node* control_dependency)
|
| - : StructuredGraphBuilder::Environment(builder, control_dependency) {}
|
| -
|
| -
|
| -Node* SimplifiedGraphBuilder::Environment::Top() {
|
| - DCHECK(!values()->empty());
|
| - return values()->back();
|
| -}
|
| -
|
| -
|
| -void SimplifiedGraphBuilder::Environment::Push(Node* node) {
|
| - values()->push_back(node);
|
| -}
|
| -
|
| -
|
| -Node* SimplifiedGraphBuilder::Environment::Pop() {
|
| - DCHECK(!values()->empty());
|
| - Node* back = values()->back();
|
| - values()->pop_back();
|
| - return back;
|
| -}
|
| -
|
| -
|
| -void SimplifiedGraphBuilder::Environment::Poke(size_t depth, Node* node) {
|
| - DCHECK(depth < values()->size());
|
| - size_t index = values()->size() - depth - 1;
|
| - values()->at(index) = node;
|
| + Node* end = graph()->NewNode(common()->End(), return_);
|
| + graph()->SetEnd(end);
|
| }
|
|
|
|
|
| -Node* SimplifiedGraphBuilder::Environment::Peek(size_t depth) {
|
| - DCHECK(depth < values()->size());
|
| - size_t index = values()->size() - depth - 1;
|
| - return values()->at(index);
|
| +Node* SimplifiedGraphBuilder::MakeNode(Operator* op, int value_input_count,
|
| + Node** value_inputs) {
|
| + DCHECK(op->InputCount() == value_input_count);
|
| +
|
| + DCHECK(!OperatorProperties::HasContextInput(op));
|
| + DCHECK(!OperatorProperties::HasFrameStateInput(op));
|
| + bool has_control = OperatorProperties::GetControlInputCount(op) == 1;
|
| + bool has_effect = OperatorProperties::GetEffectInputCount(op) == 1;
|
| +
|
| + DCHECK(OperatorProperties::GetControlInputCount(op) < 2);
|
| + DCHECK(OperatorProperties::GetEffectInputCount(op) < 2);
|
| +
|
| + Node* result = NULL;
|
| + if (!has_control && !has_effect) {
|
| + result = graph()->NewNode(op, value_input_count, value_inputs);
|
| + } else {
|
| + int input_count_with_deps = value_input_count;
|
| + if (has_control) ++input_count_with_deps;
|
| + if (has_effect) ++input_count_with_deps;
|
| + Node** buffer = zone()->NewArray<Node*>(input_count_with_deps);
|
| + memcpy(buffer, value_inputs, kPointerSize * value_input_count);
|
| + Node** current_input = buffer + value_input_count;
|
| + if (has_effect) {
|
| + *current_input++ = effect_;
|
| + }
|
| + if (has_control) {
|
| + *current_input++ = graph()->start();
|
| + }
|
| + result = graph()->NewNode(op, input_count_with_deps, buffer);
|
| + if (has_effect) {
|
| + effect_ = result;
|
| + }
|
| + if (OperatorProperties::HasControlOutput(result->op())) {
|
| + // This graph builder does not support control flow.
|
| + UNREACHABLE();
|
| + }
|
| + }
|
| +
|
| + return result;
|
| }
|
|
|
| } // namespace compiler
|
|
|