Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1032)

Side by Side Diff: src/compiler/load-elimination.cc

Issue 2203693002: [turbofan] Introduce initial support for TypedArrays. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@5254
Patch Set: Fix Retain Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/load-elimination.h ('k') | src/compiler/machine-operator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « src/compiler/load-elimination.h ('k') | src/compiler/machine-operator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698