| Index: test/cctest/compiler/graph-builder-tester.h
|
| diff --git a/test/cctest/compiler/graph-builder-tester.h b/test/cctest/compiler/graph-builder-tester.h
|
| index 7270293e0f63a983f39542b8ff7487ea454aa86b..b570ed6b1341ed3af722d98d75c68af25f4db38e 100644
|
| --- a/test/cctest/compiler/graph-builder-tester.h
|
| +++ b/test/cctest/compiler/graph-builder-tester.h
|
| @@ -12,10 +12,10 @@
|
| #include "src/compiler/graph-builder.h"
|
| #include "src/compiler/linkage.h"
|
| #include "src/compiler/machine-operator.h"
|
| +#include "src/compiler/operator-properties.h"
|
| #include "src/compiler/pipeline.h"
|
| #include "src/compiler/simplified-operator.h"
|
| #include "test/cctest/compiler/call-tester.h"
|
| -#include "test/cctest/compiler/simplified-graph-builder.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -42,7 +42,7 @@ template <typename ReturnType>
|
| class GraphBuilderTester : public HandleAndZoneScope,
|
| private GraphAndBuilders,
|
| public CallHelper<ReturnType>,
|
| - public SimplifiedGraphBuilder {
|
| + public GraphBuilder {
|
| public:
|
| explicit GraphBuilderTester(MachineType p0 = kMachNone,
|
| MachineType p1 = kMachNone,
|
| @@ -54,8 +54,9 @@ class GraphBuilderTester : public HandleAndZoneScope,
|
| main_isolate(),
|
| CSignature::New(main_zone(), MachineTypeForC<ReturnType>(), p0, p1,
|
| p2, p3, p4)),
|
| - SimplifiedGraphBuilder(main_isolate(), main_graph_, &main_common_,
|
| - &main_machine_, &main_simplified_),
|
| + GraphBuilder(main_isolate(), main_graph_),
|
| + effect_(NULL),
|
| + return_(NULL),
|
| parameters_(main_zone()->template NewArray<Node*>(parameter_count())) {
|
| Begin(static_cast<int>(parameter_count()));
|
| InitParameters();
|
| @@ -68,9 +69,168 @@ class GraphBuilderTester : public HandleAndZoneScope,
|
| return parameters_[index];
|
| }
|
|
|
| + Zone* zone() const { return graph()->zone(); }
|
| Factory* factory() const { return isolate()->factory(); }
|
| + CommonOperatorBuilder* common() { return &main_common_; }
|
| + MachineOperatorBuilder* machine() { return &main_machine_; }
|
| + SimplifiedOperatorBuilder* simplified() { return &main_simplified_; }
|
| +
|
| + // Initialize graph and builder.
|
| + void Begin(int num_parameters) {
|
| + DCHECK(graph()->start() == NULL);
|
| + Node* start = graph()->NewNode(common()->Start(num_parameters + 3));
|
| + graph()->SetStart(start);
|
| + effect_ = start;
|
| + }
|
| +
|
| + void Return(Node* value) {
|
| + return_ =
|
| + graph()->NewNode(common()->Return(), value, effect_, graph()->start());
|
| + effect_ = NULL;
|
| + }
|
| +
|
| + // Close the graph.
|
| + void End() {
|
| + Node* end = graph()->NewNode(common()->End(1), return_);
|
| + graph()->SetEnd(end);
|
| + }
|
| +
|
| + Node* PointerConstant(void* value) {
|
| + intptr_t intptr_value = reinterpret_cast<intptr_t>(value);
|
| + return kPointerSize == 8 ? NewNode(common()->Int64Constant(intptr_value))
|
| + : Int32Constant(static_cast<int>(intptr_value));
|
| + }
|
| + Node* Int32Constant(int32_t value) {
|
| + return NewNode(common()->Int32Constant(value));
|
| + }
|
| + Node* HeapConstant(Handle<HeapObject> object) {
|
| + Unique<HeapObject> val = Unique<HeapObject>::CreateUninitialized(object);
|
| + return NewNode(common()->HeapConstant(val));
|
| + }
|
| +
|
| + Node* BooleanNot(Node* a) { return NewNode(simplified()->BooleanNot(), a); }
|
| +
|
| + Node* NumberEqual(Node* a, Node* b) {
|
| + return NewNode(simplified()->NumberEqual(), a, b);
|
| + }
|
| + Node* NumberLessThan(Node* a, Node* b) {
|
| + return NewNode(simplified()->NumberLessThan(), a, b);
|
| + }
|
| + Node* NumberLessThanOrEqual(Node* a, Node* b) {
|
| + return NewNode(simplified()->NumberLessThanOrEqual(), a, b);
|
| + }
|
| + Node* NumberAdd(Node* a, Node* b) {
|
| + return NewNode(simplified()->NumberAdd(), a, b);
|
| + }
|
| + Node* NumberSubtract(Node* a, Node* b) {
|
| + return NewNode(simplified()->NumberSubtract(), a, b);
|
| + }
|
| + Node* NumberMultiply(Node* a, Node* b) {
|
| + return NewNode(simplified()->NumberMultiply(), a, b);
|
| + }
|
| + Node* NumberDivide(Node* a, Node* b) {
|
| + return NewNode(simplified()->NumberDivide(), a, b);
|
| + }
|
| + Node* NumberModulus(Node* a, Node* b) {
|
| + return NewNode(simplified()->NumberModulus(), a, b);
|
| + }
|
| + Node* NumberToInt32(Node* a) {
|
| + return NewNode(simplified()->NumberToInt32(), a);
|
| + }
|
| + Node* NumberToUint32(Node* a) {
|
| + return NewNode(simplified()->NumberToUint32(), a);
|
| + }
|
| +
|
| + Node* StringEqual(Node* a, Node* b) {
|
| + return NewNode(simplified()->StringEqual(), a, b);
|
| + }
|
| + Node* StringLessThan(Node* a, Node* b) {
|
| + return NewNode(simplified()->StringLessThan(), a, b);
|
| + }
|
| + Node* StringLessThanOrEqual(Node* a, Node* b) {
|
| + return NewNode(simplified()->StringLessThanOrEqual(), a, b);
|
| + }
|
| +
|
| + Node* ChangeTaggedToInt32(Node* a) {
|
| + return NewNode(simplified()->ChangeTaggedToInt32(), a);
|
| + }
|
| + Node* ChangeTaggedToUint32(Node* a) {
|
| + return NewNode(simplified()->ChangeTaggedToUint32(), a);
|
| + }
|
| + Node* ChangeTaggedToFloat64(Node* a) {
|
| + return NewNode(simplified()->ChangeTaggedToFloat64(), a);
|
| + }
|
| + Node* ChangeInt32ToTagged(Node* a) {
|
| + return NewNode(simplified()->ChangeInt32ToTagged(), a);
|
| + }
|
| + Node* ChangeUint32ToTagged(Node* a) {
|
| + return NewNode(simplified()->ChangeUint32ToTagged(), a);
|
| + }
|
| + Node* ChangeFloat64ToTagged(Node* a) {
|
| + return NewNode(simplified()->ChangeFloat64ToTagged(), a);
|
| + }
|
| + Node* ChangeBoolToBit(Node* a) {
|
| + return NewNode(simplified()->ChangeBoolToBit(), a);
|
| + }
|
| + Node* ChangeBitToBool(Node* a) {
|
| + return NewNode(simplified()->ChangeBitToBool(), a);
|
| + }
|
| +
|
| + Node* LoadField(const FieldAccess& access, Node* object) {
|
| + return NewNode(simplified()->LoadField(access), object);
|
| + }
|
| + Node* StoreField(const FieldAccess& access, Node* object, Node* value) {
|
| + return NewNode(simplified()->StoreField(access), object, value);
|
| + }
|
| + Node* LoadElement(const ElementAccess& access, Node* object, Node* index) {
|
| + return NewNode(simplified()->LoadElement(access), object, index);
|
| + }
|
| + Node* StoreElement(const ElementAccess& access, Node* object, Node* index,
|
| + Node* value) {
|
| + return NewNode(simplified()->StoreElement(access), object, index, value);
|
| + }
|
|
|
| protected:
|
| + virtual Node* MakeNode(const Operator* op, int value_input_count,
|
| + Node** value_inputs, bool incomplete) final {
|
| + DCHECK(op->ValueInputCount() == value_input_count);
|
| +
|
| + DCHECK(!OperatorProperties::HasContextInput(op));
|
| + DCHECK_EQ(0, OperatorProperties::GetFrameStateInputCount(op));
|
| + bool has_control = op->ControlInputCount() == 1;
|
| + bool has_effect = op->EffectInputCount() == 1;
|
| +
|
| + DCHECK(op->ControlInputCount() < 2);
|
| + DCHECK(op->EffectInputCount() < 2);
|
| +
|
| + Node* result = NULL;
|
| + if (!has_control && !has_effect) {
|
| + result =
|
| + graph()->NewNode(op, value_input_count, value_inputs, incomplete);
|
| + } 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()->template 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, incomplete);
|
| + if (has_effect) {
|
| + effect_ = result;
|
| + }
|
| + // This graph builder does not support control flow.
|
| + CHECK_EQ(0, op->ControlOutputCount());
|
| + }
|
| +
|
| + return result;
|
| + }
|
| +
|
| virtual byte* Generate() {
|
| if (!Pipeline::SupportedBackend()) return NULL;
|
| if (code_.is_null()) {
|
| @@ -92,6 +252,8 @@ class GraphBuilderTester : public HandleAndZoneScope,
|
| size_t parameter_count() const { return this->csig_->parameter_count(); }
|
|
|
| private:
|
| + Node* effect_;
|
| + Node* return_;
|
| Node** parameters_;
|
| MaybeHandle<Code> code_;
|
| };
|
|
|