Index: src/compiler/instruction.cc |
diff --git a/src/compiler/instruction.cc b/src/compiler/instruction.cc |
index d43d669007263c7a2e5d3f43ce9e77d7b97e205c..a21bf48e29c0f5b5cf3de17dbbfc91f7c83d7437 100644 |
--- a/src/compiler/instruction.cc |
+++ b/src/compiler/instruction.cc |
@@ -251,17 +251,16 @@ ExplicitOperand::ExplicitOperand(LocationKind kind, MachineRepresentation rep, |
DoubleRegister::from_code(index).IsAllocatable()); |
} |
- |
Instruction::Instruction(InstructionCode opcode) |
: opcode_(opcode), |
bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) | |
TempCountField::encode(0) | IsCallField::encode(false)), |
- reference_map_(nullptr) { |
+ reference_map_(nullptr), |
+ block_(nullptr) { |
parallel_moves_[0] = nullptr; |
parallel_moves_[1] = nullptr; |
} |
- |
Instruction::Instruction(InstructionCode opcode, size_t output_count, |
InstructionOperand* outputs, size_t input_count, |
InstructionOperand* inputs, size_t temp_count, |
@@ -271,7 +270,8 @@ Instruction::Instruction(InstructionCode opcode, size_t output_count, |
InputCountField::encode(input_count) | |
TempCountField::encode(temp_count) | |
IsCallField::encode(false)), |
- reference_map_(nullptr) { |
+ reference_map_(nullptr), |
+ block_(nullptr) { |
parallel_moves_[0] = nullptr; |
parallel_moves_[1] = nullptr; |
size_t offset = 0; |
@@ -611,7 +611,6 @@ static InstructionBlock* InstructionBlockFor(Zone* zone, |
return instr_block; |
} |
- |
InstructionBlocks* InstructionSequence::InstructionBlocksFor( |
Zone* zone, const Schedule* schedule) { |
InstructionBlocks* blocks = zone->NewArray<InstructionBlocks>(1); |
@@ -683,7 +682,6 @@ void InstructionSequence::ComputeAssemblyOrder(InstructionBlocks* blocks) { |
} |
} |
- |
InstructionSequence::InstructionSequence(Isolate* isolate, |
Zone* instruction_zone, |
InstructionBlocks* instruction_blocks) |
@@ -691,7 +689,6 @@ InstructionSequence::InstructionSequence(Isolate* isolate, |
zone_(instruction_zone), |
instruction_blocks_(instruction_blocks), |
source_positions_(zone()), |
- block_starts_(zone()), |
constants_(ConstantMap::key_compare(), |
ConstantMap::allocator_type(zone())), |
immediates_(zone()), |
@@ -699,10 +696,8 @@ InstructionSequence::InstructionSequence(Isolate* isolate, |
next_virtual_register_(0), |
reference_maps_(zone()), |
representations_(zone()), |
- deoptimization_entries_(zone()) { |
- block_starts_.reserve(instruction_blocks_->size()); |
-} |
- |
+ deoptimization_entries_(zone()), |
+ current_block_(nullptr) {} |
int InstructionSequence::NextVirtualRegister() { |
int virtual_register = next_virtual_register_++; |
@@ -718,28 +713,31 @@ Instruction* InstructionSequence::GetBlockStart(RpoNumber rpo) const { |
void InstructionSequence::StartBlock(RpoNumber rpo) { |
- DCHECK(block_starts_.size() == rpo.ToSize()); |
- InstructionBlock* block = InstructionBlockAt(rpo); |
+ DCHECK_NULL(current_block_); |
+ current_block_ = InstructionBlockAt(rpo); |
int code_start = static_cast<int>(instructions_.size()); |
- block->set_code_start(code_start); |
- block_starts_.push_back(code_start); |
+ current_block_->set_code_start(code_start); |
} |
void InstructionSequence::EndBlock(RpoNumber rpo) { |
int end = static_cast<int>(instructions_.size()); |
- InstructionBlock* block = InstructionBlockAt(rpo); |
- if (block->code_start() == end) { // Empty block. Insert a nop. |
+ DCHECK_EQ(current_block_->rpo_number(), rpo); |
+ if (current_block_->code_start() == end) { // Empty block. Insert a nop. |
AddInstruction(Instruction::New(zone(), kArchNop)); |
end = static_cast<int>(instructions_.size()); |
} |
- DCHECK(block->code_start() >= 0 && block->code_start() < end); |
- block->set_code_end(end); |
+ DCHECK(current_block_->code_start() >= 0 && |
+ current_block_->code_start() < end); |
+ current_block_->set_code_end(end); |
+ current_block_ = nullptr; |
} |
int InstructionSequence::AddInstruction(Instruction* instr) { |
+ DCHECK_NOT_NULL(current_block_); |
int index = static_cast<int>(instructions_.size()); |
+ instr->set_block(current_block_); |
instructions_.push_back(instr); |
if (instr->NeedsReferenceMap()) { |
DCHECK(instr->reference_map() == nullptr); |
@@ -754,18 +752,7 @@ int InstructionSequence::AddInstruction(Instruction* instr) { |
InstructionBlock* InstructionSequence::GetInstructionBlock( |
int instruction_index) const { |
- DCHECK(instruction_blocks_->size() == block_starts_.size()); |
- auto begin = block_starts_.begin(); |
- auto end = std::lower_bound(begin, block_starts_.end(), instruction_index); |
- // Post condition of std::lower_bound: |
- DCHECK(end == block_starts_.end() || *end >= instruction_index); |
- if (end == block_starts_.end() || *end > instruction_index) --end; |
- DCHECK(*end <= instruction_index); |
- size_t index = std::distance(begin, end); |
- InstructionBlock* block = instruction_blocks_->at(index); |
- DCHECK(block->code_start() <= instruction_index && |
- instruction_index < block->code_end()); |
- return block; |
+ return instructions()[instruction_index]->block(); |
} |