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/bytecode-branch-analysis.h" | 10 #include "src/compiler/bytecode-branch-analysis.h" |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 return the_register.index() + register_base(); | 252 return the_register.index() + register_base(); |
253 } | 253 } |
254 } | 254 } |
255 | 255 |
256 bool BytecodeGraphBuilder::Environment::IsLivenessBlockConsistent() const { | 256 bool BytecodeGraphBuilder::Environment::IsLivenessBlockConsistent() const { |
257 return !builder_->IsLivenessAnalysisEnabled() == | 257 return !builder_->IsLivenessAnalysisEnabled() == |
258 (liveness_block() == nullptr); | 258 (liveness_block() == nullptr); |
259 } | 259 } |
260 | 260 |
261 Node* BytecodeGraphBuilder::Environment::LookupAccumulator() const { | 261 Node* BytecodeGraphBuilder::Environment::LookupAccumulator() const { |
| 262 DCHECK(IsLivenessBlockConsistent()); |
| 263 if (liveness_block() != nullptr) { |
| 264 liveness_block()->LookupAccumulator(); |
| 265 } |
262 return values()->at(accumulator_base_); | 266 return values()->at(accumulator_base_); |
263 } | 267 } |
264 | 268 |
265 | 269 |
266 Node* BytecodeGraphBuilder::Environment::LookupRegister( | 270 Node* BytecodeGraphBuilder::Environment::LookupRegister( |
267 interpreter::Register the_register) const { | 271 interpreter::Register the_register) const { |
268 if (the_register.is_current_context()) { | 272 if (the_register.is_current_context()) { |
269 return Context(); | 273 return Context(); |
270 } else if (the_register.is_function_closure()) { | 274 } else if (the_register.is_function_closure()) { |
271 return builder()->GetFunctionClosure(); | 275 return builder()->GetFunctionClosure(); |
(...skipping 16 matching lines...) Expand all Loading... |
288 liveness_block()->Lookup(i); | 292 liveness_block()->Lookup(i); |
289 } | 293 } |
290 } | 294 } |
291 } | 295 } |
292 | 296 |
293 void BytecodeGraphBuilder::Environment::BindAccumulator( | 297 void BytecodeGraphBuilder::Environment::BindAccumulator( |
294 Node* node, FrameStateBeforeAndAfter* states) { | 298 Node* node, FrameStateBeforeAndAfter* states) { |
295 if (states) { | 299 if (states) { |
296 states->AddToNode(node, OutputFrameStateCombine::PokeAt(0)); | 300 states->AddToNode(node, OutputFrameStateCombine::PokeAt(0)); |
297 } | 301 } |
| 302 DCHECK(IsLivenessBlockConsistent()); |
| 303 if (liveness_block() != nullptr) { |
| 304 liveness_block()->BindAccumulator(); |
| 305 } |
298 values()->at(accumulator_base_) = node; | 306 values()->at(accumulator_base_) = node; |
299 } | 307 } |
300 | 308 |
301 | 309 |
302 void BytecodeGraphBuilder::Environment::BindRegister( | 310 void BytecodeGraphBuilder::Environment::BindRegister( |
303 interpreter::Register the_register, Node* node, | 311 interpreter::Register the_register, Node* node, |
304 FrameStateBeforeAndAfter* states) { | 312 FrameStateBeforeAndAfter* states) { |
305 int values_index = RegisterToValuesIndex(the_register); | 313 int values_index = RegisterToValuesIndex(the_register); |
306 if (states) { | 314 if (states) { |
307 states->AddToNode(node, OutputFrameStateCombine::PokeAt(accumulator_base_ - | 315 states->AddToNode(node, OutputFrameStateCombine::PokeAt(accumulator_base_ - |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 merge_environments_(local_zone), | 613 merge_environments_(local_zone), |
606 exception_handlers_(local_zone), | 614 exception_handlers_(local_zone), |
607 current_exception_handler_(0), | 615 current_exception_handler_(0), |
608 input_buffer_size_(0), | 616 input_buffer_size_(0), |
609 input_buffer_(nullptr), | 617 input_buffer_(nullptr), |
610 exit_controls_(local_zone), | 618 exit_controls_(local_zone), |
611 is_liveness_analysis_enabled_(FLAG_analyze_environment_liveness && | 619 is_liveness_analysis_enabled_(FLAG_analyze_environment_liveness && |
612 info->is_deoptimization_enabled()), | 620 info->is_deoptimization_enabled()), |
613 state_values_cache_(jsgraph), | 621 state_values_cache_(jsgraph), |
614 liveness_analyzer_( | 622 liveness_analyzer_( |
615 static_cast<size_t>(bytecode_array()->register_count()), local_zone), | 623 static_cast<size_t>(bytecode_array()->register_count()), true, |
| 624 local_zone), |
616 source_positions_(source_positions) {} | 625 source_positions_(source_positions) {} |
617 | 626 |
618 Node* BytecodeGraphBuilder::GetNewTarget() { | 627 Node* BytecodeGraphBuilder::GetNewTarget() { |
619 if (!new_target_.is_set()) { | 628 if (!new_target_.is_set()) { |
620 int params = bytecode_array()->parameter_count(); | 629 int params = bytecode_array()->parameter_count(); |
621 int index = Linkage::GetJSCallNewTargetParamIndex(params); | 630 int index = Linkage::GetJSCallNewTargetParamIndex(params); |
622 const Operator* op = common()->Parameter(index, "%new.target"); | 631 const Operator* op = common()->Parameter(index, "%new.target"); |
623 Node* node = NewNode(op, graph()->start()); | 632 Node* node = NewNode(op, graph()->start()); |
624 new_target_.set(node); | 633 new_target_.set(node); |
625 } | 634 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 | 700 |
692 return true; | 701 return true; |
693 } | 702 } |
694 | 703 |
695 void BytecodeGraphBuilder::ClearNonLiveSlotsInFrameStates() { | 704 void BytecodeGraphBuilder::ClearNonLiveSlotsInFrameStates() { |
696 if (!IsLivenessAnalysisEnabled()) { | 705 if (!IsLivenessAnalysisEnabled()) { |
697 return; | 706 return; |
698 } | 707 } |
699 NonLiveFrameStateSlotReplacer replacer( | 708 NonLiveFrameStateSlotReplacer replacer( |
700 &state_values_cache_, jsgraph()->OptimizedOutConstant(), | 709 &state_values_cache_, jsgraph()->OptimizedOutConstant(), |
701 liveness_analyzer()->local_count(), local_zone()); | 710 liveness_analyzer()->local_count(), true, local_zone()); |
702 liveness_analyzer()->Run(&replacer); | 711 liveness_analyzer()->Run(&replacer); |
703 if (FLAG_trace_environment_liveness) { | 712 if (FLAG_trace_environment_liveness) { |
704 OFStream os(stdout); | 713 OFStream os(stdout); |
705 liveness_analyzer()->Print(os); | 714 liveness_analyzer()->Print(os); |
706 } | 715 } |
707 } | 716 } |
708 | 717 |
709 void BytecodeGraphBuilder::VisitBytecodes() { | 718 void BytecodeGraphBuilder::VisitBytecodes() { |
710 BytecodeBranchAnalysis analysis(bytecode_array(), local_zone()); | 719 BytecodeBranchAnalysis analysis(bytecode_array(), local_zone()); |
711 BytecodeLoopAnalysis loop_analysis(bytecode_array(), &analysis, local_zone()); | 720 BytecodeLoopAnalysis loop_analysis(bytecode_array(), &analysis, local_zone()); |
(...skipping 1560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2272 source_positions_->set_current_position(it->source_position()); | 2281 source_positions_->set_current_position(it->source_position()); |
2273 it->Advance(); | 2282 it->Advance(); |
2274 } else { | 2283 } else { |
2275 DCHECK_GT(it->code_offset(), offset); | 2284 DCHECK_GT(it->code_offset(), offset); |
2276 } | 2285 } |
2277 } | 2286 } |
2278 | 2287 |
2279 } // namespace compiler | 2288 } // namespace compiler |
2280 } // namespace internal | 2289 } // namespace internal |
2281 } // namespace v8 | 2290 } // namespace v8 |
OLD | NEW |