[turbofan] Lower JSLoadMessage/JSStoreMessage earlier.
Lower JSLoadMessage and JSStoreMessage in JSTypedLowering to allow for optimizations across try-catch, try-finally, for-of, destructuring, etc. BUG=v8:5448 R=jarin@chromium.org Review-Url: https://codereview.chromium.org/2641843002 Cr-Commit-Position: refs/heads/master@{#42453}
This commit is contained in:
parent
b86ef5ce8a
commit
2af52484cd
@ -24,6 +24,15 @@ FieldAccess AccessBuilder::ForExternalDoubleValue() {
|
||||
return access;
|
||||
}
|
||||
|
||||
// static
|
||||
FieldAccess AccessBuilder::ForExternalTaggedValue() {
|
||||
FieldAccess access = {kUntaggedBase, 0,
|
||||
MaybeHandle<Name>(), MaybeHandle<Map>(),
|
||||
Type::Any(), MachineType::AnyTagged(),
|
||||
kNoWriteBarrier};
|
||||
return access;
|
||||
}
|
||||
|
||||
// static
|
||||
FieldAccess AccessBuilder::ForExternalUint8Value() {
|
||||
FieldAccess access = {kUntaggedBase, 0,
|
||||
|
@ -26,6 +26,9 @@ class V8_EXPORT_PRIVATE AccessBuilder final
|
||||
// Provides access to a double field identified by an external reference.
|
||||
static FieldAccess ForExternalDoubleValue();
|
||||
|
||||
// Provides access to a tagged field identified by an external reference.
|
||||
static FieldAccess ForExternalTaggedValue();
|
||||
|
||||
// Provides access to an uint8 field identified by an external reference.
|
||||
static FieldAccess ForExternalUint8Value();
|
||||
|
||||
|
@ -559,24 +559,12 @@ void JSGenericLowering::LowerJSForInPrepare(Node* node) {
|
||||
}
|
||||
|
||||
void JSGenericLowering::LowerJSLoadMessage(Node* node) {
|
||||
ExternalReference message_address =
|
||||
ExternalReference::address_of_pending_message_obj(isolate());
|
||||
node->RemoveInput(NodeProperties::FirstContextIndex(node));
|
||||
node->InsertInput(zone(), 0, jsgraph()->ExternalConstant(message_address));
|
||||
node->InsertInput(zone(), 1, jsgraph()->IntPtrConstant(0));
|
||||
NodeProperties::ChangeOp(node, machine()->Load(MachineType::AnyTagged()));
|
||||
UNREACHABLE(); // Eliminated in typed lowering.
|
||||
}
|
||||
|
||||
|
||||
void JSGenericLowering::LowerJSStoreMessage(Node* node) {
|
||||
ExternalReference message_address =
|
||||
ExternalReference::address_of_pending_message_obj(isolate());
|
||||
node->RemoveInput(NodeProperties::FirstContextIndex(node));
|
||||
node->InsertInput(zone(), 0, jsgraph()->ExternalConstant(message_address));
|
||||
node->InsertInput(zone(), 1, jsgraph()->IntPtrConstant(0));
|
||||
StoreRepresentation representation(MachineRepresentation::kTagged,
|
||||
kNoWriteBarrier);
|
||||
NodeProperties::ChangeOp(node, machine()->Store(representation));
|
||||
UNREACHABLE(); // Eliminated in typed lowering.
|
||||
}
|
||||
|
||||
void JSGenericLowering::LowerJSLoadModule(Node* node) {
|
||||
|
@ -517,26 +517,26 @@ CompareOperationHint CompareOperationHintOf(const Operator* op) {
|
||||
return OpParameter<CompareOperationHint>(op);
|
||||
}
|
||||
|
||||
#define CACHED_OP_LIST(V) \
|
||||
V(ToInteger, Operator::kNoProperties, 1, 1) \
|
||||
V(ToLength, Operator::kNoProperties, 1, 1) \
|
||||
V(ToName, Operator::kNoProperties, 1, 1) \
|
||||
V(ToNumber, Operator::kNoProperties, 1, 1) \
|
||||
V(ToObject, Operator::kFoldable, 1, 1) \
|
||||
V(ToString, Operator::kNoProperties, 1, 1) \
|
||||
V(Create, Operator::kEliminatable, 2, 1) \
|
||||
V(CreateIterResultObject, Operator::kEliminatable, 2, 1) \
|
||||
V(CreateKeyValueArray, Operator::kEliminatable, 2, 1) \
|
||||
V(HasProperty, Operator::kNoProperties, 2, 1) \
|
||||
V(TypeOf, Operator::kPure, 1, 1) \
|
||||
V(InstanceOf, Operator::kNoProperties, 2, 1) \
|
||||
V(OrdinaryHasInstance, Operator::kNoProperties, 2, 1) \
|
||||
V(ForInNext, Operator::kNoProperties, 4, 1) \
|
||||
V(ForInPrepare, Operator::kNoProperties, 1, 3) \
|
||||
V(LoadMessage, Operator::kNoThrow, 0, 1) \
|
||||
V(StoreMessage, Operator::kNoThrow, 1, 0) \
|
||||
V(GeneratorRestoreContinuation, Operator::kNoThrow, 1, 1) \
|
||||
V(StackCheck, Operator::kNoWrite, 0, 0) \
|
||||
#define CACHED_OP_LIST(V) \
|
||||
V(ToInteger, Operator::kNoProperties, 1, 1) \
|
||||
V(ToLength, Operator::kNoProperties, 1, 1) \
|
||||
V(ToName, Operator::kNoProperties, 1, 1) \
|
||||
V(ToNumber, Operator::kNoProperties, 1, 1) \
|
||||
V(ToObject, Operator::kFoldable, 1, 1) \
|
||||
V(ToString, Operator::kNoProperties, 1, 1) \
|
||||
V(Create, Operator::kEliminatable, 2, 1) \
|
||||
V(CreateIterResultObject, Operator::kEliminatable, 2, 1) \
|
||||
V(CreateKeyValueArray, Operator::kEliminatable, 2, 1) \
|
||||
V(HasProperty, Operator::kNoProperties, 2, 1) \
|
||||
V(TypeOf, Operator::kPure, 1, 1) \
|
||||
V(InstanceOf, Operator::kNoProperties, 2, 1) \
|
||||
V(OrdinaryHasInstance, Operator::kNoProperties, 2, 1) \
|
||||
V(ForInNext, Operator::kNoProperties, 4, 1) \
|
||||
V(ForInPrepare, Operator::kNoProperties, 1, 3) \
|
||||
V(LoadMessage, Operator::kNoThrow | Operator::kNoWrite, 0, 1) \
|
||||
V(StoreMessage, Operator::kNoRead | Operator::kNoThrow, 1, 0) \
|
||||
V(GeneratorRestoreContinuation, Operator::kNoThrow, 1, 1) \
|
||||
V(StackCheck, Operator::kNoWrite, 0, 0) \
|
||||
V(GetSuperConstructor, Operator::kNoWrite, 1, 1)
|
||||
|
||||
#define BINARY_OP_LIST(V) \
|
||||
|
@ -2200,6 +2200,28 @@ Reduction JSTypedLowering::ReduceJSForInNext(Node* node) {
|
||||
return Changed(node);
|
||||
}
|
||||
|
||||
Reduction JSTypedLowering::ReduceJSLoadMessage(Node* node) {
|
||||
DCHECK_EQ(IrOpcode::kJSLoadMessage, node->opcode());
|
||||
ExternalReference const ref =
|
||||
ExternalReference::address_of_pending_message_obj(isolate());
|
||||
node->ReplaceInput(0, jsgraph()->ExternalConstant(ref));
|
||||
NodeProperties::ChangeOp(
|
||||
node, simplified()->LoadField(AccessBuilder::ForExternalTaggedValue()));
|
||||
return Changed(node);
|
||||
}
|
||||
|
||||
Reduction JSTypedLowering::ReduceJSStoreMessage(Node* node) {
|
||||
DCHECK_EQ(IrOpcode::kJSStoreMessage, node->opcode());
|
||||
ExternalReference const ref =
|
||||
ExternalReference::address_of_pending_message_obj(isolate());
|
||||
Node* value = NodeProperties::GetValueInput(node, 0);
|
||||
node->ReplaceInput(0, jsgraph()->ExternalConstant(ref));
|
||||
node->ReplaceInput(1, value);
|
||||
NodeProperties::ChangeOp(
|
||||
node, simplified()->StoreField(AccessBuilder::ForExternalTaggedValue()));
|
||||
return Changed(node);
|
||||
}
|
||||
|
||||
Reduction JSTypedLowering::ReduceJSGeneratorStore(Node* node) {
|
||||
DCHECK_EQ(IrOpcode::kJSGeneratorStore, node->opcode());
|
||||
Node* generator = NodeProperties::GetValueInput(node, 0);
|
||||
@ -2350,6 +2372,10 @@ Reduction JSTypedLowering::Reduce(Node* node) {
|
||||
return ReduceJSCallFunction(node);
|
||||
case IrOpcode::kJSForInNext:
|
||||
return ReduceJSForInNext(node);
|
||||
case IrOpcode::kJSLoadMessage:
|
||||
return ReduceJSLoadMessage(node);
|
||||
case IrOpcode::kJSStoreMessage:
|
||||
return ReduceJSStoreMessage(node);
|
||||
case IrOpcode::kJSGeneratorStore:
|
||||
return ReduceJSGeneratorStore(node);
|
||||
case IrOpcode::kJSGeneratorRestoreContinuation:
|
||||
|
@ -73,6 +73,8 @@ class V8_EXPORT_PRIVATE JSTypedLowering final
|
||||
Reduction ReduceJSCallConstruct(Node* node);
|
||||
Reduction ReduceJSCallFunction(Node* node);
|
||||
Reduction ReduceJSForInNext(Node* node);
|
||||
Reduction ReduceJSLoadMessage(Node* node);
|
||||
Reduction ReduceJSStoreMessage(Node* node);
|
||||
Reduction ReduceJSGeneratorStore(Node* node);
|
||||
Reduction ReduceJSGeneratorRestoreContinuation(Node* node);
|
||||
Reduction ReduceJSGeneratorRestoreRegister(Node* node);
|
||||
|
Loading…
Reference in New Issue
Block a user