Commit 3d31d251 authored by mvstanton's avatar mvstanton Committed by Commit bot

[Turbofan]: generic lowering can use a constant vector

Since we are specializing on the native context, we don't have to load
the vector from the closure. For one thing, this reduces the machinery for
nodes that use a vector in their generic incarnation.

BUG=
R=mstarzinger@chromium.org

Review-Url: https://codereview.chromium.org/2529463002
Cr-Commit-Position: refs/heads/master@{#41221}
parent 2b96c9d7
...@@ -3537,7 +3537,7 @@ Node* AstGraphBuilder::BuildVariableAssignment( ...@@ -3537,7 +3537,7 @@ Node* AstGraphBuilder::BuildVariableAssignment(
Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key,
const VectorSlotPair& feedback) { const VectorSlotPair& feedback) {
const Operator* op = javascript()->LoadProperty(feedback); const Operator* op = javascript()->LoadProperty(feedback);
Node* node = NewNode(op, object, key, GetFunctionClosure()); Node* node = NewNode(op, object, key);
return node; return node;
} }
...@@ -3545,7 +3545,7 @@ Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, ...@@ -3545,7 +3545,7 @@ Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key,
Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name,
const VectorSlotPair& feedback) { const VectorSlotPair& feedback) {
const Operator* op = javascript()->LoadNamed(name, feedback); const Operator* op = javascript()->LoadNamed(name, feedback);
Node* node = NewNode(op, object, GetFunctionClosure()); Node* node = NewNode(op, object);
return node; return node;
} }
...@@ -3553,7 +3553,7 @@ Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, ...@@ -3553,7 +3553,7 @@ Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name,
Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value, Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value,
const VectorSlotPair& feedback) { const VectorSlotPair& feedback) {
const Operator* op = javascript()->StoreProperty(language_mode(), feedback); const Operator* op = javascript()->StoreProperty(language_mode(), feedback);
Node* node = NewNode(op, object, key, value, GetFunctionClosure()); Node* node = NewNode(op, object, key, value);
return node; return node;
} }
...@@ -3563,7 +3563,7 @@ Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, ...@@ -3563,7 +3563,7 @@ Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name,
const VectorSlotPair& feedback) { const VectorSlotPair& feedback) {
const Operator* op = const Operator* op =
javascript()->StoreNamed(language_mode(), name, feedback); javascript()->StoreNamed(language_mode(), name, feedback);
Node* node = NewNode(op, object, value, GetFunctionClosure()); Node* node = NewNode(op, object, value);
return node; return node;
} }
...@@ -3614,7 +3614,7 @@ Node* AstGraphBuilder::BuildGlobalLoad(Handle<Name> name, ...@@ -3614,7 +3614,7 @@ Node* AstGraphBuilder::BuildGlobalLoad(Handle<Name> name,
const VectorSlotPair& feedback, const VectorSlotPair& feedback,
TypeofMode typeof_mode) { TypeofMode typeof_mode) {
const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode);
Node* node = NewNode(op, GetFunctionClosure()); Node* node = NewNode(op);
return node; return node;
} }
...@@ -3623,7 +3623,7 @@ Node* AstGraphBuilder::BuildGlobalStore(Handle<Name> name, Node* value, ...@@ -3623,7 +3623,7 @@ Node* AstGraphBuilder::BuildGlobalStore(Handle<Name> name, Node* value,
const VectorSlotPair& feedback) { const VectorSlotPair& feedback) {
const Operator* op = const Operator* op =
javascript()->StoreGlobal(language_mode(), name, feedback); javascript()->StoreGlobal(language_mode(), name, feedback);
Node* node = NewNode(op, value, GetFunctionClosure()); Node* node = NewNode(op, value);
return node; return node;
} }
......
...@@ -743,7 +743,7 @@ Node* BytecodeGraphBuilder::BuildLoadGlobal(Handle<Name> name, ...@@ -743,7 +743,7 @@ Node* BytecodeGraphBuilder::BuildLoadGlobal(Handle<Name> name,
DCHECK_EQ(FeedbackVectorSlotKind::LOAD_GLOBAL_IC, DCHECK_EQ(FeedbackVectorSlotKind::LOAD_GLOBAL_IC,
feedback_vector()->GetKind(feedback.slot())); feedback_vector()->GetKind(feedback.slot()));
const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode);
return NewNode(op, GetFunctionClosure()); return NewNode(op);
} }
void BytecodeGraphBuilder::VisitLdaGlobal() { void BytecodeGraphBuilder::VisitLdaGlobal() {
...@@ -775,7 +775,7 @@ void BytecodeGraphBuilder::BuildStoreGlobal(LanguageMode language_mode) { ...@@ -775,7 +775,7 @@ void BytecodeGraphBuilder::BuildStoreGlobal(LanguageMode language_mode) {
Node* value = environment()->LookupAccumulator(); Node* value = environment()->LookupAccumulator();
const Operator* op = javascript()->StoreGlobal(language_mode, name, feedback); const Operator* op = javascript()->StoreGlobal(language_mode, name, feedback);
Node* node = NewNode(op, value, GetFunctionClosure()); Node* node = NewNode(op, value);
environment()->RecordAfterState(node, Environment::kAttachFrameState); environment()->RecordAfterState(node, Environment::kAttachFrameState);
} }
...@@ -1037,7 +1037,7 @@ void BytecodeGraphBuilder::VisitLdaNamedProperty() { ...@@ -1037,7 +1037,7 @@ void BytecodeGraphBuilder::VisitLdaNamedProperty() {
CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2));
const Operator* op = javascript()->LoadNamed(name, feedback); const Operator* op = javascript()->LoadNamed(name, feedback);
Node* node = NewNode(op, object, GetFunctionClosure()); Node* node = NewNode(op, object);
environment()->BindAccumulator(node, Environment::kAttachFrameState); environment()->BindAccumulator(node, Environment::kAttachFrameState);
} }
...@@ -1050,7 +1050,7 @@ void BytecodeGraphBuilder::VisitLdaKeyedProperty() { ...@@ -1050,7 +1050,7 @@ void BytecodeGraphBuilder::VisitLdaKeyedProperty() {
CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1));
const Operator* op = javascript()->LoadProperty(feedback); const Operator* op = javascript()->LoadProperty(feedback);
Node* node = NewNode(op, object, key, GetFunctionClosure()); Node* node = NewNode(op, object, key);
environment()->BindAccumulator(node, Environment::kAttachFrameState); environment()->BindAccumulator(node, Environment::kAttachFrameState);
} }
...@@ -1065,7 +1065,7 @@ void BytecodeGraphBuilder::BuildNamedStore(LanguageMode language_mode) { ...@@ -1065,7 +1065,7 @@ void BytecodeGraphBuilder::BuildNamedStore(LanguageMode language_mode) {
CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2));
const Operator* op = javascript()->StoreNamed(language_mode, name, feedback); const Operator* op = javascript()->StoreNamed(language_mode, name, feedback);
Node* node = NewNode(op, object, value, GetFunctionClosure()); Node* node = NewNode(op, object, value);
environment()->RecordAfterState(node, Environment::kAttachFrameState); environment()->RecordAfterState(node, Environment::kAttachFrameState);
} }
...@@ -1088,7 +1088,7 @@ void BytecodeGraphBuilder::BuildKeyedStore(LanguageMode language_mode) { ...@@ -1088,7 +1088,7 @@ void BytecodeGraphBuilder::BuildKeyedStore(LanguageMode language_mode) {
CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2));
const Operator* op = javascript()->StoreProperty(language_mode, feedback); const Operator* op = javascript()->StoreProperty(language_mode, feedback);
Node* node = NewNode(op, object, key, value, GetFunctionClosure()); Node* node = NewNode(op, object, key, value);
environment()->RecordAfterState(node, Environment::kAttachFrameState); environment()->RecordAfterState(node, Environment::kAttachFrameState);
} }
......
...@@ -153,76 +153,37 @@ void JSGenericLowering::LowerJSTypeOf(Node* node) { ...@@ -153,76 +153,37 @@ void JSGenericLowering::LowerJSTypeOf(Node* node) {
void JSGenericLowering::LowerJSLoadProperty(Node* node) { void JSGenericLowering::LowerJSLoadProperty(Node* node) {
Node* closure = NodeProperties::GetValueInput(node, 2);
Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node);
CallDescriptor::Flags flags = FrameStateFlagForCall(node); CallDescriptor::Flags flags = FrameStateFlagForCall(node);
const PropertyAccess& p = PropertyAccessOf(node->op()); const PropertyAccess& p = PropertyAccessOf(node->op());
Callable callable = CodeFactory::KeyedLoadICInOptimizedCode(isolate()); Callable callable = CodeFactory::KeyedLoadICInOptimizedCode(isolate());
// Load the type feedback vector from the closure. Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
Node* literals = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), closure,
jsgraph()->IntPtrConstant(JSFunction::kLiteralsOffset - kHeapObjectTag),
effect, control);
Node* vector = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), literals,
jsgraph()->IntPtrConstant(LiteralsArray::kFeedbackVectorOffset -
kHeapObjectTag),
effect, control);
node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index())); node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index()));
node->ReplaceInput(3, vector); node->InsertInput(zone(), 3, vector);
node->ReplaceInput(6, effect);
ReplaceWithStubCall(node, callable, flags); ReplaceWithStubCall(node, callable, flags);
} }
void JSGenericLowering::LowerJSLoadNamed(Node* node) { void JSGenericLowering::LowerJSLoadNamed(Node* node) {
Node* closure = NodeProperties::GetValueInput(node, 1);
Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node);
CallDescriptor::Flags flags = FrameStateFlagForCall(node); CallDescriptor::Flags flags = FrameStateFlagForCall(node);
NamedAccess const& p = NamedAccessOf(node->op()); NamedAccess const& p = NamedAccessOf(node->op());
Callable callable = CodeFactory::LoadICInOptimizedCode(isolate()); Callable callable = CodeFactory::LoadICInOptimizedCode(isolate());
// Load the type feedback vector from the closure. Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
Node* literals = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), closure,
jsgraph()->IntPtrConstant(JSFunction::kLiteralsOffset - kHeapObjectTag),
effect, control);
Node* vector = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), literals,
jsgraph()->IntPtrConstant(LiteralsArray::kFeedbackVectorOffset -
kHeapObjectTag),
effect, control);
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->ReplaceInput(3, vector); node->InsertInput(zone(), 3, vector);
node->ReplaceInput(6, effect);
ReplaceWithStubCall(node, callable, flags); ReplaceWithStubCall(node, callable, flags);
} }
void JSGenericLowering::LowerJSLoadGlobal(Node* node) { void JSGenericLowering::LowerJSLoadGlobal(Node* node) {
Node* closure = NodeProperties::GetValueInput(node, 0);
Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node);
CallDescriptor::Flags flags = FrameStateFlagForCall(node); CallDescriptor::Flags flags = FrameStateFlagForCall(node);
const LoadGlobalParameters& p = LoadGlobalParametersOf(node->op()); const LoadGlobalParameters& p = LoadGlobalParametersOf(node->op());
Callable callable = Callable callable =
CodeFactory::LoadGlobalICInOptimizedCode(isolate(), p.typeof_mode()); CodeFactory::LoadGlobalICInOptimizedCode(isolate(), p.typeof_mode());
// Load the type feedback vector from the closure. Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
Node* literals = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), closure,
jsgraph()->IntPtrConstant(JSFunction::kLiteralsOffset - kHeapObjectTag),
effect, control);
Node* vector = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), literals,
jsgraph()->IntPtrConstant(LiteralsArray::kFeedbackVectorOffset -
kHeapObjectTag),
effect, control);
node->InsertInput(zone(), 0, jsgraph()->HeapConstant(p.name())); node->InsertInput(zone(), 0, jsgraph()->HeapConstant(p.name()));
node->InsertInput(zone(), 1, jsgraph()->SmiConstant(p.feedback().index())); node->InsertInput(zone(), 1, jsgraph()->SmiConstant(p.feedback().index()));
node->ReplaceInput(2, vector); node->InsertInput(zone(), 2, vector);
node->ReplaceInput(5, effect);
ReplaceWithStubCall(node, callable, flags); ReplaceWithStubCall(node, callable, flags);
} }
...@@ -231,33 +192,20 @@ void JSGenericLowering::LowerJSStoreProperty(Node* node) { ...@@ -231,33 +192,20 @@ void JSGenericLowering::LowerJSStoreProperty(Node* node) {
Node* receiver = NodeProperties::GetValueInput(node, 0); Node* receiver = NodeProperties::GetValueInput(node, 0);
Node* key = NodeProperties::GetValueInput(node, 1); Node* key = NodeProperties::GetValueInput(node, 1);
Node* value = NodeProperties::GetValueInput(node, 2); Node* value = NodeProperties::GetValueInput(node, 2);
Node* closure = NodeProperties::GetValueInput(node, 3);
Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node);
CallDescriptor::Flags flags = FrameStateFlagForCall(node); CallDescriptor::Flags flags = FrameStateFlagForCall(node);
PropertyAccess const& p = PropertyAccessOf(node->op()); PropertyAccess const& p = PropertyAccessOf(node->op());
LanguageMode language_mode = p.language_mode(); LanguageMode language_mode = p.language_mode();
Callable callable = Callable callable =
CodeFactory::KeyedStoreICInOptimizedCode(isolate(), language_mode); CodeFactory::KeyedStoreICInOptimizedCode(isolate(), language_mode);
// Load the type feedback vector from the closure. Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
Node* literals = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), closure,
jsgraph()->IntPtrConstant(JSFunction::kLiteralsOffset - kHeapObjectTag),
effect, control);
Node* vector = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), literals,
jsgraph()->IntPtrConstant(LiteralsArray::kFeedbackVectorOffset -
kHeapObjectTag),
effect, control);
typedef StoreWithVectorDescriptor Descriptor; typedef StoreWithVectorDescriptor Descriptor;
node->InsertInputs(zone(), 0, 1); node->InsertInputs(zone(), 0, 2);
node->ReplaceInput(Descriptor::kReceiver, receiver); node->ReplaceInput(Descriptor::kReceiver, receiver);
node->ReplaceInput(Descriptor::kName, key); node->ReplaceInput(Descriptor::kName, key);
node->ReplaceInput(Descriptor::kValue, value); node->ReplaceInput(Descriptor::kValue, value);
node->ReplaceInput(Descriptor::kSlot, node->ReplaceInput(Descriptor::kSlot,
jsgraph()->SmiConstant(p.feedback().index())); jsgraph()->SmiConstant(p.feedback().index()));
node->ReplaceInput(Descriptor::kVector, vector); node->ReplaceInput(Descriptor::kVector, vector);
node->ReplaceInput(7, effect);
ReplaceWithStubCall(node, callable, flags); ReplaceWithStubCall(node, callable, flags);
} }
...@@ -265,39 +213,25 @@ void JSGenericLowering::LowerJSStoreProperty(Node* node) { ...@@ -265,39 +213,25 @@ void JSGenericLowering::LowerJSStoreProperty(Node* node) {
void JSGenericLowering::LowerJSStoreNamed(Node* node) { void JSGenericLowering::LowerJSStoreNamed(Node* node) {
Node* receiver = NodeProperties::GetValueInput(node, 0); Node* receiver = NodeProperties::GetValueInput(node, 0);
Node* value = NodeProperties::GetValueInput(node, 1); Node* value = NodeProperties::GetValueInput(node, 1);
Node* closure = NodeProperties::GetValueInput(node, 2);
Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node);
CallDescriptor::Flags flags = FrameStateFlagForCall(node); CallDescriptor::Flags flags = FrameStateFlagForCall(node);
NamedAccess const& p = NamedAccessOf(node->op()); NamedAccess const& p = NamedAccessOf(node->op());
Callable callable = Callable callable =
CodeFactory::StoreICInOptimizedCode(isolate(), p.language_mode()); CodeFactory::StoreICInOptimizedCode(isolate(), p.language_mode());
// Load the type feedback vector from the closure. Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
Node* literals = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), closure,
jsgraph()->IntPtrConstant(JSFunction::kLiteralsOffset - kHeapObjectTag),
effect, control);
Node* vector = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), literals,
jsgraph()->IntPtrConstant(LiteralsArray::kFeedbackVectorOffset -
kHeapObjectTag),
effect, control);
typedef StoreWithVectorDescriptor Descriptor; typedef StoreWithVectorDescriptor Descriptor;
node->InsertInputs(zone(), 0, 2); node->InsertInputs(zone(), 0, 3);
node->ReplaceInput(Descriptor::kReceiver, receiver); node->ReplaceInput(Descriptor::kReceiver, receiver);
node->ReplaceInput(Descriptor::kName, jsgraph()->HeapConstant(p.name())); node->ReplaceInput(Descriptor::kName, jsgraph()->HeapConstant(p.name()));
node->ReplaceInput(Descriptor::kValue, value); node->ReplaceInput(Descriptor::kValue, value);
node->ReplaceInput(Descriptor::kSlot, node->ReplaceInput(Descriptor::kSlot,
jsgraph()->SmiConstant(p.feedback().index())); jsgraph()->SmiConstant(p.feedback().index()));
node->ReplaceInput(Descriptor::kVector, vector); node->ReplaceInput(Descriptor::kVector, vector);
node->ReplaceInput(7, effect);
ReplaceWithStubCall(node, callable, flags); ReplaceWithStubCall(node, callable, flags);
} }
void JSGenericLowering::LowerJSStoreGlobal(Node* node) { void JSGenericLowering::LowerJSStoreGlobal(Node* node) {
Node* value = NodeProperties::GetValueInput(node, 0); Node* value = NodeProperties::GetValueInput(node, 0);
Node* closure = NodeProperties::GetValueInput(node, 1);
Node* context = NodeProperties::GetContextInput(node); Node* context = NodeProperties::GetContextInput(node);
Node* effect = NodeProperties::GetEffectInput(node); Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node); Node* control = NodeProperties::GetControlInput(node);
...@@ -305,16 +239,7 @@ void JSGenericLowering::LowerJSStoreGlobal(Node* node) { ...@@ -305,16 +239,7 @@ void JSGenericLowering::LowerJSStoreGlobal(Node* node) {
const StoreGlobalParameters& p = StoreGlobalParametersOf(node->op()); const StoreGlobalParameters& p = StoreGlobalParametersOf(node->op());
Callable callable = Callable callable =
CodeFactory::StoreICInOptimizedCode(isolate(), p.language_mode()); CodeFactory::StoreICInOptimizedCode(isolate(), p.language_mode());
// Load the type feedback vector from the closure. Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
Node* literals = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), closure,
jsgraph()->IntPtrConstant(JSFunction::kLiteralsOffset - kHeapObjectTag),
effect, control);
Node* vector = effect = graph()->NewNode(
machine()->Load(MachineType::AnyTagged()), literals,
jsgraph()->IntPtrConstant(LiteralsArray::kFeedbackVectorOffset -
kHeapObjectTag),
effect, control);
// Load global object from the context. // Load global object from the context.
Node* native_context = effect = Node* native_context = effect =
graph()->NewNode(machine()->Load(MachineType::AnyTagged()), context, graph()->NewNode(machine()->Load(MachineType::AnyTagged()), context,
...@@ -326,7 +251,7 @@ void JSGenericLowering::LowerJSStoreGlobal(Node* node) { ...@@ -326,7 +251,7 @@ void JSGenericLowering::LowerJSStoreGlobal(Node* node) {
jsgraph()->IntPtrConstant(Context::SlotOffset(Context::EXTENSION_INDEX)), jsgraph()->IntPtrConstant(Context::SlotOffset(Context::EXTENSION_INDEX)),
effect, control); effect, control);
typedef StoreWithVectorDescriptor Descriptor; typedef StoreWithVectorDescriptor Descriptor;
node->InsertInputs(zone(), 0, 3); node->InsertInputs(zone(), 0, 4);
node->ReplaceInput(Descriptor::kReceiver, global); node->ReplaceInput(Descriptor::kReceiver, global);
node->ReplaceInput(Descriptor::kName, jsgraph()->HeapConstant(p.name())); node->ReplaceInput(Descriptor::kName, jsgraph()->HeapConstant(p.name()));
node->ReplaceInput(Descriptor::kValue, value); node->ReplaceInput(Descriptor::kValue, value);
......
...@@ -663,7 +663,7 @@ const Operator* JSOperatorBuilder::LoadNamed(Handle<Name> name, ...@@ -663,7 +663,7 @@ const Operator* JSOperatorBuilder::LoadNamed(Handle<Name> name,
return new (zone()) Operator1<NamedAccess>( // -- return new (zone()) Operator1<NamedAccess>( // --
IrOpcode::kJSLoadNamed, Operator::kNoProperties, // opcode IrOpcode::kJSLoadNamed, Operator::kNoProperties, // opcode
"JSLoadNamed", // name "JSLoadNamed", // name
2, 1, 1, 1, 1, 2, // counts 1, 1, 1, 1, 1, 2, // counts
access); // parameter access); // parameter
} }
...@@ -673,7 +673,7 @@ const Operator* JSOperatorBuilder::LoadProperty( ...@@ -673,7 +673,7 @@ const Operator* JSOperatorBuilder::LoadProperty(
return new (zone()) Operator1<PropertyAccess>( // -- return new (zone()) Operator1<PropertyAccess>( // --
IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode
"JSLoadProperty", // name "JSLoadProperty", // name
3, 1, 1, 1, 1, 2, // counts 2, 1, 1, 1, 1, 2, // counts
access); // parameter access); // parameter
} }
...@@ -700,7 +700,7 @@ const Operator* JSOperatorBuilder::StoreNamed(LanguageMode language_mode, ...@@ -700,7 +700,7 @@ const Operator* JSOperatorBuilder::StoreNamed(LanguageMode language_mode,
return new (zone()) Operator1<NamedAccess>( // -- return new (zone()) Operator1<NamedAccess>( // --
IrOpcode::kJSStoreNamed, Operator::kNoProperties, // opcode IrOpcode::kJSStoreNamed, Operator::kNoProperties, // opcode
"JSStoreNamed", // name "JSStoreNamed", // name
3, 1, 1, 0, 1, 2, // counts 2, 1, 1, 0, 1, 2, // counts
access); // parameter access); // parameter
} }
...@@ -711,7 +711,7 @@ const Operator* JSOperatorBuilder::StoreProperty( ...@@ -711,7 +711,7 @@ const Operator* JSOperatorBuilder::StoreProperty(
return new (zone()) Operator1<PropertyAccess>( // -- return new (zone()) Operator1<PropertyAccess>( // --
IrOpcode::kJSStoreProperty, Operator::kNoProperties, // opcode IrOpcode::kJSStoreProperty, Operator::kNoProperties, // opcode
"JSStoreProperty", // name "JSStoreProperty", // name
4, 1, 1, 0, 1, 2, // counts 3, 1, 1, 0, 1, 2, // counts
access); // parameter access); // parameter
} }
...@@ -732,7 +732,7 @@ const Operator* JSOperatorBuilder::LoadGlobal(const Handle<Name>& name, ...@@ -732,7 +732,7 @@ const Operator* JSOperatorBuilder::LoadGlobal(const Handle<Name>& name,
return new (zone()) Operator1<LoadGlobalParameters>( // -- return new (zone()) Operator1<LoadGlobalParameters>( // --
IrOpcode::kJSLoadGlobal, Operator::kNoProperties, // opcode IrOpcode::kJSLoadGlobal, Operator::kNoProperties, // opcode
"JSLoadGlobal", // name "JSLoadGlobal", // name
1, 1, 1, 1, 1, 2, // counts 0, 1, 1, 1, 1, 2, // counts
parameters); // parameter parameters); // parameter
} }
...@@ -744,7 +744,7 @@ const Operator* JSOperatorBuilder::StoreGlobal(LanguageMode language_mode, ...@@ -744,7 +744,7 @@ const Operator* JSOperatorBuilder::StoreGlobal(LanguageMode language_mode,
return new (zone()) Operator1<StoreGlobalParameters>( // -- return new (zone()) Operator1<StoreGlobalParameters>( // --
IrOpcode::kJSStoreGlobal, Operator::kNoProperties, // opcode IrOpcode::kJSStoreGlobal, Operator::kNoProperties, // opcode
"JSStoreGlobal", // name "JSStoreGlobal", // name
2, 1, 1, 0, 1, 2, // counts 1, 1, 1, 0, 1, 2, // counts
parameters); // parameter parameters); // parameter
} }
......
...@@ -14,11 +14,12 @@ ...@@ -14,11 +14,12 @@
#include "src/compiler/all-nodes.h" #include "src/compiler/all-nodes.h"
#include "src/compiler/common-operator.h" #include "src/compiler/common-operator.h"
#include "src/compiler/graph.h" #include "src/compiler/graph.h"
#include "src/compiler/node.h" #include "src/compiler/js-operator.h"
#include "src/compiler/node-properties.h" #include "src/compiler/node-properties.h"
#include "src/compiler/node.h"
#include "src/compiler/opcodes.h" #include "src/compiler/opcodes.h"
#include "src/compiler/operator.h"
#include "src/compiler/operator-properties.h" #include "src/compiler/operator-properties.h"
#include "src/compiler/operator.h"
#include "src/compiler/schedule.h" #include "src/compiler/schedule.h"
#include "src/compiler/simplified-operator.h" #include "src/compiler/simplified-operator.h"
#include "src/ostreams.h" #include "src/ostreams.h"
...@@ -590,14 +591,35 @@ void Verifier::Visitor::Check(Node* node) { ...@@ -590,14 +591,35 @@ void Verifier::Visitor::Check(Node* node) {
CheckTypeIs(node, Type::OtherObject()); CheckTypeIs(node, Type::OtherObject());
break; break;
case IrOpcode::kJSLoadProperty: case IrOpcode::kJSLoadProperty:
// Type can be anything.
CheckTypeIs(node, Type::Any());
CHECK(PropertyAccessOf(node->op()).feedback().IsValid());
break;
case IrOpcode::kJSLoadNamed: case IrOpcode::kJSLoadNamed:
// Type can be anything.
CheckTypeIs(node, Type::Any());
CHECK(NamedAccessOf(node->op()).feedback().IsValid());
break;
case IrOpcode::kJSLoadGlobal: case IrOpcode::kJSLoadGlobal:
// Type can be anything. // Type can be anything.
CheckTypeIs(node, Type::Any()); CheckTypeIs(node, Type::Any());
CHECK(LoadGlobalParametersOf(node->op()).feedback().IsValid());
break; break;
case IrOpcode::kJSStoreProperty: case IrOpcode::kJSStoreProperty:
// Type is empty.
CheckNotTyped(node);
CHECK(PropertyAccessOf(node->op()).feedback().IsValid());
break;
case IrOpcode::kJSStoreNamed: case IrOpcode::kJSStoreNamed:
// Type is empty.
CheckNotTyped(node);
CHECK(NamedAccessOf(node->op()).feedback().IsValid());
break;
case IrOpcode::kJSStoreGlobal: case IrOpcode::kJSStoreGlobal:
// Type is empty.
CheckNotTyped(node);
CHECK(StoreGlobalParametersOf(node->op()).feedback().IsValid());
break;
case IrOpcode::kJSStoreDataPropertyInLiteral: case IrOpcode::kJSStoreDataPropertyInLiteral:
// Type is empty. // Type is empty.
CheckNotTyped(node); CheckNotTyped(node);
......
...@@ -580,13 +580,12 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArray) { ...@@ -580,13 +580,12 @@ 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 =
base, key, vector, context, Reduce(graph()->NewNode(javascript()->LoadProperty(feedback), base, key,
EmptyFrameState(), effect, control)); context, EmptyFrameState(), effect, control));
Matcher<Node*> offset_matcher = Matcher<Node*> offset_matcher =
element_size == 1 element_size == 1
...@@ -622,13 +621,12 @@ TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArrayWithSafeKey) { ...@@ -622,13 +621,12 @@ 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 =
base, key, vector, context, Reduce(graph()->NewNode(javascript()->LoadProperty(feedback), base, key,
EmptyFrameState(), effect, control)); context, EmptyFrameState(), effect, control));
ASSERT_TRUE(r.Changed()); ASSERT_TRUE(r.Changed());
EXPECT_THAT( EXPECT_THAT(
...@@ -660,13 +658,12 @@ TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArray) { ...@@ -660,13 +658,12 @@ TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArray) {
Node* base = HeapConstant(array); Node* base = HeapConstant(array);
Node* value = Node* value =
Parameter(AccessBuilder::ForTypedArrayElement(type, true).type); Parameter(AccessBuilder::ForTypedArrayElement(type, true).type);
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();
VectorSlotPair feedback; VectorSlotPair feedback;
const Operator* op = javascript()->StoreProperty(language_mode, feedback); const Operator* op = javascript()->StoreProperty(language_mode, feedback);
Node* node = graph()->NewNode(op, base, key, value, vector, context, Node* node = graph()->NewNode(op, base, key, value, context,
EmptyFrameState(), effect, control); EmptyFrameState(), effect, control);
Reduction r = Reduce(node); Reduction r = Reduce(node);
...@@ -704,7 +701,6 @@ TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithConversion) { ...@@ -704,7 +701,6 @@ TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithConversion) {
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* value = Parameter(Type::Any()); Node* value = Parameter(Type::Any());
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();
...@@ -714,7 +710,7 @@ TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithConversion) { ...@@ -714,7 +710,7 @@ TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithConversion) {
EmptyFrameState(), effect, control); EmptyFrameState(), effect, control);
VectorSlotPair feedback; VectorSlotPair feedback;
const Operator* op = javascript()->StoreProperty(language_mode, feedback); const Operator* op = javascript()->StoreProperty(language_mode, feedback);
Node* node = graph()->NewNode(op, base, key, value, vector, context, Node* node = graph()->NewNode(op, base, key, value, context,
EmptyFrameState(), checkpoint, control); EmptyFrameState(), checkpoint, control);
Reduction r = Reduce(node); Reduction r = Reduce(node);
...@@ -759,13 +755,12 @@ TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithSafeKey) { ...@@ -759,13 +755,12 @@ TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithSafeKey) {
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* value = Parameter(access.type); Node* value = Parameter(access.type);
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();
VectorSlotPair feedback; VectorSlotPair feedback;
const Operator* op = javascript()->StoreProperty(language_mode, feedback); const Operator* op = javascript()->StoreProperty(language_mode, feedback);
Node* node = graph()->NewNode(op, base, key, value, vector, context, Node* node = graph()->NewNode(op, base, key, value, context,
EmptyFrameState(), effect, control); EmptyFrameState(), effect, control);
Reduction r = Reduce(node); Reduction r = Reduce(node);
...@@ -788,13 +783,12 @@ TEST_F(JSTypedLoweringTest, JSLoadNamedStringLength) { ...@@ -788,13 +783,12 @@ TEST_F(JSTypedLoweringTest, JSLoadNamedStringLength) {
VectorSlotPair feedback; VectorSlotPair feedback;
Handle<Name> name = factory()->length_string(); Handle<Name> name = factory()->length_string();
Node* const receiver = Parameter(Type::String(), 0); Node* const receiver = Parameter(Type::String(), 0);
Node* const vector = Parameter(Type::Internal(), 1);
Node* const context = UndefinedConstant(); Node* const context = UndefinedConstant();
Node* const effect = graph()->start(); Node* const effect = graph()->start();
Node* const control = graph()->start(); Node* const control = graph()->start();
Reduction const r = Reduce( Reduction const r =
graph()->NewNode(javascript()->LoadNamed(name, feedback), receiver, Reduce(graph()->NewNode(javascript()->LoadNamed(name, feedback), receiver,
vector, context, EmptyFrameState(), effect, control)); context, EmptyFrameState(), effect, control));
ASSERT_TRUE(r.Changed()); ASSERT_TRUE(r.Changed());
EXPECT_THAT(r.replacement(), IsLoadField(AccessBuilder::ForStringLength(), EXPECT_THAT(r.replacement(), IsLoadField(AccessBuilder::ForStringLength(),
receiver, effect, control)); receiver, effect, control));
......
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