Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Unified Diff: src/compiler/instruction.cc

Issue 707803002: [turbofan] move label generation to code generator (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler/instruction.cc
diff --git a/src/compiler/instruction.cc b/src/compiler/instruction.cc
index 218130c686c585f8de4456a18522916f9c2a660b..f106541ac34c29f00794ee70a24032c07be7a357 100644
--- a/src/compiler/instruction.cc
+++ b/src/compiler/instruction.cc
@@ -420,6 +420,7 @@ InstructionSequence::InstructionSequence(Zone* instruction_zone,
InstructionBlocks* instruction_blocks)
: zone_(instruction_zone),
instruction_blocks_(instruction_blocks),
+ block_starts_(static_cast<int>(instruction_blocks_->size()), -1, zone()),
constants_(ConstantMap::key_compare(),
ConstantMap::allocator_type(zone())),
immediates_(zone()),
@@ -431,26 +432,19 @@ InstructionSequence::InstructionSequence(Zone* instruction_zone,
deoptimization_entries_(zone()) {}
-Label* InstructionSequence::GetLabel(BasicBlock::RpoNumber rpo) {
- return GetBlockStart(rpo)->label();
-}
-
-
BlockStartInstruction* InstructionSequence::GetBlockStart(
BasicBlock::RpoNumber rpo) {
InstructionBlock* block = InstructionBlockAt(rpo);
- BlockStartInstruction* block_start =
- BlockStartInstruction::cast(InstructionAt(block->code_start()));
- DCHECK_EQ(rpo.ToInt(), block_start->rpo_number().ToInt());
- return block_start;
+ return BlockStartInstruction::cast(InstructionAt(block->code_start()));
}
void InstructionSequence::StartBlock(BasicBlock::RpoNumber rpo) {
InstructionBlock* block = InstructionBlockAt(rpo);
- block->set_code_start(static_cast<int>(instructions_.size()));
- BlockStartInstruction* block_start =
- BlockStartInstruction::New(zone(), block->id(), rpo);
+ int code_start = static_cast<int>(instructions_.size());
+ block->set_code_start(code_start);
+ block_starts_[rpo.ToSize()] = code_start;
+ BlockStartInstruction* block_start = BlockStartInstruction::New(zone());
AddInstruction(block_start);
}
@@ -483,15 +477,13 @@ int InstructionSequence::AddInstruction(Instruction* instr) {
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_->at(
- BlockStartInstruction::cast(instruction)->rpo_number().ToSize());
- }
- }
+ auto begin = block_starts_.begin();
+ auto end = std::lower_bound(begin, block_starts_.end(), instruction_index,
+ std::less_equal<int>());
+ auto block = instruction_blocks_->at(std::distance(begin, end) - 1);
+ DCHECK(block->code_start() <= instruction_index &&
+ instruction_index < block->code_end());
+ return block;
}

Powered by Google App Engine
This is Rietveld 408576698