Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/interpreter/bytecode-register-optimizer.h" | 5 #include "src/interpreter/bytecode-register-optimizer.h" |
| 6 | 6 |
| 7 namespace v8 { | 7 namespace v8 { |
| 8 namespace internal { | 8 namespace internal { |
| 9 namespace interpreter { | 9 namespace interpreter { |
| 10 | 10 |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 239 // Walk equivalents of materialized registers, materializing | 239 // Walk equivalents of materialized registers, materializing |
| 240 // each equivalent register as necessary and placing in their | 240 // each equivalent register as necessary and placing in their |
| 241 // own equivalence set. | 241 // own equivalence set. |
| 242 RegisterInfo* equivalent; | 242 RegisterInfo* equivalent; |
| 243 while ((equivalent = reg_info->GetEquivalent()) != reg_info) { | 243 while ((equivalent = reg_info->GetEquivalent()) != reg_info) { |
| 244 if (equivalent->allocated() && !equivalent->materialized()) { | 244 if (equivalent->allocated() && !equivalent->materialized()) { |
| 245 OutputRegisterTransfer(reg_info, equivalent); | 245 OutputRegisterTransfer(reg_info, equivalent); |
| 246 } | 246 } |
| 247 equivalent->MoveToNewEquivalenceSet(NextEquivalenceId(), true); | 247 equivalent->MoveToNewEquivalenceSet(NextEquivalenceId(), true); |
| 248 } | 248 } |
| 249 } else if (reg_info->GetEquivalent() == reg_info) { | |
| 250 reg_info->MoveToNewEquivalenceSet(NextEquivalenceId(), true); | |
|
rmcilroy
2017/06/01 10:44:44
Why do these need moved here? If it's because they
Jarin
2017/06/01 12:48:22
Yes, it's because they do not count as materialize
| |
| 249 } | 251 } |
| 250 } | 252 } |
| 251 | 253 |
| 252 flush_required_ = false; | 254 flush_required_ = false; |
| 253 } | 255 } |
| 254 | 256 |
| 255 void BytecodeRegisterOptimizer::OutputRegisterTransfer( | 257 void BytecodeRegisterOptimizer::OutputRegisterTransfer( |
| 256 RegisterInfo* input_info, RegisterInfo* output_info) { | 258 RegisterInfo* input_info, RegisterInfo* output_info) { |
| 257 Register input = input_info->register_value(); | 259 Register input = input_info->register_value(); |
| 258 Register output = output_info->register_value(); | 260 Register output = output_info->register_value(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 297 Materialize(info); | 299 Materialize(info); |
| 298 result = info; | 300 result = info; |
| 299 } | 301 } |
| 300 DCHECK(result->register_value() != accumulator_); | 302 DCHECK(result->register_value() != accumulator_); |
| 301 return result; | 303 return result; |
| 302 } | 304 } |
| 303 | 305 |
| 304 void BytecodeRegisterOptimizer::Materialize(RegisterInfo* info) { | 306 void BytecodeRegisterOptimizer::Materialize(RegisterInfo* info) { |
| 305 if (!info->materialized()) { | 307 if (!info->materialized()) { |
| 306 RegisterInfo* materialized = info->GetMaterializedEquivalent(); | 308 RegisterInfo* materialized = info->GetMaterializedEquivalent(); |
| 309 DCHECK_NOT_NULL(materialized); | |
| 307 OutputRegisterTransfer(materialized, info); | 310 OutputRegisterTransfer(materialized, info); |
| 308 } | 311 } |
| 309 } | 312 } |
| 310 | 313 |
| 311 void BytecodeRegisterOptimizer::AddToEquivalenceSet( | 314 void BytecodeRegisterOptimizer::AddToEquivalenceSet( |
| 312 RegisterInfo* set_member, RegisterInfo* non_set_member) { | 315 RegisterInfo* set_member, RegisterInfo* non_set_member) { |
| 313 non_set_member->AddToEquivalenceSetOf(set_member); | 316 non_set_member->AddToEquivalenceSetOf(set_member); |
| 314 // Flushing is only required when two or more registers are placed | 317 // Flushing is only required when two or more registers are placed |
| 315 // in the same equivalence set. | 318 // in the same equivalence set. |
| 316 flush_required_ = true; | 319 flush_required_ = true; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 433 void BytecodeRegisterOptimizer::RegisterListFreeEvent(RegisterList reg_list) { | 436 void BytecodeRegisterOptimizer::RegisterListFreeEvent(RegisterList reg_list) { |
| 434 int first_index = reg_list.first_register().index(); | 437 int first_index = reg_list.first_register().index(); |
| 435 for (int i = 0; i < reg_list.register_count(); i++) { | 438 for (int i = 0; i < reg_list.register_count(); i++) { |
| 436 GetRegisterInfo(Register(first_index + i))->set_allocated(false); | 439 GetRegisterInfo(Register(first_index + i))->set_allocated(false); |
| 437 } | 440 } |
| 438 } | 441 } |
| 439 | 442 |
| 440 } // namespace interpreter | 443 } // namespace interpreter |
| 441 } // namespace internal | 444 } // namespace internal |
| 442 } // namespace v8 | 445 } // namespace v8 |
| OLD | NEW |