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

Unified Diff: runtime/vm/kernel_to_il.cc

Issue 2464953002: Add support for OSR in kernel-based FlowGraphBuilder (Closed)
Patch Set: Created 4 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
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/kernel_to_il.cc
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index 0aff92bde22c049fe019ecf25664c11b8a31faf7..bc8fbf0554fa8658546a958330f4427640c28ad0 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -2647,6 +2647,19 @@ void FlowGraphBuilder::InlineBailout(const char* reason) {
}
+void FlowGraphBuilder::PruneUnreachableIfOSR() {
+ // When compiling for OSR, use a depth first search to prune instructions
+ // unreachable from the OSR entry. Catch entries are always considered
+ // reachable, even if they become unreachable after OSR.
+ if (osr_id_ != Compiler::kNoOSRDeoptId) {
+ BitVector* block_marks = new(Z) BitVector(Z, next_block_id_);
+ bool found = graph_entry_->PruneUnreachable(graph_entry_, NULL, osr_id_,
+ block_marks);
+ ASSERT(found);
+ }
+}
+
+
FlowGraph* FlowGraphBuilder::BuildGraph() {
const dart::Function& function = parsed_function_->function();
@@ -2750,7 +2763,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfFunction(FunctionNode* function,
const Function& dart_function = parsed_function_->function();
TargetEntryInstr* normal_entry = BuildTargetEntry();
graph_entry_ = new (Z)
- GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
+ GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
SetupDefaultParameterValues(function);
@@ -2917,6 +2930,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfFunction(FunctionNode* function,
}
normal_entry->LinkTo(body.entry);
+ PruneUnreachableIfOSR();
Vyacheslav Egorov (Google) 2016/10/31 17:46:37 I think only this one can OSR - inline the functi
kustermann 2016/10/31 18:18:13 Done.
return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
}
@@ -3088,7 +3102,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfFieldAccessor(
TargetEntryInstr* normal_entry = BuildTargetEntry();
graph_entry_ = new (Z)
- GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
+ GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
// TODO(27590): Add support for FLAG_use_field_guards.
Fragment body(normal_entry);
@@ -3126,6 +3140,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfFieldAccessor(
}
body += Return();
+ PruneUnreachableIfOSR();
Vyacheslav Egorov (Google) 2016/10/31 17:46:37 I don't think this and below can be OSRed.
kustermann 2016/10/31 18:18:13 Done.
return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
}
@@ -3138,7 +3153,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfStaticFieldInitializer(
TargetEntryInstr* normal_entry = BuildTargetEntry();
graph_entry_ = new (Z)
- GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
+ GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
Fragment body(normal_entry);
body += CheckStackOverflowInPrologue();
@@ -3149,6 +3164,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfStaticFieldInitializer(
}
body += Return();
+ PruneUnreachableIfOSR();
return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
}
@@ -3192,12 +3208,13 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfMethodExtractor(
TargetEntryInstr* normal_entry = BuildTargetEntry();
graph_entry_ = new (Z)
- GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
+ GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
Fragment body(normal_entry);
body += CheckStackOverflowInPrologue();
body += BuildImplicitClosureCreation(function);
body += Return();
+ PruneUnreachableIfOSR();
return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
}
@@ -3208,7 +3225,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
TargetEntryInstr* normal_entry = BuildTargetEntry();
graph_entry_ = new (Z)
- GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
+ GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
SetupDefaultParameterValues(kernel_function);
Fragment body(normal_entry);
@@ -3248,6 +3265,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
// Return the result.
body += Return();
+ PruneUnreachableIfOSR();
return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
}
@@ -3259,7 +3277,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfNoSuchMethodDispatcher(
TargetEntryInstr* normal_entry = BuildTargetEntry();
graph_entry_ = new (Z)
- GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
+ GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
// The backend will expect an array of default values for all the named
// parameters, even if they are all known to be passed at the call site
@@ -3349,6 +3367,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfNoSuchMethodDispatcher(
body += StaticCall(no_such_method, 2);
body += Return();
+ PruneUnreachableIfOSR();
return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
}
@@ -3393,7 +3412,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher(
TargetEntryInstr* normal_entry = BuildTargetEntry();
graph_entry_ = new (Z)
- GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
+ GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
Fragment body(normal_entry);
body += CheckStackOverflowInPrologue();
@@ -3435,6 +3454,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher(
body += Return();
+ PruneUnreachableIfOSR();
return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
}
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698