| 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/compiler/bytecode-branch-analysis.h" | 7 #include "src/compiler/bytecode-branch-analysis.h" |
| 8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" |
| 9 #include "src/compiler/operator-properties.h" | 9 #include "src/compiler/operator-properties.h" |
| 10 #include "src/interpreter/bytecodes.h" | 10 #include "src/interpreter/bytecodes.h" |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 | 348 |
| 349 // Connect to the loop end. | 349 // Connect to the loop end. |
| 350 Node* terminate = builder()->graph()->NewNode( | 350 Node* terminate = builder()->graph()->NewNode( |
| 351 builder()->common()->Terminate(), effect, control); | 351 builder()->common()->Terminate(), effect, control); |
| 352 builder()->exit_controls_.push_back(terminate); | 352 builder()->exit_controls_.push_back(terminate); |
| 353 } | 353 } |
| 354 | 354 |
| 355 | 355 |
| 356 bool BytecodeGraphBuilder::Environment::StateValuesRequireUpdate( | 356 bool BytecodeGraphBuilder::Environment::StateValuesRequireUpdate( |
| 357 Node** state_values, int offset, int count) { | 357 Node** state_values, int offset, int count) { |
| 358 if (!builder()->deoptimization_enabled_) { | |
| 359 return false; | |
| 360 } | |
| 361 if (*state_values == nullptr) { | 358 if (*state_values == nullptr) { |
| 362 return true; | 359 return true; |
| 363 } | 360 } |
| 364 DCHECK_EQ((*state_values)->InputCount(), count); | 361 DCHECK_EQ((*state_values)->InputCount(), count); |
| 365 DCHECK_LE(static_cast<size_t>(offset + count), values()->size()); | 362 DCHECK_LE(static_cast<size_t>(offset + count), values()->size()); |
| 366 Node** env_values = (count == 0) ? nullptr : &values()->at(offset); | 363 Node** env_values = (count == 0) ? nullptr : &values()->at(offset); |
| 367 for (int i = 0; i < count; i++) { | 364 for (int i = 0; i < count; i++) { |
| 368 if ((*state_values)->InputAt(i) != env_values[i]) { | 365 if ((*state_values)->InputAt(i) != env_values[i]) { |
| 369 return true; | 366 return true; |
| 370 } | 367 } |
| 371 } | 368 } |
| 372 return false; | 369 return false; |
| 373 } | 370 } |
| 374 | 371 |
| 375 | 372 |
| 376 void BytecodeGraphBuilder::Environment::UpdateStateValues(Node** state_values, | 373 void BytecodeGraphBuilder::Environment::UpdateStateValues(Node** state_values, |
| 377 int offset, | 374 int offset, |
| 378 int count) { | 375 int count) { |
| 379 if (StateValuesRequireUpdate(state_values, offset, count)) { | 376 if (StateValuesRequireUpdate(state_values, offset, count)) { |
| 380 const Operator* op = common()->StateValues(count); | 377 const Operator* op = common()->StateValues(count); |
| 381 (*state_values) = graph()->NewNode(op, count, &values()->at(offset)); | 378 (*state_values) = graph()->NewNode(op, count, &values()->at(offset)); |
| 382 } | 379 } |
| 383 } | 380 } |
| 384 | 381 |
| 385 | 382 |
| 386 Node* BytecodeGraphBuilder::Environment::Checkpoint( | 383 Node* BytecodeGraphBuilder::Environment::Checkpoint( |
| 387 BailoutId bailout_id, OutputFrameStateCombine combine) { | 384 BailoutId bailout_id, OutputFrameStateCombine combine) { |
| 388 if (!builder()->deoptimization_enabled_) { | |
| 389 return builder()->jsgraph()->EmptyFrameState(); | |
| 390 } | |
| 391 | |
| 392 // TODO(rmcilroy): Consider using StateValuesCache for some state values. | 385 // TODO(rmcilroy): Consider using StateValuesCache for some state values. |
| 393 UpdateStateValues(¶meters_state_values_, 0, parameter_count()); | 386 UpdateStateValues(¶meters_state_values_, 0, parameter_count()); |
| 394 UpdateStateValues(®isters_state_values_, register_base(), | 387 UpdateStateValues(®isters_state_values_, register_base(), |
| 395 register_count()); | 388 register_count()); |
| 396 UpdateStateValues(&accumulator_state_values_, accumulator_base(), 1); | 389 UpdateStateValues(&accumulator_state_values_, accumulator_base(), 1); |
| 397 | 390 |
| 398 const Operator* op = common()->FrameState( | 391 const Operator* op = common()->FrameState( |
| 399 bailout_id, combine, builder()->frame_state_function_info()); | 392 bailout_id, combine, builder()->frame_state_function_info()); |
| 400 Node* result = graph()->NewNode( | 393 Node* result = graph()->NewNode( |
| 401 op, parameters_state_values_, registers_state_values_, | 394 op, parameters_state_values_, registers_state_values_, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 416 return false; | 409 return false; |
| 417 } | 410 } |
| 418 } | 411 } |
| 419 } | 412 } |
| 420 return true; | 413 return true; |
| 421 } | 414 } |
| 422 | 415 |
| 423 | 416 |
| 424 bool BytecodeGraphBuilder::Environment::StateValuesAreUpToDate( | 417 bool BytecodeGraphBuilder::Environment::StateValuesAreUpToDate( |
| 425 int output_poke_offset, int output_poke_count) { | 418 int output_poke_offset, int output_poke_count) { |
| 426 if (!builder()->deoptimization_enabled_) return true; | |
| 427 // Poke offset is relative to the top of the stack (i.e., the accumulator). | 419 // Poke offset is relative to the top of the stack (i.e., the accumulator). |
| 428 int output_poke_start = accumulator_base() - output_poke_offset; | 420 int output_poke_start = accumulator_base() - output_poke_offset; |
| 429 int output_poke_end = output_poke_start + output_poke_count; | 421 int output_poke_end = output_poke_start + output_poke_count; |
| 430 return StateValuesAreUpToDate(¶meters_state_values_, 0, parameter_count(), | 422 return StateValuesAreUpToDate(¶meters_state_values_, 0, parameter_count(), |
| 431 output_poke_start, output_poke_end) && | 423 output_poke_start, output_poke_end) && |
| 432 StateValuesAreUpToDate(®isters_state_values_, register_base(), | 424 StateValuesAreUpToDate(®isters_state_values_, register_base(), |
| 433 register_count(), output_poke_start, | 425 register_count(), output_poke_start, |
| 434 output_poke_end) && | 426 output_poke_end) && |
| 435 StateValuesAreUpToDate(&accumulator_state_values_, accumulator_base(), | 427 StateValuesAreUpToDate(&accumulator_state_values_, accumulator_base(), |
| 436 1, output_poke_start, output_poke_end); | 428 1, output_poke_start, output_poke_end); |
| 437 } | 429 } |
| 438 | 430 |
| 439 BytecodeGraphBuilder::BytecodeGraphBuilder(Zone* local_zone, | 431 BytecodeGraphBuilder::BytecodeGraphBuilder(Zone* local_zone, |
| 440 CompilationInfo* info, | 432 CompilationInfo* info, |
| 441 JSGraph* jsgraph) | 433 JSGraph* jsgraph) |
| 442 : local_zone_(local_zone), | 434 : local_zone_(local_zone), |
| 443 jsgraph_(jsgraph), | 435 jsgraph_(jsgraph), |
| 444 bytecode_array_(handle(info->shared_info()->bytecode_array())), | 436 bytecode_array_(handle(info->shared_info()->bytecode_array())), |
| 445 exception_handler_table_( | 437 exception_handler_table_( |
| 446 handle(HandlerTable::cast(bytecode_array()->handler_table()))), | 438 handle(HandlerTable::cast(bytecode_array()->handler_table()))), |
| 447 feedback_vector_(handle(info->shared_info()->feedback_vector())), | 439 feedback_vector_(handle(info->shared_info()->feedback_vector())), |
| 448 frame_state_function_info_(common()->CreateFrameStateFunctionInfo( | 440 frame_state_function_info_(common()->CreateFrameStateFunctionInfo( |
| 449 FrameStateType::kInterpretedFunction, | 441 FrameStateType::kInterpretedFunction, |
| 450 bytecode_array()->parameter_count(), | 442 bytecode_array()->parameter_count(), |
| 451 bytecode_array()->register_count(), info->shared_info())), | 443 bytecode_array()->register_count(), info->shared_info())), |
| 452 deoptimization_enabled_(info->is_deoptimization_enabled()), | |
| 453 merge_environments_(local_zone), | 444 merge_environments_(local_zone), |
| 454 exception_handlers_(local_zone), | 445 exception_handlers_(local_zone), |
| 455 current_exception_handler_(0), | 446 current_exception_handler_(0), |
| 456 input_buffer_size_(0), | 447 input_buffer_size_(0), |
| 457 input_buffer_(nullptr), | 448 input_buffer_(nullptr), |
| 458 exit_controls_(local_zone) {} | 449 exit_controls_(local_zone) {} |
| 459 | 450 |
| 460 Node* BytecodeGraphBuilder::GetNewTarget() { | 451 Node* BytecodeGraphBuilder::GetNewTarget() { |
| 461 if (!new_target_.is_set()) { | 452 if (!new_target_.is_set()) { |
| 462 int params = bytecode_array()->parameter_count(); | 453 int params = bytecode_array()->parameter_count(); |
| (...skipping 1230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1693 // Phi does not exist yet, introduce one. | 1684 // Phi does not exist yet, introduce one. |
| 1694 value = NewPhi(inputs, value, control); | 1685 value = NewPhi(inputs, value, control); |
| 1695 value->ReplaceInput(inputs - 1, other); | 1686 value->ReplaceInput(inputs - 1, other); |
| 1696 } | 1687 } |
| 1697 return value; | 1688 return value; |
| 1698 } | 1689 } |
| 1699 | 1690 |
| 1700 } // namespace compiler | 1691 } // namespace compiler |
| 1701 } // namespace internal | 1692 } // namespace internal |
| 1702 } // namespace v8 | 1693 } // namespace v8 |
| OLD | NEW |