OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
6 #include "src/compiler/generic-node-inl.h" | 6 #include "src/compiler/generic-node-inl.h" |
7 #include "src/compiler/graph.h" | 7 #include "src/compiler/graph.h" |
8 #include "src/compiler/instruction.h" | 8 #include "src/compiler/instruction.h" |
9 #include "src/macro-assembler.h" | 9 #include "src/macro-assembler.h" |
10 | 10 |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 BasicBlock::RpoNumber rpo_number) const { | 366 BasicBlock::RpoNumber rpo_number) const { |
367 size_t j = 0; | 367 size_t j = 0; |
368 for (InstructionBlock::Predecessors::const_iterator i = predecessors_.begin(); | 368 for (InstructionBlock::Predecessors::const_iterator i = predecessors_.begin(); |
369 i != predecessors_.end(); ++i, ++j) { | 369 i != predecessors_.end(); ++i, ++j) { |
370 if (*i == rpo_number) break; | 370 if (*i == rpo_number) break; |
371 } | 371 } |
372 return j; | 372 return j; |
373 } | 373 } |
374 | 374 |
375 | 375 |
376 static void InitializeInstructionBlocks(Zone* zone, const Schedule* schedule, | 376 InstructionBlocks* InstructionSequence::InstructionBlocksFor( |
377 InstructionBlocks* blocks) { | 377 Zone* zone, const Schedule* schedule) { |
378 DCHECK(blocks->size() == schedule->rpo_order()->size()); | 378 InstructionBlocks* blocks = zone->NewArray<InstructionBlocks>(1); |
| 379 new (blocks) InstructionBlocks( |
| 380 static_cast<int>(schedule->rpo_order()->size()), NULL, zone); |
379 size_t rpo_number = 0; | 381 size_t rpo_number = 0; |
380 for (BasicBlockVector::const_iterator it = schedule->rpo_order()->begin(); | 382 for (BasicBlockVector::const_iterator it = schedule->rpo_order()->begin(); |
381 it != schedule->rpo_order()->end(); ++it, ++rpo_number) { | 383 it != schedule->rpo_order()->end(); ++it, ++rpo_number) { |
382 DCHECK_EQ(NULL, (*blocks)[rpo_number]); | 384 DCHECK_EQ(NULL, (*blocks)[rpo_number]); |
383 DCHECK((*it)->GetRpoNumber().ToSize() == rpo_number); | 385 DCHECK((*it)->GetRpoNumber().ToSize() == rpo_number); |
384 (*blocks)[rpo_number] = new (zone) InstructionBlock(zone, *it); | 386 (*blocks)[rpo_number] = new (zone) InstructionBlock(zone, *it); |
385 } | 387 } |
| 388 return blocks; |
386 } | 389 } |
387 | 390 |
388 | 391 |
389 InstructionSequence::InstructionSequence(Zone* instruction_zone, | 392 InstructionSequence::InstructionSequence(Zone* instruction_zone, |
390 const Schedule* schedule) | 393 InstructionBlocks* instruction_blocks) |
391 : zone_(instruction_zone), | 394 : zone_(instruction_zone), |
392 instruction_blocks_(static_cast<int>(schedule->rpo_order()->size()), NULL, | 395 instruction_blocks_(instruction_blocks), |
393 zone()), | |
394 constants_(ConstantMap::key_compare(), | 396 constants_(ConstantMap::key_compare(), |
395 ConstantMap::allocator_type(zone())), | 397 ConstantMap::allocator_type(zone())), |
396 immediates_(zone()), | 398 immediates_(zone()), |
397 instructions_(zone()), | 399 instructions_(zone()), |
398 next_virtual_register_(0), | 400 next_virtual_register_(0), |
399 pointer_maps_(zone()), | 401 pointer_maps_(zone()), |
400 doubles_(std::less<int>(), VirtualRegisterSet::allocator_type(zone())), | 402 doubles_(std::less<int>(), VirtualRegisterSet::allocator_type(zone())), |
401 references_(std::less<int>(), VirtualRegisterSet::allocator_type(zone())), | 403 references_(std::less<int>(), VirtualRegisterSet::allocator_type(zone())), |
402 deoptimization_entries_(zone()) { | 404 deoptimization_entries_(zone()) {} |
403 InitializeInstructionBlocks(zone(), schedule, &instruction_blocks_); | |
404 } | |
405 | 405 |
406 | 406 |
407 Label* InstructionSequence::GetLabel(BasicBlock::RpoNumber rpo) { | 407 Label* InstructionSequence::GetLabel(BasicBlock::RpoNumber rpo) { |
408 return GetBlockStart(rpo)->label(); | 408 return GetBlockStart(rpo)->label(); |
409 } | 409 } |
410 | 410 |
411 | 411 |
412 BlockStartInstruction* InstructionSequence::GetBlockStart( | 412 BlockStartInstruction* InstructionSequence::GetBlockStart( |
413 BasicBlock::RpoNumber rpo) { | 413 BasicBlock::RpoNumber rpo) { |
414 InstructionBlock* block = InstructionBlockAt(rpo); | 414 InstructionBlock* block = InstructionBlockAt(rpo); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 } | 454 } |
455 | 455 |
456 | 456 |
457 const InstructionBlock* InstructionSequence::GetInstructionBlock( | 457 const InstructionBlock* InstructionSequence::GetInstructionBlock( |
458 int instruction_index) const { | 458 int instruction_index) const { |
459 // TODO(turbofan): Optimize this. | 459 // TODO(turbofan): Optimize this. |
460 for (;;) { | 460 for (;;) { |
461 DCHECK_LE(0, instruction_index); | 461 DCHECK_LE(0, instruction_index); |
462 Instruction* instruction = InstructionAt(instruction_index--); | 462 Instruction* instruction = InstructionAt(instruction_index--); |
463 if (instruction->IsBlockStart()) { | 463 if (instruction->IsBlockStart()) { |
464 return instruction_blocks_ | 464 return instruction_blocks_->at( |
465 [BlockStartInstruction::cast(instruction)->rpo_number().ToSize()]; | 465 BlockStartInstruction::cast(instruction)->rpo_number().ToSize()); |
466 } | 466 } |
467 } | 467 } |
468 } | 468 } |
469 | 469 |
470 | 470 |
471 bool InstructionSequence::IsReference(int virtual_register) const { | 471 bool InstructionSequence::IsReference(int virtual_register) const { |
472 return references_.find(virtual_register) != references_.end(); | 472 return references_.find(virtual_register) != references_.end(); |
473 } | 473 } |
474 | 474 |
475 | 475 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 os << " B" << succ_block->id(); | 645 os << " B" << succ_block->id(); |
646 } | 646 } |
647 os << "\n"; | 647 os << "\n"; |
648 } | 648 } |
649 return os; | 649 return os; |
650 } | 650 } |
651 | 651 |
652 } // namespace compiler | 652 } // namespace compiler |
653 } // namespace internal | 653 } // namespace internal |
654 } // namespace v8 | 654 } // namespace v8 |
OLD | NEW |