Index: runtime/vm/intermediate_language.cc |
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc |
index cfb7622d3a7f58b48206093d101e2b65f94acd93..a91c26be2a5ab27d2e3196ac79b315e9b112d125 100644 |
--- a/runtime/vm/intermediate_language.cc |
+++ b/runtime/vm/intermediate_language.cc |
@@ -1084,10 +1084,20 @@ bool BlockEntryInstr::DiscoverBlock(BlockEntryInstr* predecessor, |
} |
+void GraphEntryInstr::PruneUnreachableForOSR(Zone* zone, |
+ intptr_t max_block_id) { |
+ ASSERT(osr_id_ != Compiler::kNoOSRDeoptId); |
+ BitVector* block_marks = new (zone) BitVector(zone, max_block_id + 1); |
+ bool found = PruneUnreachable(this, /*parent=*/NULL, block_marks); |
+ ASSERT(found); |
+} |
+ |
+ |
bool BlockEntryInstr::PruneUnreachable(GraphEntryInstr* graph_entry, |
Instruction* parent, |
- intptr_t osr_id, |
BitVector* block_marks) { |
+ const intptr_t osr_id = graph_entry->osr_id(); |
+ |
// Search for the instruction with the OSR id. Use a depth first search |
// because basic blocks have not been discovered yet. Prune unreachable |
// blocks by replacing the normal entry with a jump to the block |
@@ -1121,7 +1131,7 @@ bool BlockEntryInstr::PruneUnreachable(GraphEntryInstr* graph_entry, |
// Recursively search the successors. |
for (intptr_t i = instr->SuccessorCount() - 1; i >= 0; --i) { |
- if (instr->SuccessorAt(i)->PruneUnreachable(graph_entry, instr, osr_id, |
+ if (instr->SuccessorAt(i)->PruneUnreachable(graph_entry, instr, |
block_marks)) { |
return true; |
} |
@@ -2066,6 +2076,22 @@ Definition* RedefinitionInstr::Canonicalize(FlowGraph* flow_graph) { |
} |
+Instruction* CheckStackOverflowInstr::Canonicalize(FlowGraph* flow_graph) { |
+ switch (kind_) { |
+ case kOsrAndPreemption: |
+ return this; |
+ case kOsrOnly: |
+ // Don't need OSR entries in the optimized code. |
+ return NULL; |
+ } |
+ |
+ // Switch above exhausts all possibilities but some compilers can't figure |
+ // it out. |
+ UNREACHABLE(); |
+ return this; |
+} |
+ |
+ |
bool LoadFieldInstr::IsImmutableLengthLoad() const { |
switch (recognized_kind()) { |
case MethodRecognizer::kObjectArrayLength: |