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 |