Index: src/compiler/instruction.cc |
diff --git a/src/compiler/instruction.cc b/src/compiler/instruction.cc |
index b02f637c5b0481f870714d410fa9cac5b3547065..74a0d3fb3ca918f83f56082b816b86df4bc44d68 100644 |
--- a/src/compiler/instruction.cc |
+++ b/src/compiler/instruction.cc |
@@ -317,12 +317,75 @@ std::ostream& operator<<(std::ostream& os, const Constant& constant) { |
} |
+static BasicBlock::RpoNumber GetRpo(BasicBlock* block) { |
+ if (block == NULL) return BasicBlock::RpoNumber::Invalid(); |
+ return block->GetRpoNumber(); |
+} |
+ |
+ |
+static BasicBlock::RpoNumber GetLoopEndRpo(const BasicBlock* block) { |
+ if (!block->IsLoopHeader()) return BasicBlock::RpoNumber::Invalid(); |
+ return BasicBlock::RpoNumber::FromInt(block->loop_end()); |
+} |
+ |
+ |
+InstructionBlock::InstructionBlock(Zone* zone, const BasicBlock* block) |
+ : successors_(block->SuccessorCount(), BasicBlock::RpoNumber::Invalid(), |
+ zone), |
+ predecessors_(block->PredecessorCount(), BasicBlock::RpoNumber::Invalid(), |
+ zone), |
+ phis_(zone), |
+ rpo_number_(block->GetRpoNumber()), |
+ loop_header_(GetRpo(block->loop_header())), |
+ loop_end_(GetLoopEndRpo(block)), |
+ code_start_(-1), |
+ code_end_(-1) { |
+ // Map successors and precessors |
+ size_t index = 0; |
+ for (BasicBlock::Successors::const_iterator it = block->successors_begin(); |
+ it != block->successors_end(); ++it, ++index) { |
+ successors_[index] = (*it)->GetRpoNumber(); |
+ } |
+ index = 0; |
+ for (BasicBlock::Predecessors::const_iterator |
+ it = block->predecessors_begin(); |
+ it != block->predecessors_end(); ++it, ++index) { |
+ predecessors_[index] = (*it)->GetRpoNumber(); |
+ } |
+} |
+ |
+ |
+size_t InstructionBlock::PredecessorIndexOf( |
+ BasicBlock::RpoNumber rpo_number) const { |
+ size_t j = 0; |
+ for (InstructionBlock::Predecessors::const_iterator i = predecessors_.begin(); |
+ i != predecessors_.end(); ++i, ++j) { |
+ if (*i == rpo_number) break; |
+ } |
+ return j; |
+} |
+ |
+ |
+static void InitializeInstructionBlocks(Zone* zone, const Schedule* schedule, |
+ InstructionBlocks* blocks) { |
+ DCHECK(blocks->size() == schedule->rpo_order()->size()); |
+ size_t rpo_number = 0; |
+ for (BasicBlockVector::const_iterator it = schedule->rpo_order()->begin(); |
+ it != schedule->rpo_order()->end(); ++it, ++rpo_number) { |
+ DCHECK_EQ(NULL, (*blocks)[rpo_number]); |
+ DCHECK((*it)->GetRpoNumber().ToSize() == rpo_number); |
+ (*blocks)[rpo_number] = new (zone) InstructionBlock(zone, *it); |
+ } |
+} |
+ |
+ |
InstructionSequence::InstructionSequence(Linkage* linkage, Graph* graph, |
Schedule* schedule) |
- : zone_(schedule->zone()), |
+ : zone_(schedule->zone()), // TODO(dcarney): new zone. |
node_count_(graph->NodeCount()), |
node_map_(zone()->NewArray<int>(node_count_)), |
- block_data_(static_cast<int>(schedule->BasicBlockCount()), zone()), |
+ instruction_blocks_(static_cast<int>(schedule->rpo_order()->size()), NULL, |
+ zone()), |
linkage_(linkage), |
schedule_(schedule), |
constants_(ConstantMap::key_compare(), |
@@ -337,6 +400,7 @@ InstructionSequence::InstructionSequence(Linkage* linkage, Graph* graph, |
for (int i = 0; i < node_count_; ++i) { |
node_map_[i] = -1; |
} |
+ InitializeInstructionBlocks(zone(), schedule, &instruction_blocks_); |
} |
@@ -408,6 +472,20 @@ BasicBlock* InstructionSequence::GetBasicBlock(int instruction_index) { |
} |
+const InstructionBlock* InstructionSequence::GetInstructionBlock( |
+ int instruction_index) const { |
+ // TODO(turbofan): Optimize this. |
+ for (;;) { |
+ DCHECK_LE(0, instruction_index); |
+ Instruction* instruction = InstructionAt(instruction_index--); |
+ if (instruction->IsBlockStart()) { |
+ return instruction_blocks_ |
+ [BlockStartInstruction::cast(instruction)->rpo_number().ToSize()]; |
+ } |
+ } |
+} |
+ |
+ |
bool InstructionSequence::IsReference(int virtual_register) const { |
return references_.find(virtual_register) != references_.end(); |
} |