summaryrefslogtreecommitdiff
path: root/deps/v8/src/interpreter/bytecode-register-optimizer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/interpreter/bytecode-register-optimizer.cc')
-rw-r--r--deps/v8/src/interpreter/bytecode-register-optimizer.cc25
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);