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

Unified Diff: src/compiler/ast-graph-builder.cc

Issue 2384113002: [turbofan] Osr value typing + dynamic type checks on entry. (Closed)
Patch Set: Fix liveness block Created 4 years, 2 months 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 | « no previous file | src/compiler/bytecode-graph-builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/ast-graph-builder.cc
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
index b292a2e49efd8e26020d9ad36a8ea96f1e150cc6..0577feaf22782ed3bf77fcd241cca4bdf913ad85 100644
--- a/src/compiler/ast-graph-builder.cc
+++ b/src/compiler/ast-graph-builder.cc
@@ -788,8 +788,10 @@ AstGraphBuilder::Environment::CopyAsUnreachable() {
}
AstGraphBuilder::Environment* AstGraphBuilder::Environment::CopyForOsrEntry() {
- return new (zone())
- Environment(this, builder_->liveness_analyzer()->NewBlock());
+ LivenessAnalyzerBlock* copy_block =
+ liveness_block() == nullptr ? nullptr
+ : builder_->liveness_analyzer()->NewBlock();
+ return new (zone()) Environment(this, copy_block);
}
AstGraphBuilder::Environment*
@@ -4202,27 +4204,47 @@ void AstGraphBuilder::Environment::PrepareForOsrEntry() {
graph->start(), graph->start());
UpdateControlDependency(osr_loop_entry);
UpdateEffectDependency(osr_loop_entry);
+
// Set OSR values.
for (int i = 0; i < size; ++i) {
values()->at(i) =
graph->NewNode(builder_->common()->OsrValue(i), osr_loop_entry);
}
- // Set the contexts.
+ // Set the innermost context.
+ const Operator* op_inner =
+ builder_->common()->OsrValue(Linkage::kOsrContextSpillSlotIndex);
+ contexts()->back() = graph->NewNode(op_inner, osr_loop_entry);
+
+ // Create a checkpoint.
+ Node* frame_state = Checkpoint(builder_->info()->osr_ast_id());
+ Node* checkpoint = graph->NewNode(common()->Checkpoint(), frame_state,
+ osr_loop_entry, osr_loop_entry);
+ UpdateEffectDependency(checkpoint);
+
+ // Create the OSR guard nodes.
+ const Operator* guard_op =
+ builder_->common()->OsrGuard(OsrGuardType::kUninitialized);
+ Node* effect = checkpoint;
+ for (int i = 0; i < size; ++i) {
+ values()->at(i) = effect =
+ graph->NewNode(guard_op, values()->at(i), effect, osr_loop_entry);
+ }
+ contexts()->back() = effect =
+ graph->NewNode(guard_op, contexts()->back(), effect, osr_loop_entry);
+
// The innermost context is the OSR value, and the outer contexts are
// reconstructed by dynamically walking up the context chain.
- Node* osr_context = nullptr;
- const Operator* op =
+ const Operator* load_op =
builder_->javascript()->LoadContext(0, Context::PREVIOUS_INDEX, true);
- const Operator* op_inner =
- builder_->common()->OsrValue(Linkage::kOsrContextSpillSlotIndex);
+ Node* osr_context = effect = contexts()->back();
int last = static_cast<int>(contexts()->size() - 1);
- for (int i = last; i >= 0; i--) {
- osr_context = (i == last) ? graph->NewNode(op_inner, osr_loop_entry)
- : graph->NewNode(op, osr_context, osr_context,
- osr_loop_entry);
+ for (int i = last - 1; i >= 0; i--) {
+ osr_context = effect =
+ graph->NewNode(load_op, osr_context, effect, osr_loop_entry);
contexts()->at(i) = osr_context;
}
+ UpdateEffectDependency(effect);
}
void AstGraphBuilder::Environment::PrepareForLoop(BitVector* assigned) {
« no previous file with comments | « no previous file | src/compiler/bytecode-graph-builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698