diff options
Diffstat (limited to 'deps/v8/src/interpreter/bytecode-register-optimizer.cc')
-rw-r--r-- | deps/v8/src/interpreter/bytecode-register-optimizer.cc | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/deps/v8/src/interpreter/bytecode-register-optimizer.cc b/deps/v8/src/interpreter/bytecode-register-optimizer.cc index 583d99c227..859f0e1828 100644 --- a/deps/v8/src/interpreter/bytecode-register-optimizer.cc +++ b/deps/v8/src/interpreter/bytecode-register-optimizer.cc @@ -207,14 +207,10 @@ BytecodeRegisterOptimizer::BytecodeRegisterOptimizer( // Calculate offset so register index values can be mapped into // a vector of register metadata. - if (parameter_count != 0) { - register_info_table_offset_ = - -Register::FromParameterIndex(0, parameter_count).index(); - } else { - // TODO(oth): This path shouldn't be necessary in bytecode generated - // from Javascript, but a set of tests do not include the JS receiver. - register_info_table_offset_ = -accumulator_.index(); - } + // There is at least one parameter, which is the JS receiver. + DCHECK(parameter_count != 0); + register_info_table_offset_ = + -Register::FromParameterIndex(0, parameter_count).index(); // Initialize register map for parameters, locals, and the // accumulator. @@ -322,6 +318,15 @@ void BytecodeRegisterOptimizer::AddToEquivalenceSet( void BytecodeRegisterOptimizer::RegisterTransfer(RegisterInfo* input_info, RegisterInfo* output_info) { + bool output_is_observable = + RegisterIsObservable(output_info->register_value()); + bool in_same_equivalence_set = + output_info->IsInSameEquivalenceSet(input_info); + if (in_same_equivalence_set && + (!output_is_observable || output_info->materialized())) { + return; // Nothing more to do. + } + // Materialize an alternate in the equivalence set that // |output_info| is leaving. if (output_info->materialized()) { @@ -329,12 +334,10 @@ void BytecodeRegisterOptimizer::RegisterTransfer(RegisterInfo* input_info, } // Add |output_info| to new equivalence set. - if (!output_info->IsInSameEquivalenceSet(input_info)) { + if (!in_same_equivalence_set) { AddToEquivalenceSet(input_info, output_info); } - bool output_is_observable = - RegisterIsObservable(output_info->register_value()); if (output_is_observable) { // Force store to be emitted when register is observable. output_info->set_materialized(false); |