v8/test/cctest/compiler/simplified-graph-builder.h
bmeurer@chromium.org a17289f4bc [turbofan] Drop broken StaticParameterTraits.
The StaticParameterTraits are broken by design, and cause way too much
trouble. The compilers usually pick the wrong specialization (i.e. the
default specialization is picked for Load and Phi even tho there is a
specialization for MachineType), which is not only the reason why GVN is
ineffective and slow, but can also lead to correctness issues in some
rare cases.

Also clean up some minor bugs/inconsistencies on the way.

TEST=cctest,unittests
R=svenpanne@chromium.org

Review URL: https://codereview.chromium.org/636893002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24437 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
2014-10-07 13:30:28 +00:00

157 lines
5.2 KiB
C++

// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_CCTEST_COMPILER_SIMPLIFIED_GRAPH_BUILDER_H_
#define V8_CCTEST_COMPILER_SIMPLIFIED_GRAPH_BUILDER_H_
#include "src/compiler/common-operator.h"
#include "src/compiler/graph-builder.h"
#include "src/compiler/machine-operator.h"
#include "src/compiler/simplified-operator.h"
#include "test/cctest/cctest.h"
#include "test/cctest/compiler/call-tester.h"
namespace v8 {
namespace internal {
namespace compiler {
class SimplifiedGraphBuilder : public GraphBuilder {
public:
SimplifiedGraphBuilder(Graph* graph, CommonOperatorBuilder* common,
MachineOperatorBuilder* machine,
SimplifiedOperatorBuilder* simplified);
virtual ~SimplifiedGraphBuilder() {}
Zone* zone() const { return graph()->zone(); }
Isolate* isolate() const { return zone()->isolate(); }
CommonOperatorBuilder* common() const { return common_; }
MachineOperatorBuilder* machine() const { return machine_; }
SimplifiedOperatorBuilder* simplified() const { return simplified_; }
// Initialize graph and builder.
void Begin(int num_parameters);
void Return(Node* value);
// Close the graph.
void 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* StringAdd(Node* a, Node* b) {
return NewNode(simplified()->StringAdd(), 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,
Node* length) {
return NewNode(simplified()->LoadElement(access), object, index, length);
}
Node* StoreElement(const ElementAccess& access, Node* object, Node* index,
Node* length, Node* value) {
return NewNode(simplified()->StoreElement(access), object, index, length,
value);
}
protected:
virtual Node* MakeNode(const Operator* op, int value_input_count,
Node** value_inputs) FINAL;
private:
Node* effect_;
Node* return_;
CommonOperatorBuilder* common_;
MachineOperatorBuilder* machine_;
SimplifiedOperatorBuilder* simplified_;
};
} // namespace compiler
} // namespace internal
} // namespace v8
#endif // V8_CCTEST_COMPILER_SIMPLIFIED_GRAPH_BUILDER_H_