| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
| 9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
| 10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 : builder_->environment()->Checkpoint(id_before); | 396 : builder_->environment()->Checkpoint(id_before); |
| 397 } | 397 } |
| 398 | 398 |
| 399 void AddToNode(Node* node, BailoutId id_after, | 399 void AddToNode(Node* node, BailoutId id_after, |
| 400 OutputFrameStateCombine combine) { | 400 OutputFrameStateCombine combine) { |
| 401 int count = OperatorProperties::GetFrameStateInputCount(node->op()); | 401 int count = OperatorProperties::GetFrameStateInputCount(node->op()); |
| 402 DCHECK_LE(count, 2); | 402 DCHECK_LE(count, 2); |
| 403 | 403 |
| 404 if (count >= 1) { | 404 if (count >= 1) { |
| 405 // Add the frame state for after the operation. | 405 // Add the frame state for after the operation. |
| 406 DCHECK_EQ(IrOpcode::kDead, | 406 DCHECK_EQ(IrOpcode::kDeadValue, |
| 407 NodeProperties::GetFrameStateInput(node, 0)->opcode()); | 407 NodeProperties::GetFrameStateInput(node, 0)->opcode()); |
| 408 | 408 |
| 409 Node* frame_state_after = | 409 Node* frame_state_after = |
| 410 id_after == BailoutId::None() | 410 id_after == BailoutId::None() |
| 411 ? builder_->jsgraph()->EmptyFrameState() | 411 ? builder_->jsgraph()->EmptyFrameState() |
| 412 : builder_->environment()->Checkpoint(id_after, combine); | 412 : builder_->environment()->Checkpoint(id_after, combine); |
| 413 | 413 |
| 414 NodeProperties::ReplaceFrameStateInput(node, 0, frame_state_after); | 414 NodeProperties::ReplaceFrameStateInput(node, 0, frame_state_after); |
| 415 } | 415 } |
| 416 | 416 |
| 417 if (count >= 2) { | 417 if (count >= 2) { |
| 418 // Add the frame state for before the operation. | 418 // Add the frame state for before the operation. |
| 419 DCHECK_EQ(IrOpcode::kDead, | 419 DCHECK_EQ(IrOpcode::kDeadValue, |
| 420 NodeProperties::GetFrameStateInput(node, 1)->opcode()); | 420 NodeProperties::GetFrameStateInput(node, 1)->opcode()); |
| 421 NodeProperties::ReplaceFrameStateInput(node, 1, frame_state_before_); | 421 NodeProperties::ReplaceFrameStateInput(node, 1, frame_state_before_); |
| 422 } | 422 } |
| 423 } | 423 } |
| 424 | 424 |
| 425 private: | 425 private: |
| 426 AstGraphBuilder* builder_; | 426 AstGraphBuilder* builder_; |
| 427 Node* frame_state_before_; | 427 Node* frame_state_before_; |
| 428 }; | 428 }; |
| 429 | 429 |
| (...skipping 3322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3752 return true; | 3752 return true; |
| 3753 } | 3753 } |
| 3754 return false; | 3754 return false; |
| 3755 } | 3755 } |
| 3756 | 3756 |
| 3757 | 3757 |
| 3758 void AstGraphBuilder::PrepareFrameState(Node* node, BailoutId ast_id, | 3758 void AstGraphBuilder::PrepareFrameState(Node* node, BailoutId ast_id, |
| 3759 OutputFrameStateCombine combine) { | 3759 OutputFrameStateCombine combine) { |
| 3760 if (OperatorProperties::GetFrameStateInputCount(node->op()) > 0) { | 3760 if (OperatorProperties::GetFrameStateInputCount(node->op()) > 0) { |
| 3761 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node->op())); | 3761 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node->op())); |
| 3762 | 3762 DCHECK_EQ(IrOpcode::kDeadValue, |
| 3763 DCHECK_EQ(IrOpcode::kDead, | |
| 3764 NodeProperties::GetFrameStateInput(node, 0)->opcode()); | 3763 NodeProperties::GetFrameStateInput(node, 0)->opcode()); |
| 3765 NodeProperties::ReplaceFrameStateInput( | 3764 NodeProperties::ReplaceFrameStateInput( |
| 3766 node, 0, environment()->Checkpoint(ast_id, combine)); | 3765 node, 0, environment()->Checkpoint(ast_id, combine)); |
| 3767 } | 3766 } |
| 3768 } | 3767 } |
| 3769 | 3768 |
| 3770 | 3769 |
| 3771 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( | 3770 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( |
| 3772 IterationStatement* stmt) { | 3771 IterationStatement* stmt) { |
| 3773 if (loop_assignment_analysis_ == NULL) return NULL; | 3772 if (loop_assignment_analysis_ == NULL) return NULL; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3808 if (has_control) ++input_count_with_deps; | 3807 if (has_control) ++input_count_with_deps; |
| 3809 if (has_effect) ++input_count_with_deps; | 3808 if (has_effect) ++input_count_with_deps; |
| 3810 Node** buffer = EnsureInputBufferSize(input_count_with_deps); | 3809 Node** buffer = EnsureInputBufferSize(input_count_with_deps); |
| 3811 memcpy(buffer, value_inputs, kPointerSize * value_input_count); | 3810 memcpy(buffer, value_inputs, kPointerSize * value_input_count); |
| 3812 Node** current_input = buffer + value_input_count; | 3811 Node** current_input = buffer + value_input_count; |
| 3813 if (has_context) { | 3812 if (has_context) { |
| 3814 *current_input++ = current_context(); | 3813 *current_input++ = current_context(); |
| 3815 } | 3814 } |
| 3816 for (int i = 0; i < frame_state_count; i++) { | 3815 for (int i = 0; i < frame_state_count; i++) { |
| 3817 // The frame state will be inserted later. Here we misuse | 3816 // The frame state will be inserted later. Here we misuse |
| 3818 // the {DeadControl} node as a sentinel to be later overwritten | 3817 // the {DeadValue} node as a sentinel to be later overwritten |
| 3819 // with the real frame state. | 3818 // with the real frame state. |
| 3820 *current_input++ = jsgraph()->DeadControl(); | 3819 *current_input++ = jsgraph()->DeadValue(); |
| 3821 } | 3820 } |
| 3822 if (has_effect) { | 3821 if (has_effect) { |
| 3823 *current_input++ = environment_->GetEffectDependency(); | 3822 *current_input++ = environment_->GetEffectDependency(); |
| 3824 } | 3823 } |
| 3825 if (has_control) { | 3824 if (has_control) { |
| 3826 *current_input++ = environment_->GetControlDependency(); | 3825 *current_input++ = environment_->GetControlDependency(); |
| 3827 } | 3826 } |
| 3828 result = graph()->NewNode(op, input_count_with_deps, buffer, incomplete); | 3827 result = graph()->NewNode(op, input_count_with_deps, buffer, incomplete); |
| 3829 if (!environment()->IsMarkedAsUnreachable()) { | 3828 if (!environment()->IsMarkedAsUnreachable()) { |
| 3830 // Update the current control dependency for control-producing nodes. | 3829 // Update the current control dependency for control-producing nodes. |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4077 // Phi does not exist yet, introduce one. | 4076 // Phi does not exist yet, introduce one. |
| 4078 value = NewPhi(inputs, value, control); | 4077 value = NewPhi(inputs, value, control); |
| 4079 value->ReplaceInput(inputs - 1, other); | 4078 value->ReplaceInput(inputs - 1, other); |
| 4080 } | 4079 } |
| 4081 return value; | 4080 return value; |
| 4082 } | 4081 } |
| 4083 | 4082 |
| 4084 } // namespace compiler | 4083 } // namespace compiler |
| 4085 } // namespace internal | 4084 } // namespace internal |
| 4086 } // namespace v8 | 4085 } // namespace v8 |
| OLD | NEW |