Commit 662a5585 authored by mvstanton's avatar mvstanton Committed by Commit bot

Turbofan: Make type feedback vector a Node.

This improves code generation. Before, it was a constant loaded in a register
every time.

R=mstarzinger@chromium.org
BUG=

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

Cr-Commit-Position: refs/heads/master@{#28874}
parent e3d76269
This diff is collapsed.
...@@ -88,6 +88,7 @@ class AstGraphBuilder : public AstVisitor { ...@@ -88,6 +88,7 @@ class AstGraphBuilder : public AstVisitor {
// Nodes representing values in the activation record. // Nodes representing values in the activation record.
SetOncePointer<Node> function_closure_; SetOncePointer<Node> function_closure_;
SetOncePointer<Node> function_context_; SetOncePointer<Node> function_context_;
SetOncePointer<Node> feedback_vector_;
// Tracks how many try-blocks are currently entered. // Tracks how many try-blocks are currently entered.
int try_catch_nesting_level_; int try_catch_nesting_level_;
...@@ -147,6 +148,9 @@ class AstGraphBuilder : public AstVisitor { ...@@ -147,6 +148,9 @@ class AstGraphBuilder : public AstVisitor {
// Get or create the node that represents the outer function closure. // Get or create the node that represents the outer function closure.
Node* GetFunctionClosure(); Node* GetFunctionClosure();
// Get or create the node that represents the functions type feedback vector.
Node* GetFeedbackVector();
// Node creation helpers. // Node creation helpers.
Node* NewNode(const Operator* op, bool incomplete = false) { Node* NewNode(const Operator* op, bool incomplete = false) {
return MakeNode(op, 0, static_cast<Node**>(NULL), incomplete); return MakeNode(op, 0, static_cast<Node**>(NULL), incomplete);
...@@ -231,8 +235,9 @@ class AstGraphBuilder : public AstVisitor { ...@@ -231,8 +235,9 @@ class AstGraphBuilder : public AstVisitor {
Node** EnsureInputBufferSize(int size); Node** EnsureInputBufferSize(int size);
// Named and keyed loads require a VectorSlotPair for successful lowering. // Named and keyed loads require a ResolvedFeedbackSlot for successful
VectorSlotPair CreateVectorSlotPair(FeedbackVectorICSlot slot) const; // lowering.
ResolvedFeedbackSlot ResolveFeedbackSlot(FeedbackVectorICSlot slot) const;
// Determine which contexts need to be checked for extension objects that // Determine which contexts need to be checked for extension objects that
// might shadow the optimistic declaration of dynamic lookup variables. // might shadow the optimistic declaration of dynamic lookup variables.
...@@ -271,15 +276,15 @@ class AstGraphBuilder : public AstVisitor { ...@@ -271,15 +276,15 @@ class AstGraphBuilder : public AstVisitor {
OutputFrameStateCombine framestate_combine); OutputFrameStateCombine framestate_combine);
Node* BuildVariableLoad(Variable* variable, BailoutId bailout_id, Node* BuildVariableLoad(Variable* variable, BailoutId bailout_id,
FrameStateBeforeAndAfter& states, FrameStateBeforeAndAfter& states,
const VectorSlotPair& feedback, const ResolvedFeedbackSlot& feedback,
OutputFrameStateCombine framestate_combine, OutputFrameStateCombine framestate_combine,
ContextualMode mode = CONTEXTUAL); ContextualMode mode = CONTEXTUAL);
// Builders for property loads and stores. // Builders for property loads and stores.
Node* BuildKeyedLoad(Node* receiver, Node* key, Node* BuildKeyedLoad(Node* receiver, Node* key,
const VectorSlotPair& feedback); const ResolvedFeedbackSlot& feedback);
Node* BuildNamedLoad(Node* receiver, Handle<Name> name, Node* BuildNamedLoad(Node* receiver, Handle<Name> name,
const VectorSlotPair& feedback, const ResolvedFeedbackSlot& feedback,
ContextualMode mode = NOT_CONTEXTUAL); ContextualMode mode = NOT_CONTEXTUAL);
Node* BuildKeyedStore(Node* receiver, Node* key, Node* value, Node* BuildKeyedStore(Node* receiver, Node* key, Node* value,
TypeFeedbackId id); TypeFeedbackId id);
...@@ -292,9 +297,10 @@ class AstGraphBuilder : public AstVisitor { ...@@ -292,9 +297,10 @@ class AstGraphBuilder : public AstVisitor {
Node* BuildNamedSuperStore(Node* receiver, Node* home_object, Node* BuildNamedSuperStore(Node* receiver, Node* home_object,
Handle<Name> name, Node* value, TypeFeedbackId id); Handle<Name> name, Node* value, TypeFeedbackId id);
Node* BuildNamedSuperLoad(Node* receiver, Node* home_object, Node* BuildNamedSuperLoad(Node* receiver, Node* home_object,
Handle<Name> name, const VectorSlotPair& feedback); Handle<Name> name,
const ResolvedFeedbackSlot& feedback);
Node* BuildKeyedSuperLoad(Node* receiver, Node* home_object, Node* key, Node* BuildKeyedSuperLoad(Node* receiver, Node* home_object, Node* key,
const VectorSlotPair& feedback); const ResolvedFeedbackSlot& feedback);
// Builders for accessing the function context. // Builders for accessing the function context.
Node* BuildLoadBuiltinsObject(); Node* BuildLoadBuiltinsObject();
......
...@@ -344,9 +344,7 @@ void JSGenericLowering::LowerJSLoadProperty(Node* node) { ...@@ -344,9 +344,7 @@ void JSGenericLowering::LowerJSLoadProperty(Node* node) {
Callable callable = Callable callable =
CodeFactory::KeyedLoadICInOptimizedCode(isolate(), UNINITIALIZED); CodeFactory::KeyedLoadICInOptimizedCode(isolate(), UNINITIALIZED);
node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index())); node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index()));
node->InsertInput(zone(), 3, jsgraph()->HeapConstant(p.feedback().vector())); ReplaceWithStubCall(node, callable, flags);
ReplaceWithStubCall(node, callable,
CallDescriptor::kPatchableCallSite | flags);
} }
...@@ -357,9 +355,7 @@ void JSGenericLowering::LowerJSLoadNamed(Node* node) { ...@@ -357,9 +355,7 @@ void JSGenericLowering::LowerJSLoadNamed(Node* node) {
isolate(), p.contextual_mode(), UNINITIALIZED); isolate(), p.contextual_mode(), UNINITIALIZED);
node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name())); node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name()));
node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index())); node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index()));
node->InsertInput(zone(), 3, jsgraph()->HeapConstant(p.feedback().vector())); ReplaceWithStubCall(node, callable, flags);
ReplaceWithStubCall(node, callable,
CallDescriptor::kPatchableCallSite | flags);
} }
...@@ -455,6 +451,7 @@ void JSGenericLowering::LowerJSLoadDynamicGlobal(Node* node) { ...@@ -455,6 +451,7 @@ void JSGenericLowering::LowerJSLoadDynamicGlobal(Node* node) {
Node* projection = graph()->NewNode(common()->Projection(0), node); Node* projection = graph()->NewNode(common()->Projection(0), node);
NodeProperties::ReplaceWithValue(node, projection, node, node); NodeProperties::ReplaceWithValue(node, projection, node, node);
node->RemoveInput(NodeProperties::FirstFrameStateIndex(node) + 1); node->RemoveInput(NodeProperties::FirstFrameStateIndex(node) + 1);
node->RemoveInput(NodeProperties::FirstValueIndex(node));
node->InsertInput(zone(), 1, jsgraph()->Constant(access.name())); node->InsertInput(zone(), 1, jsgraph()->Constant(access.name()));
ReplaceWithRuntimeCall(node, function_id); ReplaceWithRuntimeCall(node, function_id);
projection->ReplaceInput(0, node); projection->ReplaceInput(0, node);
......
...@@ -93,7 +93,7 @@ ContextAccess const& ContextAccessOf(Operator const* op) { ...@@ -93,7 +93,7 @@ ContextAccess const& ContextAccessOf(Operator const* op) {
DynamicGlobalAccess::DynamicGlobalAccess(const Handle<String>& name, DynamicGlobalAccess::DynamicGlobalAccess(const Handle<String>& name,
uint32_t check_bitset, uint32_t check_bitset,
const VectorSlotPair& feedback, const ResolvedFeedbackSlot& feedback,
ContextualMode mode) ContextualMode mode)
: name_(name), : name_(name),
check_bitset_(check_bitset), check_bitset_(check_bitset),
...@@ -175,14 +175,13 @@ DynamicContextAccess const& DynamicContextAccessOf(Operator const* op) { ...@@ -175,14 +175,13 @@ DynamicContextAccess const& DynamicContextAccessOf(Operator const* op) {
} }
bool operator==(VectorSlotPair const& lhs, VectorSlotPair const& rhs) { bool operator==(ResolvedFeedbackSlot const& lhs,
return lhs.slot().ToInt() == rhs.slot().ToInt() && ResolvedFeedbackSlot const& rhs) {
lhs.vector().is_identical_to(rhs.vector()); return lhs.slot().ToInt() == rhs.slot().ToInt();
} }
size_t hash_value(VectorSlotPair const& p) { size_t hash_value(ResolvedFeedbackSlot const& p) {
// TODO(mvstanton): include the vector in the hash.
base::hash<int> h; base::hash<int> h;
return h(p.slot().ToInt()); return h(p.slot().ToInt());
} }
...@@ -458,25 +457,25 @@ const Operator* JSOperatorBuilder::CallConstruct(int arguments) { ...@@ -458,25 +457,25 @@ const Operator* JSOperatorBuilder::CallConstruct(int arguments) {
} }
const Operator* JSOperatorBuilder::LoadNamed(const Unique<Name>& name, const Operator* JSOperatorBuilder::LoadNamed(
const VectorSlotPair& feedback, const Unique<Name>& name, const ResolvedFeedbackSlot& feedback,
ContextualMode contextual_mode) { ContextualMode contextual_mode) {
LoadNamedParameters parameters(name, feedback, contextual_mode); LoadNamedParameters parameters(name, feedback, contextual_mode);
return new (zone()) Operator1<LoadNamedParameters>( // -- return new (zone()) Operator1<LoadNamedParameters>( // --
IrOpcode::kJSLoadNamed, Operator::kNoProperties, // opcode IrOpcode::kJSLoadNamed, Operator::kNoProperties, // opcode
"JSLoadNamed", // name "JSLoadNamed", // name
1, 1, 1, 1, 1, 2, // counts 2, 1, 1, 1, 1, 2, // counts
parameters); // parameter parameters); // parameter
} }
const Operator* JSOperatorBuilder::LoadProperty( const Operator* JSOperatorBuilder::LoadProperty(
const VectorSlotPair& feedback) { const ResolvedFeedbackSlot& feedback) {
LoadPropertyParameters parameters(feedback); LoadPropertyParameters parameters(feedback);
return new (zone()) Operator1<LoadPropertyParameters>( // -- return new (zone()) Operator1<LoadPropertyParameters>( // --
IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode
"JSLoadProperty", // name "JSLoadProperty", // name
2, 1, 1, 1, 1, 2, // counts 3, 1, 1, 1, 1, 2, // counts
parameters); // parameter parameters); // parameter
} }
...@@ -526,12 +525,12 @@ const Operator* JSOperatorBuilder::StoreContext(size_t depth, size_t index) { ...@@ -526,12 +525,12 @@ const Operator* JSOperatorBuilder::StoreContext(size_t depth, size_t index) {
const Operator* JSOperatorBuilder::LoadDynamicGlobal( const Operator* JSOperatorBuilder::LoadDynamicGlobal(
const Handle<String>& name, uint32_t check_bitset, const Handle<String>& name, uint32_t check_bitset,
const VectorSlotPair& feedback, ContextualMode mode) { const ResolvedFeedbackSlot& feedback, ContextualMode mode) {
DynamicGlobalAccess access(name, check_bitset, feedback, mode); DynamicGlobalAccess access(name, check_bitset, feedback, mode);
return new (zone()) Operator1<DynamicGlobalAccess>( // -- return new (zone()) Operator1<DynamicGlobalAccess>( // --
IrOpcode::kJSLoadDynamicGlobal, Operator::kNoProperties, // opcode IrOpcode::kJSLoadDynamicGlobal, Operator::kNoProperties, // opcode
"JSLoadDynamicGlobal", // name "JSLoadDynamicGlobal", // name
1, 1, 1, 1, 1, 2, // counts 2, 1, 1, 1, 1, 2, // counts
access); // parameter access); // parameter
} }
......
...@@ -112,23 +112,28 @@ std::ostream& operator<<(std::ostream&, ContextAccess const&); ...@@ -112,23 +112,28 @@ std::ostream& operator<<(std::ostream&, ContextAccess const&);
ContextAccess const& ContextAccessOf(Operator const*); ContextAccess const& ContextAccessOf(Operator const*);
class VectorSlotPair { // A ResolvedFeedbackSlot needs to query the type feedback vector to get it's
// index in the vector.
class ResolvedFeedbackSlot {
public: public:
VectorSlotPair(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) ResolvedFeedbackSlot(Handle<TypeFeedbackVector> vector,
: vector_(vector), slot_(slot) {} FeedbackVectorICSlot slot)
: slot_(slot),
index_(slot == FeedbackVectorICSlot::Invalid() ? -1 : vector->GetIndex(
slot)) {}
ResolvedFeedbackSlot() : slot_(FeedbackVectorICSlot::Invalid()), index_(-1) {}
Handle<TypeFeedbackVector> vector() const { return vector_; }
FeedbackVectorICSlot slot() const { return slot_; } FeedbackVectorICSlot slot() const { return slot_; }
int index() const { return index_; }
int index() const { return vector_->GetIndex(slot_); }
private: private:
const Handle<TypeFeedbackVector> vector_;
const FeedbackVectorICSlot slot_; const FeedbackVectorICSlot slot_;
const int index_;
}; };
bool operator==(VectorSlotPair const& lhs, VectorSlotPair const& rhs); bool operator==(ResolvedFeedbackSlot const& lhs,
ResolvedFeedbackSlot const& rhs);
// Defines the name for a dynamic variable lookup. The {check_bitset} allows to // Defines the name for a dynamic variable lookup. The {check_bitset} allows to
...@@ -137,11 +142,12 @@ bool operator==(VectorSlotPair const& lhs, VectorSlotPair const& rhs); ...@@ -137,11 +142,12 @@ bool operator==(VectorSlotPair const& lhs, VectorSlotPair const& rhs);
class DynamicGlobalAccess final { class DynamicGlobalAccess final {
public: public:
DynamicGlobalAccess(const Handle<String>& name, uint32_t check_bitset, DynamicGlobalAccess(const Handle<String>& name, uint32_t check_bitset,
const VectorSlotPair& feedback, ContextualMode mode); const ResolvedFeedbackSlot& feedback,
ContextualMode mode);
const Handle<String>& name() const { return name_; } const Handle<String>& name() const { return name_; }
uint32_t check_bitset() const { return check_bitset_; } uint32_t check_bitset() const { return check_bitset_; }
const VectorSlotPair& feedback() const { return feedback_; } const ResolvedFeedbackSlot& feedback() const { return feedback_; }
ContextualMode mode() const { return mode_; } ContextualMode mode() const { return mode_; }
// Indicates that an inline check is disabled. // Indicates that an inline check is disabled.
...@@ -158,7 +164,7 @@ class DynamicGlobalAccess final { ...@@ -158,7 +164,7 @@ class DynamicGlobalAccess final {
private: private:
const Handle<String> name_; const Handle<String> name_;
const uint32_t check_bitset_; const uint32_t check_bitset_;
const VectorSlotPair feedback_; const ResolvedFeedbackSlot feedback_;
const ContextualMode mode_; const ContextualMode mode_;
}; };
...@@ -215,18 +221,19 @@ DynamicContextAccess const& DynamicContextAccessOf(Operator const*); ...@@ -215,18 +221,19 @@ DynamicContextAccess const& DynamicContextAccessOf(Operator const*);
// used as a parameter by JSLoadNamed operators. // used as a parameter by JSLoadNamed operators.
class LoadNamedParameters final { class LoadNamedParameters final {
public: public:
LoadNamedParameters(const Unique<Name>& name, const VectorSlotPair& feedback, LoadNamedParameters(const Unique<Name>& name,
const ResolvedFeedbackSlot& feedback,
ContextualMode contextual_mode) ContextualMode contextual_mode)
: name_(name), feedback_(feedback), contextual_mode_(contextual_mode) {} : name_(name), feedback_(feedback), contextual_mode_(contextual_mode) {}
const Unique<Name>& name() const { return name_; } const Unique<Name>& name() const { return name_; }
ContextualMode contextual_mode() const { return contextual_mode_; } ContextualMode contextual_mode() const { return contextual_mode_; }
const VectorSlotPair& feedback() const { return feedback_; } const ResolvedFeedbackSlot& feedback() const { return feedback_; }
private: private:
const Unique<Name> name_; const Unique<Name> name_;
const VectorSlotPair feedback_; const ResolvedFeedbackSlot feedback_;
const ContextualMode contextual_mode_; const ContextualMode contextual_mode_;
}; };
...@@ -244,13 +251,13 @@ const LoadNamedParameters& LoadNamedParametersOf(const Operator* op); ...@@ -244,13 +251,13 @@ const LoadNamedParameters& LoadNamedParametersOf(const Operator* op);
// used as a parameter by JSLoadProperty operators. // used as a parameter by JSLoadProperty operators.
class LoadPropertyParameters final { class LoadPropertyParameters final {
public: public:
explicit LoadPropertyParameters(const VectorSlotPair& feedback) explicit LoadPropertyParameters(const ResolvedFeedbackSlot& feedback)
: feedback_(feedback) {} : feedback_(feedback) {}
const VectorSlotPair& feedback() const { return feedback_; } const ResolvedFeedbackSlot& feedback() const { return feedback_; }
private: private:
const VectorSlotPair feedback_; const ResolvedFeedbackSlot feedback_;
}; };
bool operator==(LoadPropertyParameters const&, LoadPropertyParameters const&); bool operator==(LoadPropertyParameters const&, LoadPropertyParameters const&);
...@@ -361,9 +368,9 @@ class JSOperatorBuilder final : public ZoneObject { ...@@ -361,9 +368,9 @@ class JSOperatorBuilder final : public ZoneObject {
const Operator* CallConstruct(int arguments); const Operator* CallConstruct(int arguments);
const Operator* LoadProperty(const VectorSlotPair& feedback); const Operator* LoadProperty(const ResolvedFeedbackSlot& feedback);
const Operator* LoadNamed(const Unique<Name>& name, const Operator* LoadNamed(const Unique<Name>& name,
const VectorSlotPair& feedback, const ResolvedFeedbackSlot& feedback,
ContextualMode contextual_mode = NOT_CONTEXTUAL); ContextualMode contextual_mode = NOT_CONTEXTUAL);
const Operator* StoreProperty(LanguageMode language_mode); const Operator* StoreProperty(LanguageMode language_mode);
...@@ -379,7 +386,7 @@ class JSOperatorBuilder final : public ZoneObject { ...@@ -379,7 +386,7 @@ class JSOperatorBuilder final : public ZoneObject {
const Operator* LoadDynamicGlobal(const Handle<String>& name, const Operator* LoadDynamicGlobal(const Handle<String>& name,
uint32_t check_bitset, uint32_t check_bitset,
const VectorSlotPair& feedback, const ResolvedFeedbackSlot& feedback,
ContextualMode mode); ContextualMode mode);
const Operator* LoadDynamicContext(const Handle<String>& name, const Operator* LoadDynamicContext(const Handle<String>& name,
uint32_t check_bitset, size_t depth, uint32_t check_bitset, size_t depth,
......
...@@ -936,6 +936,7 @@ Reduction JSTypedLowering::ReduceJSStoreContext(Node* node) { ...@@ -936,6 +936,7 @@ Reduction JSTypedLowering::ReduceJSStoreContext(Node* node) {
Reduction JSTypedLowering::ReduceJSLoadDynamicGlobal(Node* node) { Reduction JSTypedLowering::ReduceJSLoadDynamicGlobal(Node* node) {
DCHECK_EQ(IrOpcode::kJSLoadDynamicGlobal, node->opcode()); DCHECK_EQ(IrOpcode::kJSLoadDynamicGlobal, node->opcode());
DynamicGlobalAccess const& access = DynamicGlobalAccessOf(node->op()); DynamicGlobalAccess const& access = DynamicGlobalAccessOf(node->op());
Node* const vector = NodeProperties::GetValueInput(node, 0);
Node* const context = NodeProperties::GetContextInput(node); Node* const context = NodeProperties::GetContextInput(node);
Node* const state1 = NodeProperties::GetFrameStateInput(node, 0); Node* const state1 = NodeProperties::GetFrameStateInput(node, 0);
Node* const state2 = NodeProperties::GetFrameStateInput(node, 1); Node* const state2 = NodeProperties::GetFrameStateInput(node, 1);
...@@ -971,14 +972,14 @@ Reduction JSTypedLowering::ReduceJSLoadDynamicGlobal(Node* node) { ...@@ -971,14 +972,14 @@ Reduction JSTypedLowering::ReduceJSLoadDynamicGlobal(Node* node) {
context, effect); context, effect);
Node* fast = graph()->NewNode( Node* fast = graph()->NewNode(
javascript()->LoadNamed(name, access.feedback(), access.mode()), global, javascript()->LoadNamed(name, access.feedback(), access.mode()), global,
context, state1, state2, global, check_true); vector, context, state1, state2, global, check_true);
// Slow case, because variable potentially shadowed. Perform dynamic lookup. // Slow case, because variable potentially shadowed. Perform dynamic lookup.
uint32_t check_bitset = DynamicGlobalAccess::kFullCheckRequired; uint32_t check_bitset = DynamicGlobalAccess::kFullCheckRequired;
Node* slow = graph()->NewNode( Node* slow = graph()->NewNode(
javascript()->LoadDynamicGlobal(access.name(), check_bitset, javascript()->LoadDynamicGlobal(access.name(), check_bitset,
access.feedback(), access.mode()), access.feedback(), access.mode()),
context, context, state1, state2, effect, check_false); vector, context, context, state1, state2, effect, check_false);
// Replace value, effect and control uses accordingly. // Replace value, effect and control uses accordingly.
Node* new_control = Node* new_control =
......
...@@ -77,15 +77,15 @@ class JSTypeFeedbackTest : public TypedGraphTest { ...@@ -77,15 +77,15 @@ class JSTypeFeedbackTest : public TypedGraphTest {
Node* ReturnLoadNamedFromGlobal( Node* ReturnLoadNamedFromGlobal(
const char* string, Node* effect, Node* control, const char* string, Node* effect, Node* control,
JSTypeFeedbackSpecializer::DeoptimizationMode mode) { JSTypeFeedbackSpecializer::DeoptimizationMode mode) {
VectorSlotPair feedback(Handle<TypeFeedbackVector>::null(), ResolvedFeedbackSlot feedback;
FeedbackVectorICSlot::Invalid());
Node* global = Parameter(Type::GlobalObject()); Node* global = Parameter(Type::GlobalObject());
Node* vector = UndefinedConstant();
Node* context = UndefinedConstant(); Node* context = UndefinedConstant();
Unique<Name> name = Unique<Name>::CreateUninitialized( Unique<Name> name = Unique<Name>::CreateUninitialized(
isolate()->factory()->NewStringFromAsciiChecked(string)); isolate()->factory()->NewStringFromAsciiChecked(string));
const Operator* op = javascript()->LoadNamed(name, feedback); const Operator* op = javascript()->LoadNamed(name, feedback);
Node* load = graph()->NewNode(op, global, context); Node* load = graph()->NewNode(op, global, vector, context);
if (mode == JSTypeFeedbackSpecializer::kDeoptimizationEnabled) { if (mode == JSTypeFeedbackSpecializer::kDeoptimizationEnabled) {
for (int i = 0; i < OperatorProperties::GetFrameStateInputCount(op); for (int i = 0; i < OperatorProperties::GetFrameStateInputCount(op);
i++) { i++) {
......
...@@ -648,8 +648,7 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArray) { ...@@ -648,8 +648,7 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArray) {
double backing_store[kLength]; double backing_store[kLength];
Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer> buffer =
NewArrayBuffer(backing_store, sizeof(backing_store)); NewArrayBuffer(backing_store, sizeof(backing_store));
VectorSlotPair feedback(Handle<TypeFeedbackVector>::null(), ResolvedFeedbackSlot feedback;
FeedbackVectorICSlot::Invalid());
TRACED_FOREACH(ExternalArrayType, type, kExternalArrayTypes) { TRACED_FOREACH(ExternalArrayType, type, kExternalArrayTypes) {
Handle<JSTypedArray> array = Handle<JSTypedArray> array =
factory()->NewJSTypedArray(type, buffer, 0, kLength); factory()->NewJSTypedArray(type, buffer, 0, kLength);
...@@ -658,12 +657,13 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArray) { ...@@ -658,12 +657,13 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArray) {
Node* key = Parameter( Node* key = Parameter(
Type::Range(kMinInt / element_size, kMaxInt / element_size, zone())); Type::Range(kMinInt / element_size, kMaxInt / element_size, zone()));
Node* base = HeapConstant(array); Node* base = HeapConstant(array);
Node* vector = UndefinedConstant();
Node* context = UndefinedConstant(); Node* context = UndefinedConstant();
Node* effect = graph()->start(); Node* effect = graph()->start();
Node* control = graph()->start(); Node* control = graph()->start();
Reduction r = Reduce(graph()->NewNode(javascript()->LoadProperty(feedback), Reduction r = Reduce(graph()->NewNode(
base, key, context, EmptyFrameState(), javascript()->LoadProperty(feedback), base, key, vector, context,
EmptyFrameState(), effect, control)); EmptyFrameState(), EmptyFrameState(), effect, control));
Matcher<Node*> offset_matcher = Matcher<Node*> offset_matcher =
element_size == 1 element_size == 1
...@@ -687,8 +687,7 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArrayWithSafeKey) { ...@@ -687,8 +687,7 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArrayWithSafeKey) {
double backing_store[kLength]; double backing_store[kLength];
Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer> buffer =
NewArrayBuffer(backing_store, sizeof(backing_store)); NewArrayBuffer(backing_store, sizeof(backing_store));
VectorSlotPair feedback(Handle<TypeFeedbackVector>::null(), ResolvedFeedbackSlot feedback;
FeedbackVectorICSlot::Invalid());
TRACED_FOREACH(ExternalArrayType, type, kExternalArrayTypes) { TRACED_FOREACH(ExternalArrayType, type, kExternalArrayTypes) {
Handle<JSTypedArray> array = Handle<JSTypedArray> array =
factory()->NewJSTypedArray(type, buffer, 0, kLength); factory()->NewJSTypedArray(type, buffer, 0, kLength);
...@@ -699,12 +698,13 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArrayWithSafeKey) { ...@@ -699,12 +698,13 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArrayWithSafeKey) {
if (min > max) std::swap(min, max); if (min > max) std::swap(min, max);
Node* key = Parameter(Type::Range(min, max, zone())); Node* key = Parameter(Type::Range(min, max, zone()));
Node* base = HeapConstant(array); Node* base = HeapConstant(array);
Node* vector = UndefinedConstant();
Node* context = UndefinedConstant(); Node* context = UndefinedConstant();
Node* effect = graph()->start(); Node* effect = graph()->start();
Node* control = graph()->start(); Node* control = graph()->start();
Reduction r = Reduce(graph()->NewNode(javascript()->LoadProperty(feedback), Reduction r = Reduce(graph()->NewNode(
base, key, context, EmptyFrameState(), javascript()->LoadProperty(feedback), base, key, vector, context,
EmptyFrameState(), effect, control)); EmptyFrameState(), EmptyFrameState(), effect, control));
ASSERT_TRUE(r.Changed()); ASSERT_TRUE(r.Changed());
EXPECT_THAT( EXPECT_THAT(
...@@ -878,9 +878,9 @@ TEST_F(JSTypedLoweringTest, JSLoadNamedGlobalConstants) { ...@@ -878,9 +878,9 @@ TEST_F(JSTypedLoweringTest, JSLoadNamedGlobalConstants) {
IsNumberConstant(IsNaN()) // -- IsNumberConstant(IsNaN()) // --
}; };
VectorSlotPair feedback(Handle<TypeFeedbackVector>::null(), ResolvedFeedbackSlot feedback;
FeedbackVectorICSlot::Invalid());
Node* global = Parameter(Type::GlobalObject()); Node* global = Parameter(Type::GlobalObject());
Node* vector = UndefinedConstant();
Node* context = UndefinedConstant(); Node* context = UndefinedConstant();
Node* effect = graph()->start(); Node* effect = graph()->start();
Node* control = graph()->start(); Node* control = graph()->start();
...@@ -888,7 +888,7 @@ TEST_F(JSTypedLoweringTest, JSLoadNamedGlobalConstants) { ...@@ -888,7 +888,7 @@ TEST_F(JSTypedLoweringTest, JSLoadNamedGlobalConstants) {
for (size_t i = 0; i < arraysize(names); i++) { for (size_t i = 0; i < arraysize(names); i++) {
Unique<Name> name = Unique<Name>::CreateImmovable(names[i]); Unique<Name> name = Unique<Name>::CreateImmovable(names[i]);
Reduction r = Reduce(graph()->NewNode( Reduction r = Reduce(graph()->NewNode(
javascript()->LoadNamed(name, feedback), global, context, javascript()->LoadNamed(name, feedback), global, vector, context,
EmptyFrameState(), EmptyFrameState(), effect, control)); EmptyFrameState(), EmptyFrameState(), effect, control));
ASSERT_TRUE(r.Changed()); ASSERT_TRUE(r.Changed());
...@@ -903,17 +903,17 @@ TEST_F(JSTypedLoweringTest, JSLoadNamedGlobalConstants) { ...@@ -903,17 +903,17 @@ TEST_F(JSTypedLoweringTest, JSLoadNamedGlobalConstants) {
TEST_F(JSTypedLoweringTest, JSLoadDynamicGlobal) { TEST_F(JSTypedLoweringTest, JSLoadDynamicGlobal) {
Node* const context = Parameter(Type::Any()); Node* const context = Parameter(Type::Any());
Node* const vector = UndefinedConstant();
Node* const frame_state = EmptyFrameState(); Node* const frame_state = EmptyFrameState();
Node* const effect = graph()->start(); Node* const effect = graph()->start();
Node* const control = graph()->start(); Node* const control = graph()->start();
Handle<String> name = factory()->object_string(); Handle<String> name = factory()->object_string();
VectorSlotPair feedback(Handle<TypeFeedbackVector>::null(), ResolvedFeedbackSlot feedback;
FeedbackVectorICSlot::Invalid());
for (int i = 0; i < DynamicGlobalAccess::kMaxCheckDepth; ++i) { for (int i = 0; i < DynamicGlobalAccess::kMaxCheckDepth; ++i) {
uint32_t bitset = 1 << i; // Only single check. uint32_t bitset = 1 << i; // Only single check.
Reduction r = Reduce(graph()->NewNode( Reduction r = Reduce(graph()->NewNode(
javascript()->LoadDynamicGlobal(name, bitset, feedback, NOT_CONTEXTUAL), javascript()->LoadDynamicGlobal(name, bitset, feedback, NOT_CONTEXTUAL),
context, context, frame_state, frame_state, effect, control)); vector, context, context, frame_state, frame_state, effect, control));
ASSERT_TRUE(r.Changed()); ASSERT_TRUE(r.Changed());
EXPECT_THAT( EXPECT_THAT(
r.replacement(), r.replacement(),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment