| Index: src/compiler/escape-analysis.cc
|
| diff --git a/src/compiler/escape-analysis.cc b/src/compiler/escape-analysis.cc
|
| index 670770055e3ece533416e25e5d76ae4aea2a6fa8..540699701224a72022f4d15bafd4a241d2a373d7 100644
|
| --- a/src/compiler/escape-analysis.cc
|
| +++ b/src/compiler/escape-analysis.cc
|
| @@ -1327,11 +1327,24 @@ bool EscapeAnalysis::CompareVirtualObjects(Node* left, Node* right) {
|
| return false;
|
| }
|
|
|
| -int EscapeAnalysis::OffsetFromAccess(Node* node) {
|
| - DCHECK(OpParameter<FieldAccess>(node).offset % kPointerSize == 0);
|
| - return OpParameter<FieldAccess>(node).offset / kPointerSize;
|
| +namespace {
|
| +
|
| +int OffsetForFieldAccess(Node* node) {
|
| + FieldAccess access = FieldAccessOf(node->op());
|
| + DCHECK_EQ(access.offset % kPointerSize, 0);
|
| + return access.offset / kPointerSize;
|
| +}
|
| +
|
| +int OffsetForElementAccess(Node* node, int index) {
|
| + ElementAccess access = ElementAccessOf(node->op());
|
| + DCHECK_GE(ElementSizeLog2Of(access.machine_type.representation()),
|
| + kPointerSizeLog2);
|
| + DCHECK_EQ(access.header_size % kPointerSize, 0);
|
| + return access.header_size / kPointerSize + index;
|
| }
|
|
|
| +} // namespace
|
| +
|
| void EscapeAnalysis::ProcessLoadFromPhi(int offset, Node* from, Node* load,
|
| VirtualState* state) {
|
| TRACE("Load #%d from phi #%d", load->id(), from->id());
|
| @@ -1374,7 +1387,7 @@ void EscapeAnalysis::ProcessLoadField(Node* node) {
|
| Node* from = ResolveReplacement(NodeProperties::GetValueInput(node, 0));
|
| VirtualState* state = virtual_states_[node->id()];
|
| if (VirtualObject* object = GetVirtualObject(state, from)) {
|
| - int offset = OffsetFromAccess(node);
|
| + int offset = OffsetForFieldAccess(node);
|
| if (!object->IsTracked() ||
|
| static_cast<size_t>(offset) >= object->field_count()) {
|
| return;
|
| @@ -1386,8 +1399,8 @@ void EscapeAnalysis::ProcessLoadField(Node* node) {
|
| // Record that the load has this alias.
|
| UpdateReplacement(state, node, value);
|
| } else if (from->opcode() == IrOpcode::kPhi &&
|
| - OpParameter<FieldAccess>(node).offset % kPointerSize == 0) {
|
| - int offset = OffsetFromAccess(node);
|
| + FieldAccessOf(node->op()).offset % kPointerSize == 0) {
|
| + int offset = OffsetForFieldAccess(node);
|
| // Only binary phis are supported for now.
|
| ProcessLoadFromPhi(offset, from, node, state);
|
| } else {
|
| @@ -1406,19 +1419,13 @@ void EscapeAnalysis::ProcessLoadElement(Node* node) {
|
| index_node->opcode() != IrOpcode::kInt64Constant &&
|
| index_node->opcode() != IrOpcode::kFloat32Constant &&
|
| index_node->opcode() != IrOpcode::kFloat64Constant);
|
| - ElementAccess access = OpParameter<ElementAccess>(node);
|
| if (index.HasValue()) {
|
| - int offset = index.Value() + access.header_size / kPointerSize;
|
| if (VirtualObject* object = GetVirtualObject(state, from)) {
|
| - CHECK_GE(ElementSizeLog2Of(access.machine_type.representation()),
|
| - kPointerSizeLog2);
|
| - CHECK_EQ(access.header_size % kPointerSize, 0);
|
| -
|
| + int offset = OffsetForElementAccess(node, index.Value());
|
| if (!object->IsTracked() ||
|
| static_cast<size_t>(offset) >= object->field_count()) {
|
| return;
|
| }
|
| -
|
| Node* value = object->GetField(offset);
|
| if (value) {
|
| value = ResolveReplacement(value);
|
| @@ -1426,8 +1433,7 @@ void EscapeAnalysis::ProcessLoadElement(Node* node) {
|
| // Record that the load has this alias.
|
| UpdateReplacement(state, node, value);
|
| } else if (from->opcode() == IrOpcode::kPhi) {
|
| - ElementAccess access = OpParameter<ElementAccess>(node);
|
| - int offset = index.Value() + access.header_size / kPointerSize;
|
| + int offset = OffsetForElementAccess(node, index.Value());
|
| ProcessLoadFromPhi(offset, from, node, state);
|
| } else {
|
| UpdateReplacement(state, node, nullptr);
|
| @@ -1450,7 +1456,7 @@ void EscapeAnalysis::ProcessStoreField(Node* node) {
|
| Node* to = ResolveReplacement(NodeProperties::GetValueInput(node, 0));
|
| VirtualState* state = virtual_states_[node->id()];
|
| VirtualObject* obj = GetVirtualObject(state, to);
|
| - int offset = OffsetFromAccess(node);
|
| + int offset = OffsetForFieldAccess(node);
|
| if (obj && obj->IsTracked() &&
|
| static_cast<size_t>(offset) < obj->field_count()) {
|
| Node* val = ResolveReplacement(NodeProperties::GetValueInput(node, 1));
|
| @@ -1471,16 +1477,12 @@ void EscapeAnalysis::ProcessStoreElement(Node* node) {
|
| index_node->opcode() != IrOpcode::kInt64Constant &&
|
| index_node->opcode() != IrOpcode::kFloat32Constant &&
|
| index_node->opcode() != IrOpcode::kFloat64Constant);
|
| - ElementAccess access = OpParameter<ElementAccess>(node);
|
| VirtualState* state = virtual_states_[node->id()];
|
| VirtualObject* obj = GetVirtualObject(state, to);
|
| if (index.HasValue()) {
|
| - int offset = index.Value() + access.header_size / kPointerSize;
|
| + int offset = OffsetForElementAccess(node, index.Value());
|
| if (obj && obj->IsTracked() &&
|
| static_cast<size_t>(offset) < obj->field_count()) {
|
| - CHECK_GE(ElementSizeLog2Of(access.machine_type.representation()),
|
| - kPointerSizeLog2);
|
| - CHECK_EQ(access.header_size % kPointerSize, 0);
|
| Node* val = ResolveReplacement(NodeProperties::GetValueInput(node, 2));
|
| if (obj->GetField(offset) != val) {
|
| obj = CopyForModificationAt(obj, state, node);
|
|
|