| Index: src/compiler/js-generic-lowering.cc
|
| diff --git a/src/compiler/js-generic-lowering.cc b/src/compiler/js-generic-lowering.cc
|
| index 1876f1fb012f99f9240de47c184e2f7c2bd57b51..2b333c06c50b18a873e025b44a89351298c535a5 100644
|
| --- a/src/compiler/js-generic-lowering.cc
|
| +++ b/src/compiler/js-generic-lowering.cc
|
| @@ -157,107 +157,122 @@ void JSGenericLowering::LowerJSTypeOf(Node* node) {
|
| void JSGenericLowering::LowerJSLoadProperty(Node* node) {
|
| CallDescriptor::Flags flags = FrameStateFlagForCall(node);
|
| const PropertyAccess& p = PropertyAccessOf(node->op());
|
| - Callable callable = CodeFactory::KeyedLoadICInOptimizedCode(isolate());
|
| - Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + Node* frame_state = NodeProperties::GetFrameStateInput(node);
|
| + Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput);
|
| node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index()));
|
| - node->InsertInput(zone(), 3, vector);
|
| - ReplaceWithStubCall(node, callable, flags);
|
| + if (outer_state->opcode() != IrOpcode::kFrameState) {
|
| + Callable callable = CodeFactory::KeyedLoadIC(isolate());
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + } else {
|
| + Callable callable = CodeFactory::KeyedLoadICInOptimizedCode(isolate());
|
| + Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + node->InsertInput(zone(), 3, vector);
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + }
|
| }
|
|
|
|
|
| void JSGenericLowering::LowerJSLoadNamed(Node* node) {
|
| CallDescriptor::Flags flags = FrameStateFlagForCall(node);
|
| NamedAccess const& p = NamedAccessOf(node->op());
|
| - Callable callable = CodeFactory::LoadICInOptimizedCode(isolate());
|
| - Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + Node* frame_state = NodeProperties::GetFrameStateInput(node);
|
| + Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput);
|
| node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name()));
|
| node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index()));
|
| - node->InsertInput(zone(), 3, vector);
|
| - ReplaceWithStubCall(node, callable, flags);
|
| + if (outer_state->opcode() != IrOpcode::kFrameState) {
|
| + Callable callable = CodeFactory::LoadIC(isolate());
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + } else {
|
| + Callable callable = CodeFactory::LoadICInOptimizedCode(isolate());
|
| + Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + node->InsertInput(zone(), 3, vector);
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + }
|
| }
|
|
|
|
|
| void JSGenericLowering::LowerJSLoadGlobal(Node* node) {
|
| CallDescriptor::Flags flags = FrameStateFlagForCall(node);
|
| const LoadGlobalParameters& p = LoadGlobalParametersOf(node->op());
|
| - Callable callable =
|
| - CodeFactory::LoadGlobalICInOptimizedCode(isolate(), p.typeof_mode());
|
| - Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + Node* frame_state = NodeProperties::GetFrameStateInput(node);
|
| + Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput);
|
| node->InsertInput(zone(), 0, jsgraph()->HeapConstant(p.name()));
|
| node->InsertInput(zone(), 1, jsgraph()->SmiConstant(p.feedback().index()));
|
| - node->InsertInput(zone(), 2, vector);
|
| - ReplaceWithStubCall(node, callable, flags);
|
| + if (outer_state->opcode() != IrOpcode::kFrameState) {
|
| + Callable callable = CodeFactory::LoadGlobalIC(isolate(), p.typeof_mode());
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + } else {
|
| + Callable callable =
|
| + CodeFactory::LoadGlobalICInOptimizedCode(isolate(), p.typeof_mode());
|
| + Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + node->InsertInput(zone(), 2, vector);
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + }
|
| }
|
|
|
| -
|
| void JSGenericLowering::LowerJSStoreProperty(Node* node) {
|
| - Node* receiver = NodeProperties::GetValueInput(node, 0);
|
| - Node* key = NodeProperties::GetValueInput(node, 1);
|
| - Node* value = NodeProperties::GetValueInput(node, 2);
|
| CallDescriptor::Flags flags = FrameStateFlagForCall(node);
|
| PropertyAccess const& p = PropertyAccessOf(node->op());
|
| - Callable callable =
|
| - CodeFactory::KeyedStoreICInOptimizedCode(isolate(), p.language_mode());
|
| - Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| - typedef StoreWithVectorDescriptor Descriptor;
|
| - node->InsertInputs(zone(), 0, 2);
|
| - node->ReplaceInput(Descriptor::kReceiver, receiver);
|
| - node->ReplaceInput(Descriptor::kName, key);
|
| - node->ReplaceInput(Descriptor::kValue, value);
|
| - node->ReplaceInput(Descriptor::kSlot,
|
| - jsgraph()->SmiConstant(p.feedback().index()));
|
| - node->ReplaceInput(Descriptor::kVector, vector);
|
| - ReplaceWithStubCall(node, callable, flags);
|
| + Node* frame_state = NodeProperties::GetFrameStateInput(node);
|
| + Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput);
|
| + node->InsertInput(zone(), 3, jsgraph()->SmiConstant(p.feedback().index()));
|
| + if (outer_state->opcode() != IrOpcode::kFrameState) {
|
| + Callable callable = CodeFactory::KeyedStoreIC(isolate(), p.language_mode());
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + } else {
|
| + Callable callable =
|
| + CodeFactory::KeyedStoreICInOptimizedCode(isolate(), p.language_mode());
|
| + Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + node->InsertInput(zone(), 4, vector);
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + }
|
| }
|
|
|
| -
|
| void JSGenericLowering::LowerJSStoreNamed(Node* node) {
|
| - Node* receiver = NodeProperties::GetValueInput(node, 0);
|
| - Node* value = NodeProperties::GetValueInput(node, 1);
|
| CallDescriptor::Flags flags = FrameStateFlagForCall(node);
|
| NamedAccess const& p = NamedAccessOf(node->op());
|
| - Callable callable =
|
| - CodeFactory::StoreICInOptimizedCode(isolate(), p.language_mode());
|
| - Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| - typedef StoreWithVectorDescriptor Descriptor;
|
| - node->InsertInputs(zone(), 0, 3);
|
| - node->ReplaceInput(Descriptor::kReceiver, receiver);
|
| - node->ReplaceInput(Descriptor::kName, jsgraph()->HeapConstant(p.name()));
|
| - node->ReplaceInput(Descriptor::kValue, value);
|
| - node->ReplaceInput(Descriptor::kSlot,
|
| - jsgraph()->SmiConstant(p.feedback().index()));
|
| - node->ReplaceInput(Descriptor::kVector, vector);
|
| - ReplaceWithStubCall(node, callable, flags);
|
| + Node* frame_state = NodeProperties::GetFrameStateInput(node);
|
| + Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput);
|
| + node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name()));
|
| + node->InsertInput(zone(), 3, jsgraph()->SmiConstant(p.feedback().index()));
|
| + if (outer_state->opcode() != IrOpcode::kFrameState) {
|
| + Callable callable = CodeFactory::StoreIC(isolate(), p.language_mode());
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + } else {
|
| + Callable callable =
|
| + CodeFactory::StoreICInOptimizedCode(isolate(), p.language_mode());
|
| + Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + node->InsertInput(zone(), 4, vector);
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + }
|
| }
|
|
|
| void JSGenericLowering::LowerJSStoreNamedOwn(Node* node) {
|
| - Node* receiver = NodeProperties::GetValueInput(node, 0);
|
| - Node* value = NodeProperties::GetValueInput(node, 1);
|
| CallDescriptor::Flags flags = FrameStateFlagForCall(node);
|
| StoreNamedOwnParameters const& p = StoreNamedOwnParametersOf(node->op());
|
| - Callable callable = CodeFactory::StoreOwnICInOptimizedCode(isolate());
|
| - Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| - typedef StoreWithVectorDescriptor Descriptor;
|
| - node->InsertInputs(zone(), 0, 3);
|
| - node->ReplaceInput(Descriptor::kReceiver, receiver);
|
| - node->ReplaceInput(Descriptor::kName, jsgraph()->HeapConstant(p.name()));
|
| - node->ReplaceInput(Descriptor::kValue, value);
|
| - node->ReplaceInput(Descriptor::kSlot,
|
| - jsgraph()->SmiConstant(p.feedback().index()));
|
| - node->ReplaceInput(Descriptor::kVector, vector);
|
| - ReplaceWithStubCall(node, callable, flags);
|
| + Node* frame_state = NodeProperties::GetFrameStateInput(node);
|
| + Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput);
|
| + node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name()));
|
| + node->InsertInput(zone(), 3, jsgraph()->SmiConstant(p.feedback().index()));
|
| + if (outer_state->opcode() != IrOpcode::kFrameState) {
|
| + Callable callable = CodeFactory::StoreOwnIC(isolate());
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + } else {
|
| + Callable callable = CodeFactory::StoreOwnICInOptimizedCode(isolate());
|
| + Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + node->InsertInput(zone(), 4, vector);
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + }
|
| }
|
|
|
| void JSGenericLowering::LowerJSStoreGlobal(Node* node) {
|
| - Node* value = NodeProperties::GetValueInput(node, 0);
|
| + CallDescriptor::Flags flags = FrameStateFlagForCall(node);
|
| + const StoreGlobalParameters& p = StoreGlobalParametersOf(node->op());
|
| + Node* frame_state = NodeProperties::GetFrameStateInput(node);
|
| + Node* outer_state = frame_state->InputAt(kFrameStateOuterStateInput);
|
| Node* context = NodeProperties::GetContextInput(node);
|
| Node* effect = NodeProperties::GetEffectInput(node);
|
| Node* control = NodeProperties::GetControlInput(node);
|
| - CallDescriptor::Flags flags = FrameStateFlagForCall(node);
|
| - const StoreGlobalParameters& p = StoreGlobalParametersOf(node->op());
|
| - Callable callable =
|
| - CodeFactory::StoreGlobalICInOptimizedCode(isolate(), p.language_mode());
|
| - Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| // Load global object from the context.
|
| Node* native_context = effect =
|
| graph()->NewNode(machine()->Load(MachineType::AnyTagged()), context,
|
| @@ -268,16 +283,21 @@ void JSGenericLowering::LowerJSStoreGlobal(Node* node) {
|
| machine()->Load(MachineType::AnyTagged()), native_context,
|
| jsgraph()->IntPtrConstant(Context::SlotOffset(Context::EXTENSION_INDEX)),
|
| effect, control);
|
| - typedef StoreWithVectorDescriptor Descriptor;
|
| - node->InsertInputs(zone(), 0, 4);
|
| - node->ReplaceInput(Descriptor::kReceiver, global);
|
| - node->ReplaceInput(Descriptor::kName, jsgraph()->HeapConstant(p.name()));
|
| - node->ReplaceInput(Descriptor::kValue, value);
|
| - node->ReplaceInput(Descriptor::kSlot,
|
| - jsgraph()->SmiConstant(p.feedback().index()));
|
| - node->ReplaceInput(Descriptor::kVector, vector);
|
| - node->ReplaceInput(7, effect);
|
| - ReplaceWithStubCall(node, callable, flags);
|
| + NodeProperties::ReplaceEffectInput(node, effect);
|
| + node->InsertInput(zone(), 0, global);
|
| + node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name()));
|
| + node->InsertInput(zone(), 3, jsgraph()->SmiConstant(p.feedback().index()));
|
| + if (outer_state->opcode() != IrOpcode::kFrameState) {
|
| + Callable callable =
|
| + CodeFactory::StoreGlobalIC(isolate(), p.language_mode());
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + } else {
|
| + Callable callable =
|
| + CodeFactory::StoreGlobalICInOptimizedCode(isolate(), p.language_mode());
|
| + Node* vector = jsgraph()->HeapConstant(p.feedback().vector());
|
| + node->InsertInput(zone(), 4, vector);
|
| + ReplaceWithStubCall(node, callable, flags);
|
| + }
|
| }
|
|
|
| void JSGenericLowering::LowerJSStoreDataPropertyInLiteral(Node* node) {
|
|
|