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/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
6 | 6 |
7 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/compilation-info.h" | 9 #include "src/compilation-info.h" |
10 #include "src/compiler/compiler-source-position-table.h" | 10 #include "src/compiler/compiler-source-position-table.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 | 48 |
49 // Effect dependency tracked by this environment. | 49 // Effect dependency tracked by this environment. |
50 Node* GetEffectDependency() { return effect_dependency_; } | 50 Node* GetEffectDependency() { return effect_dependency_; } |
51 void UpdateEffectDependency(Node* dependency) { | 51 void UpdateEffectDependency(Node* dependency) { |
52 effect_dependency_ = dependency; | 52 effect_dependency_ = dependency; |
53 } | 53 } |
54 | 54 |
55 // Preserve a checkpoint of the environment for the IR graph. Any | 55 // Preserve a checkpoint of the environment for the IR graph. Any |
56 // further mutation of the environment will not affect checkpoints. | 56 // further mutation of the environment will not affect checkpoints. |
57 Node* Checkpoint(BailoutId bytecode_offset, OutputFrameStateCombine combine, | 57 Node* Checkpoint(BailoutId bytecode_offset, OutputFrameStateCombine combine, |
58 bool owner_has_exception, const BitVector* liveness); | 58 bool owner_has_exception, |
| 59 const BytecodeLivenessState* liveness); |
59 | 60 |
60 // Control dependency tracked by this environment. | 61 // Control dependency tracked by this environment. |
61 Node* GetControlDependency() const { return control_dependency_; } | 62 Node* GetControlDependency() const { return control_dependency_; } |
62 void UpdateControlDependency(Node* dependency) { | 63 void UpdateControlDependency(Node* dependency) { |
63 control_dependency_ = dependency; | 64 control_dependency_ = dependency; |
64 } | 65 } |
65 | 66 |
66 Node* Context() const { return context_; } | 67 Node* Context() const { return context_; } |
67 void SetContext(Node* new_context) { context_ = new_context; } | 68 void SetContext(Node* new_context) { context_ = new_context; } |
68 | 69 |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 } | 403 } |
403 | 404 |
404 void BytecodeGraphBuilder::Environment::UpdateStateValuesWithCache( | 405 void BytecodeGraphBuilder::Environment::UpdateStateValuesWithCache( |
405 Node** state_values, Node** values, int count) { | 406 Node** state_values, Node** values, int count) { |
406 *state_values = builder_->state_values_cache_.GetNodeForValues( | 407 *state_values = builder_->state_values_cache_.GetNodeForValues( |
407 values, static_cast<size_t>(count)); | 408 values, static_cast<size_t>(count)); |
408 } | 409 } |
409 | 410 |
410 Node* BytecodeGraphBuilder::Environment::Checkpoint( | 411 Node* BytecodeGraphBuilder::Environment::Checkpoint( |
411 BailoutId bailout_id, OutputFrameStateCombine combine, | 412 BailoutId bailout_id, OutputFrameStateCombine combine, |
412 bool owner_has_exception, const BitVector* liveness) { | 413 bool owner_has_exception, const BytecodeLivenessState* liveness) { |
413 UpdateStateValues(¶meters_state_values_, &values()->at(0), | 414 UpdateStateValues(¶meters_state_values_, &values()->at(0), |
414 parameter_count()); | 415 parameter_count()); |
415 | 416 |
416 if (liveness) { | 417 if (liveness) { |
417 Node* optimized_out = builder()->jsgraph()->OptimizedOutConstant(); | 418 Node* optimized_out = builder()->jsgraph()->OptimizedOutConstant(); |
418 | 419 |
419 for (int i = 0; i < register_count(); ++i) { | 420 for (int i = 0; i < register_count(); ++i) { |
420 state_value_working_area_[i] = liveness->Contains(i) | 421 state_value_working_area_[i] = liveness->RegisterIsLive(i) |
421 ? values()->at(register_base() + i) | 422 ? values()->at(register_base() + i) |
422 : optimized_out; | 423 : optimized_out; |
423 } | 424 } |
424 | 425 |
425 Node* accumulator_value = liveness->Contains(register_count()) | 426 Node* accumulator_value = liveness->AccumulatorIsLive() |
426 ? values()->at(accumulator_base()) | 427 ? values()->at(accumulator_base()) |
427 : optimized_out; | 428 : optimized_out; |
428 | 429 |
429 UpdateStateValuesWithCache(®isters_state_values_, | 430 UpdateStateValuesWithCache(®isters_state_values_, |
430 state_value_working_area_.data(), | 431 state_value_working_area_.data(), |
431 register_count()); | 432 register_count()); |
432 | 433 |
433 UpdateStateValues(&accumulator_state_values_, &accumulator_value, 1); | 434 UpdateStateValues(&accumulator_state_values_, &accumulator_value, 1); |
434 } else { | 435 } else { |
435 UpdateStateValuesWithCache(®isters_state_values_, | 436 UpdateStateValuesWithCache(®isters_state_values_, |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 void BytecodeGraphBuilder::PrepareEagerCheckpoint() { | 563 void BytecodeGraphBuilder::PrepareEagerCheckpoint() { |
563 if (environment()->GetEffectDependency()->opcode() != IrOpcode::kCheckpoint) { | 564 if (environment()->GetEffectDependency()->opcode() != IrOpcode::kCheckpoint) { |
564 // Create an explicit checkpoint node for before the operation. This only | 565 // Create an explicit checkpoint node for before the operation. This only |
565 // needs to happen if we aren't effect-dominated by a {Checkpoint} already. | 566 // needs to happen if we aren't effect-dominated by a {Checkpoint} already. |
566 Node* node = NewNode(common()->Checkpoint()); | 567 Node* node = NewNode(common()->Checkpoint()); |
567 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node->op())); | 568 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node->op())); |
568 DCHECK_EQ(IrOpcode::kDead, | 569 DCHECK_EQ(IrOpcode::kDead, |
569 NodeProperties::GetFrameStateInput(node)->opcode()); | 570 NodeProperties::GetFrameStateInput(node)->opcode()); |
570 BailoutId bailout_id(bytecode_iterator().current_offset()); | 571 BailoutId bailout_id(bytecode_iterator().current_offset()); |
571 | 572 |
572 const BitVector* liveness_before = bytecode_analysis()->GetInLivenessFor( | 573 const BytecodeLivenessState* liveness_before = |
573 bytecode_iterator().current_offset()); | 574 bytecode_analysis()->GetInLivenessFor( |
| 575 bytecode_iterator().current_offset()); |
574 | 576 |
575 Node* frame_state_before = environment()->Checkpoint( | 577 Node* frame_state_before = environment()->Checkpoint( |
576 bailout_id, OutputFrameStateCombine::Ignore(), false, liveness_before); | 578 bailout_id, OutputFrameStateCombine::Ignore(), false, liveness_before); |
577 NodeProperties::ReplaceFrameStateInput(node, frame_state_before); | 579 NodeProperties::ReplaceFrameStateInput(node, frame_state_before); |
578 } | 580 } |
579 } | 581 } |
580 | 582 |
581 void BytecodeGraphBuilder::PrepareFrameState(Node* node, | 583 void BytecodeGraphBuilder::PrepareFrameState(Node* node, |
582 OutputFrameStateCombine combine) { | 584 OutputFrameStateCombine combine) { |
583 if (OperatorProperties::HasFrameStateInput(node->op())) { | 585 if (OperatorProperties::HasFrameStateInput(node->op())) { |
584 // Add the frame state for after the operation. The node in question has | 586 // Add the frame state for after the operation. The node in question has |
585 // already been created and had a {Dead} frame state input up until now. | 587 // already been created and had a {Dead} frame state input up until now. |
586 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node->op())); | 588 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node->op())); |
587 DCHECK_EQ(IrOpcode::kDead, | 589 DCHECK_EQ(IrOpcode::kDead, |
588 NodeProperties::GetFrameStateInput(node)->opcode()); | 590 NodeProperties::GetFrameStateInput(node)->opcode()); |
589 BailoutId bailout_id(bytecode_iterator().current_offset()); | 591 BailoutId bailout_id(bytecode_iterator().current_offset()); |
590 bool has_exception = NodeProperties::IsExceptionalCall(node); | 592 bool has_exception = NodeProperties::IsExceptionalCall(node); |
591 | 593 |
592 const BitVector* liveness_after = bytecode_analysis()->GetOutLivenessFor( | 594 const BytecodeLivenessState* liveness_after = |
593 bytecode_iterator().current_offset()); | 595 bytecode_analysis()->GetOutLivenessFor( |
| 596 bytecode_iterator().current_offset()); |
594 | 597 |
595 Node* frame_state_after = environment()->Checkpoint( | 598 Node* frame_state_after = environment()->Checkpoint( |
596 bailout_id, combine, has_exception, liveness_after); | 599 bailout_id, combine, has_exception, liveness_after); |
597 NodeProperties::ReplaceFrameStateInput(node, frame_state_after); | 600 NodeProperties::ReplaceFrameStateInput(node, frame_state_after); |
598 } | 601 } |
599 } | 602 } |
600 | 603 |
601 void BytecodeGraphBuilder::VisitBytecodes(bool stack_check) { | 604 void BytecodeGraphBuilder::VisitBytecodes(bool stack_check) { |
602 BytecodeAnalysis bytecode_analysis(bytecode_array(), local_zone(), | 605 BytecodeAnalysis bytecode_analysis(bytecode_array(), local_zone(), |
603 FLAG_analyze_environment_liveness); | 606 FLAG_analyze_environment_liveness); |
(...skipping 1598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2202 it->source_position().ScriptOffset(), start_position_.InliningId())); | 2205 it->source_position().ScriptOffset(), start_position_.InliningId())); |
2203 it->Advance(); | 2206 it->Advance(); |
2204 } else { | 2207 } else { |
2205 DCHECK_GT(it->code_offset(), offset); | 2208 DCHECK_GT(it->code_offset(), offset); |
2206 } | 2209 } |
2207 } | 2210 } |
2208 | 2211 |
2209 } // namespace compiler | 2212 } // namespace compiler |
2210 } // namespace internal | 2213 } // namespace internal |
2211 } // namespace v8 | 2214 } // namespace v8 |
OLD | NEW |