| Index: src/compiler/bytecode-graph-builder.cc
|
| diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc
|
| index 634085b8ef8ccd42144a83c4c48ab720618cdf38..7581c1646f56fc6986b16d6a34164154b73e3f30 100644
|
| --- a/src/compiler/bytecode-graph-builder.cc
|
| +++ b/src/compiler/bytecode-graph-builder.cc
|
| @@ -65,8 +65,9 @@ class BytecodeGraphBuilder::Environment : public ZoneObject {
|
|
|
| Environment* CopyForConditional();
|
| Environment* CopyForLoop();
|
| + Environment* CopyForOsrEntry();
|
| void Merge(Environment* other);
|
| - void PrepareForOsr();
|
| + void PrepareForOsrEntry();
|
|
|
| void PrepareForLoopExit(Node* loop);
|
|
|
| @@ -346,6 +347,12 @@ BytecodeGraphBuilder::Environment::CopyForLoop() {
|
| }
|
|
|
| BytecodeGraphBuilder::Environment*
|
| +BytecodeGraphBuilder::Environment::CopyForOsrEntry() {
|
| + return new (zone())
|
| + Environment(this, builder_->liveness_analyzer()->NewBlock());
|
| +}
|
| +
|
| +BytecodeGraphBuilder::Environment*
|
| BytecodeGraphBuilder::Environment::CopyForConditional() {
|
| LivenessAnalyzerBlock* copy_liveness_block = nullptr;
|
| if (liveness_block() != nullptr) {
|
| @@ -409,34 +416,27 @@ void BytecodeGraphBuilder::Environment::PrepareForLoop() {
|
| builder()->exit_controls_.push_back(terminate);
|
| }
|
|
|
| -void BytecodeGraphBuilder::Environment::PrepareForOsr() {
|
| +void BytecodeGraphBuilder::Environment::PrepareForOsrEntry() {
|
| DCHECK_EQ(IrOpcode::kLoop, GetControlDependency()->opcode());
|
| DCHECK_EQ(1, GetControlDependency()->InputCount());
|
| +
|
| Node* start = graph()->start();
|
|
|
| - // Create a control node for the OSR entry point and merge it into the loop
|
| - // header. Update the current environment's control dependency accordingly.
|
| + // Create a control node for the OSR entry point and update the current
|
| + // environment's dependencies accordingly.
|
| Node* entry = graph()->NewNode(common()->OsrLoopEntry(), start, start);
|
| - Node* control = builder()->MergeControl(GetControlDependency(), entry);
|
| - UpdateControlDependency(control);
|
| -
|
| - // Create a merge of the effect from the OSR entry and the existing effect
|
| - // dependency. Update the current environment's effect dependency accordingly.
|
| - Node* effect = builder()->MergeEffect(GetEffectDependency(), entry, control);
|
| - UpdateEffectDependency(effect);
|
| + UpdateControlDependency(entry);
|
| + UpdateEffectDependency(entry);
|
|
|
| - // Rename all values in the environment which will extend or introduce Phi
|
| - // nodes to contain the OSR values available at the entry point.
|
| - Node* osr_context = graph()->NewNode(
|
| - common()->OsrValue(Linkage::kOsrContextSpillSlotIndex), entry);
|
| - context_ = builder()->MergeValue(context_, osr_context, control);
|
| + // Create OSR values for each environment value.
|
| + SetContext(graph()->NewNode(
|
| + common()->OsrValue(Linkage::kOsrContextSpillSlotIndex), entry));
|
| int size = static_cast<int>(values()->size());
|
| for (int i = 0; i < size; i++) {
|
| int idx = i; // Indexing scheme follows {StandardFrame}, adapt accordingly.
|
| if (i >= register_base()) idx += InterpreterFrameConstants::kExtraSlotCount;
|
| if (i >= accumulator_base()) idx = Linkage::kOsrAccumulatorRegisterIndex;
|
| - Node* osr_value = graph()->NewNode(common()->OsrValue(idx), entry);
|
| - values_[i] = builder()->MergeValue(values_[i], osr_value, control);
|
| + values()->at(i) = graph()->NewNode(common()->OsrValue(idx), entry);
|
| }
|
| }
|
|
|
| @@ -1912,7 +1912,10 @@ void BytecodeGraphBuilder::BuildOSRLoopEntryPoint(int current_offset) {
|
| if (!osr_ast_id_.IsNone() && osr_ast_id_.ToInt() == current_offset) {
|
| // For OSR add a special {OsrLoopEntry} node into the current loop header.
|
| // It will be turned into a usable entry by the OSR deconstruction.
|
| - environment()->PrepareForOsr();
|
| + Environment* loop_env = merge_environments_[current_offset];
|
| + Environment* osr_env = loop_env->CopyForOsrEntry();
|
| + osr_env->PrepareForOsrEntry();
|
| + loop_env->Merge(osr_env);
|
| }
|
| }
|
|
|
|
|