| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/escape-analysis.h" | 5 #include "src/compiler/escape-analysis.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/base/flags.h" | 9 #include "src/base/flags.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 1321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1332 left = ResolveReplacement(left); | 1332 left = ResolveReplacement(left); |
| 1333 right = ResolveReplacement(right); | 1333 right = ResolveReplacement(right); |
| 1334 if (IsEquivalentPhi(left, right)) { | 1334 if (IsEquivalentPhi(left, right)) { |
| 1335 return true; | 1335 return true; |
| 1336 } | 1336 } |
| 1337 return false; | 1337 return false; |
| 1338 } | 1338 } |
| 1339 | 1339 |
| 1340 namespace { | 1340 namespace { |
| 1341 | 1341 |
| 1342 bool IsOffsetForFieldAccessCorrect(const FieldAccess& access) { |
| 1343 #if V8_TARGET_LITTLE_ENDIAN |
| 1344 return (access.offset % kPointerSize) == 0; |
| 1345 #else |
| 1346 return ((access.offset + |
| 1347 (1 << ElementSizeLog2Of(access.machine_type.representation()))) % |
| 1348 kPointerSize) == 0; |
| 1349 #endif |
| 1350 } |
| 1351 |
| 1342 int OffsetForFieldAccess(Node* node) { | 1352 int OffsetForFieldAccess(Node* node) { |
| 1343 FieldAccess access = FieldAccessOf(node->op()); | 1353 FieldAccess access = FieldAccessOf(node->op()); |
| 1344 DCHECK_EQ(access.offset % kPointerSize, 0); | 1354 DCHECK(IsOffsetForFieldAccessCorrect(access)); |
| 1345 return access.offset / kPointerSize; | 1355 return access.offset / kPointerSize; |
| 1346 } | 1356 } |
| 1347 | 1357 |
| 1348 int OffsetForElementAccess(Node* node, int index) { | 1358 int OffsetForElementAccess(Node* node, int index) { |
| 1349 ElementAccess access = ElementAccessOf(node->op()); | 1359 ElementAccess access = ElementAccessOf(node->op()); |
| 1350 DCHECK_GE(ElementSizeLog2Of(access.machine_type.representation()), | 1360 DCHECK_GE(ElementSizeLog2Of(access.machine_type.representation()), |
| 1351 kPointerSizeLog2); | 1361 kPointerSizeLog2); |
| 1352 DCHECK_EQ(access.header_size % kPointerSize, 0); | 1362 DCHECK_EQ(access.header_size % kPointerSize, 0); |
| 1353 return access.header_size / kPointerSize + index; | 1363 return access.header_size / kPointerSize + index; |
| 1354 } | 1364 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1400 if (!object->IsTracked()) return; | 1410 if (!object->IsTracked()) return; |
| 1401 int offset = OffsetForFieldAccess(node); | 1411 int offset = OffsetForFieldAccess(node); |
| 1402 if (static_cast<size_t>(offset) >= object->field_count()) return; | 1412 if (static_cast<size_t>(offset) >= object->field_count()) return; |
| 1403 Node* value = object->GetField(offset); | 1413 Node* value = object->GetField(offset); |
| 1404 if (value) { | 1414 if (value) { |
| 1405 value = ResolveReplacement(value); | 1415 value = ResolveReplacement(value); |
| 1406 } | 1416 } |
| 1407 // Record that the load has this alias. | 1417 // Record that the load has this alias. |
| 1408 UpdateReplacement(state, node, value); | 1418 UpdateReplacement(state, node, value); |
| 1409 } else if (from->opcode() == IrOpcode::kPhi && | 1419 } else if (from->opcode() == IrOpcode::kPhi && |
| 1410 FieldAccessOf(node->op()).offset % kPointerSize == 0) { | 1420 IsOffsetForFieldAccessCorrect(FieldAccessOf(node->op()))) { |
| 1411 int offset = OffsetForFieldAccess(node); | 1421 int offset = OffsetForFieldAccess(node); |
| 1412 // Only binary phis are supported for now. | 1422 // Only binary phis are supported for now. |
| 1413 ProcessLoadFromPhi(offset, from, node, state); | 1423 ProcessLoadFromPhi(offset, from, node, state); |
| 1414 } else { | 1424 } else { |
| 1415 UpdateReplacement(state, node, nullptr); | 1425 UpdateReplacement(state, node, nullptr); |
| 1416 } | 1426 } |
| 1417 } | 1427 } |
| 1418 | 1428 |
| 1419 void EscapeAnalysis::ProcessLoadElement(Node* node) { | 1429 void EscapeAnalysis::ProcessLoadElement(Node* node) { |
| 1420 DCHECK_EQ(node->opcode(), IrOpcode::kLoadElement); | 1430 DCHECK_EQ(node->opcode(), IrOpcode::kLoadElement); |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1636 } | 1646 } |
| 1637 } | 1647 } |
| 1638 return false; | 1648 return false; |
| 1639 } | 1649 } |
| 1640 | 1650 |
| 1641 Graph* EscapeAnalysis::graph() const { return status_analysis_->graph(); } | 1651 Graph* EscapeAnalysis::graph() const { return status_analysis_->graph(); } |
| 1642 | 1652 |
| 1643 } // namespace compiler | 1653 } // namespace compiler |
| 1644 } // namespace internal | 1654 } // namespace internal |
| 1645 } // namespace v8 | 1655 } // namespace v8 |
| OLD | NEW |