Index: src/compiler/instruction-selector.cc |
diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc |
index 29a3181c13278408b2f53fe6c3a149d801c7831b..dfd4b09d1bf3c7fa217dec30bc172f304f7e8004 100644 |
--- a/src/compiler/instruction-selector.cc |
+++ b/src/compiler/instruction-selector.cc |
@@ -828,7 +828,11 @@ bool InstructionSelector::IsSourcePositionUsed(Node* node) { |
void InstructionSelector::VisitBlock(BasicBlock* block) { |
DCHECK(!current_block_); |
current_block_ = block; |
- int current_block_end = static_cast<int>(instructions_.size()); |
+ auto current_num_instructions = [&] { |
+ DCHECK_GE(kMaxInt, instructions_.size()); |
+ return static_cast<int>(instructions_.size()); |
+ }; |
+ int current_block_end = current_num_instructions(); |
int effect_level = 0; |
for (Node* const node : *block) { |
@@ -847,10 +851,25 @@ void InstructionSelector::VisitBlock(BasicBlock* block) { |
SetEffectLevel(block->control_input(), effect_level); |
} |
+ auto FinishEmittedInstructions = [&](Node* node, int instruction_start) { |
+ if (instruction_selection_failed()) return false; |
+ if (current_num_instructions() == instruction_start) return true; |
+ std::reverse(instructions_.begin() + instruction_start, |
+ instructions_.end()); |
+ if (!node) return true; |
+ SourcePosition source_position = source_positions_->GetSourcePosition(node); |
+ if (source_position.IsKnown() && IsSourcePositionUsed(node)) { |
+ sequence()->SetSourcePosition(instructions_[instruction_start], |
+ source_position); |
+ } |
+ return true; |
+ }; |
+ |
// Generate code for the block control "top down", but schedule the code |
// "bottom up". |
VisitControl(block); |
- std::reverse(instructions_.begin() + current_block_end, instructions_.end()); |
+ if (!FinishEmittedInstructions(block->control_input(), current_block_end)) |
+ return; |
// Visit code in reverse control flow order, because architecture-specific |
// matching may cover more than one node at a time. |
@@ -859,17 +878,9 @@ void InstructionSelector::VisitBlock(BasicBlock* block) { |
if (!IsUsed(node) || IsDefined(node)) continue; |
// Generate code for this node "top down", but schedule the code "bottom |
// up". |
- size_t current_node_end = instructions_.size(); |
+ int current_node_end = current_num_instructions(); |
VisitNode(node); |
- if (instruction_selection_failed()) return; |
- std::reverse(instructions_.begin() + current_node_end, instructions_.end()); |
- if (instructions_.size() == current_node_end) continue; |
- // Mark source position on first instruction emitted. |
- SourcePosition source_position = source_positions_->GetSourcePosition(node); |
- if (source_position.IsKnown() && IsSourcePositionUsed(node)) { |
- sequence()->SetSourcePosition(instructions_[current_node_end], |
- source_position); |
- } |
+ if (!FinishEmittedInstructions(node, current_node_end)) return; |
} |
// We're done with the block. |