Index: src/compiler/bytecode-graph-builder.cc |
diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc |
index a7a1cb58f40c883488876446f3ddba8fe70121cc..5fb931f5d8d0e183eea305613b127d4c011cc0fa 100644 |
--- a/src/compiler/bytecode-graph-builder.cc |
+++ b/src/compiler/bytecode-graph-builder.cc |
@@ -648,10 +648,6 @@ VectorSlotPair BytecodeGraphBuilder::CreateVectorSlotPair(int slot_id) { |
} |
bool BytecodeGraphBuilder::CreateGraph() { |
- // Set up the basic structure of the graph. Outputs for {Start} are |
- // the formal parameters (including the receiver) plus context and |
- // closure. |
- |
// Set up the basic structure of the graph. Outputs for {Start} are the formal |
// parameters (including the receiver) plus new target, number of arguments, |
// context and closure. |
@@ -663,10 +659,6 @@ bool BytecodeGraphBuilder::CreateGraph() { |
GetFunctionContext()); |
set_environment(&env); |
- // For OSR add an {OsrNormalEntry} as the start of the top-level environment. |
- // It will be replaced with {Dead} after typing and optimizations. |
- if (!osr_ast_id_.IsNone()) NewNode(common()->OsrNormalEntry()); |
- |
VisitBytecodes(); |
// Finish the basic structure of the graph. |
@@ -704,12 +696,14 @@ void BytecodeGraphBuilder::VisitBytecodes() { |
set_loop_analysis(&loop_analysis); |
interpreter::BytecodeArrayIterator iterator(bytecode_array()); |
set_bytecode_iterator(&iterator); |
+ BuildOSRNormalEntryPoint(); |
while (!iterator.done()) { |
int current_offset = iterator.current_offset(); |
EnterAndExitExceptionHandlers(current_offset); |
SwitchToMergeEnvironment(current_offset); |
if (environment() != nullptr) { |
BuildLoopHeaderEnvironment(current_offset); |
+ BuildOSRLoopEntryPoint(current_offset); |
switch (iterator.current_bytecode()) { |
#define BYTECODE_CASE(name, ...) \ |
@@ -1632,14 +1626,7 @@ void BytecodeGraphBuilder::VisitStackCheck() { |
environment()->RecordAfterState(node, &states); |
} |
-void BytecodeGraphBuilder::VisitOsrPoll() { |
- // TODO(4764): This should be moved into the {VisitBytecodes} once we merge |
- // the polling with existing bytecode. This will also guarantee that we are |
- // not missing the OSR entry point, which we wouldn't catch right now. |
- if (osr_ast_id_.ToInt() == bytecode_iterator().current_offset()) { |
- environment()->PrepareForOsr(); |
- } |
-} |
+void BytecodeGraphBuilder::VisitOsrPoll() {} |
void BytecodeGraphBuilder::VisitReturn() { |
BuildLoopExitsForFunctionExit(); |
@@ -1812,6 +1799,25 @@ void BytecodeGraphBuilder::MergeControlToLeaveFunction(Node* exit) { |
set_environment(nullptr); |
} |
+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(); |
+ } |
+} |
+ |
+void BytecodeGraphBuilder::BuildOSRNormalEntryPoint() { |
+ if (!osr_ast_id_.IsNone()) { |
+ // For OSR add an {OsrNormalEntry} as the the top-level environment start. |
+ // It will be replaced with {Dead} by the OSR deconstruction. |
+ NewNode(common()->OsrNormalEntry()); |
+ // Note that the requested OSR entry point must be the target of a backward |
+ // branch, otherwise there will not be a proper loop header available. |
+ DCHECK(branch_analysis()->backward_branches_target(osr_ast_id_.ToInt())); |
+ } |
+} |
+ |
void BytecodeGraphBuilder::BuildLoopExitsForBranch(int target_offset) { |
int origin_offset = bytecode_iterator().current_offset(); |
// Only build loop exits for forward edges. |