| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/load-elimination.h" | 5 #include "src/compiler/load-elimination.h" |
| 6 | 6 |
| 7 #include "src/compiler/node-properties.h" | 7 #include "src/compiler/node-properties.h" |
| 8 #include "src/compiler/simplified-operator.h" | 8 #include "src/compiler/simplified-operator.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 case IrOpcode::kTransitionElementsKind: | 56 case IrOpcode::kTransitionElementsKind: |
| 57 return ReduceTransitionElementsKind(node); | 57 return ReduceTransitionElementsKind(node); |
| 58 case IrOpcode::kLoadField: | 58 case IrOpcode::kLoadField: |
| 59 return ReduceLoadField(node); | 59 return ReduceLoadField(node); |
| 60 case IrOpcode::kStoreField: | 60 case IrOpcode::kStoreField: |
| 61 return ReduceStoreField(node); | 61 return ReduceStoreField(node); |
| 62 case IrOpcode::kLoadElement: | 62 case IrOpcode::kLoadElement: |
| 63 return ReduceLoadElement(node); | 63 return ReduceLoadElement(node); |
| 64 case IrOpcode::kStoreElement: | 64 case IrOpcode::kStoreElement: |
| 65 return ReduceStoreElement(node); | 65 return ReduceStoreElement(node); |
| 66 case IrOpcode::kStoreTypedElement: |
| 67 return ReduceStoreTypedElement(node); |
| 66 case IrOpcode::kEffectPhi: | 68 case IrOpcode::kEffectPhi: |
| 67 return ReduceEffectPhi(node); | 69 return ReduceEffectPhi(node); |
| 68 case IrOpcode::kDead: | 70 case IrOpcode::kDead: |
| 69 break; | 71 break; |
| 70 case IrOpcode::kStart: | 72 case IrOpcode::kStart: |
| 71 return ReduceStart(node); | 73 return ReduceStart(node); |
| 72 default: | 74 default: |
| 73 return ReduceOtherNode(node); | 75 return ReduceOtherNode(node); |
| 74 } | 76 } |
| 75 return NoChange(); | 77 return NoChange(); |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 break; | 450 break; |
| 449 case MachineRepresentation::kFloat64: | 451 case MachineRepresentation::kFloat64: |
| 450 case MachineRepresentation::kSimd128: | 452 case MachineRepresentation::kSimd128: |
| 451 case MachineRepresentation::kTagged: | 453 case MachineRepresentation::kTagged: |
| 452 state = state->AddElement(object, index, new_value, zone()); | 454 state = state->AddElement(object, index, new_value, zone()); |
| 453 break; | 455 break; |
| 454 } | 456 } |
| 455 return UpdateState(node, state); | 457 return UpdateState(node, state); |
| 456 } | 458 } |
| 457 | 459 |
| 460 Reduction LoadElimination::ReduceStoreTypedElement(Node* node) { |
| 461 Node* const effect = NodeProperties::GetEffectInput(node); |
| 462 AbstractState const* state = node_states_.Get(effect); |
| 463 if (state == nullptr) return NoChange(); |
| 464 return UpdateState(node, state); |
| 465 } |
| 466 |
| 458 Reduction LoadElimination::ReduceEffectPhi(Node* node) { | 467 Reduction LoadElimination::ReduceEffectPhi(Node* node) { |
| 459 Node* const effect0 = NodeProperties::GetEffectInput(node, 0); | 468 Node* const effect0 = NodeProperties::GetEffectInput(node, 0); |
| 460 Node* const control = NodeProperties::GetControlInput(node); | 469 Node* const control = NodeProperties::GetControlInput(node); |
| 461 AbstractState const* state0 = node_states_.Get(effect0); | 470 AbstractState const* state0 = node_states_.Get(effect0); |
| 462 if (state0 == nullptr) return NoChange(); | 471 if (state0 == nullptr) return NoChange(); |
| 463 if (control->opcode() == IrOpcode::kLoop) { | 472 if (control->opcode() == IrOpcode::kLoop) { |
| 464 // Here we rely on having only reducible loops: | 473 // Here we rely on having only reducible loops: |
| 465 // The loop entry edge always dominates the header, so we can just take | 474 // The loop entry edge always dominates the header, so we can just take |
| 466 // the state from the first input, and compute the loop state based on it. | 475 // the state from the first input, and compute the loop state based on it. |
| 467 AbstractState const* state = ComputeLoopState(node, state0); | 476 AbstractState const* state = ComputeLoopState(node, state0); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 for (int i = 0; i < current->op()->EffectInputCount(); ++i) { | 573 for (int i = 0; i < current->op()->EffectInputCount(); ++i) { |
| 565 queue.push(NodeProperties::GetEffectInput(current, i)); | 574 queue.push(NodeProperties::GetEffectInput(current, i)); |
| 566 } | 575 } |
| 567 } | 576 } |
| 568 } | 577 } |
| 569 return state; | 578 return state; |
| 570 } | 579 } |
| 571 | 580 |
| 572 // static | 581 // static |
| 573 int LoadElimination::FieldIndexOf(FieldAccess const& access) { | 582 int LoadElimination::FieldIndexOf(FieldAccess const& access) { |
| 574 switch (access.machine_type.representation()) { | 583 MachineRepresentation rep = access.machine_type.representation(); |
| 584 switch (rep) { |
| 575 case MachineRepresentation::kNone: | 585 case MachineRepresentation::kNone: |
| 576 case MachineRepresentation::kBit: | 586 case MachineRepresentation::kBit: |
| 577 UNREACHABLE(); | 587 UNREACHABLE(); |
| 578 break; | 588 break; |
| 589 case MachineRepresentation::kWord32: |
| 590 case MachineRepresentation::kWord64: |
| 591 if (rep != MachineType::PointerRepresentation()) { |
| 592 return -1; // We currently only track pointer size fields. |
| 593 } |
| 594 break; |
| 579 case MachineRepresentation::kWord8: | 595 case MachineRepresentation::kWord8: |
| 580 case MachineRepresentation::kWord16: | 596 case MachineRepresentation::kWord16: |
| 581 case MachineRepresentation::kWord32: | |
| 582 case MachineRepresentation::kWord64: | |
| 583 case MachineRepresentation::kFloat32: | 597 case MachineRepresentation::kFloat32: |
| 584 return -1; // Currently untracked. | 598 return -1; // Currently untracked. |
| 585 case MachineRepresentation::kFloat64: | 599 case MachineRepresentation::kFloat64: |
| 586 case MachineRepresentation::kSimd128: | 600 case MachineRepresentation::kSimd128: |
| 587 case MachineRepresentation::kTagged: | 601 case MachineRepresentation::kTagged: |
| 588 // TODO(bmeurer): Check that we never do overlapping load/stores of | 602 // TODO(bmeurer): Check that we never do overlapping load/stores of |
| 589 // individual parts of Float64/Simd128 values. | 603 // individual parts of Float64/Simd128 values. |
| 590 break; | 604 break; |
| 591 } | 605 } |
| 592 DCHECK_EQ(kTaggedBase, access.base_is_tagged); | 606 DCHECK_EQ(kTaggedBase, access.base_is_tagged); |
| 593 DCHECK_EQ(0, access.offset % kPointerSize); | 607 DCHECK_EQ(0, access.offset % kPointerSize); |
| 594 int field_index = access.offset / kPointerSize; | 608 int field_index = access.offset / kPointerSize; |
| 595 if (field_index >= static_cast<int>(kMaxTrackedFields)) return -1; | 609 if (field_index >= static_cast<int>(kMaxTrackedFields)) return -1; |
| 596 return field_index; | 610 return field_index; |
| 597 } | 611 } |
| 598 | 612 |
| 599 } // namespace compiler | 613 } // namespace compiler |
| 600 } // namespace internal | 614 } // namespace internal |
| 601 } // namespace v8 | 615 } // namespace v8 |
| OLD | NEW |