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

Unified Diff: runtime/vm/simulator_dbc.cc

Issue 2039913006: DBC: Eager deoptimization and CheckSmi instruction. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 6 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
Index: runtime/vm/simulator_dbc.cc
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index baafca844ed13c442ee0d7286b0eec59e7583fd2..1534fd7b4a83d4be297d6a443b6fc9779fea71a7 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -1966,54 +1966,59 @@ RawObject* Simulator::Call(const Code& code,
{
BYTECODE(Deopt, A_D);
const uint16_t deopt_id = rD;
- if (deopt_id == 0) { // Lazy deoptimization.
- // Preserve result of the previous call.
- // TODO(vegorov) we could have actually included result into the
- // deoptimization environment because it is passed through the stack.
- // If we do then we could remove special result handling from this code.
- RawObject* result = SP[0];
-
- // Leaf runtime function DeoptimizeCopyFrame expects a Dart frame.
- // The code in this frame may not cause GC.
- // DeoptimizeCopyFrame and DeoptimizeFillFrame are leaf runtime calls.
- EnterSyntheticFrame(&FP, &SP, pc - 1);
- const intptr_t frame_size_in_bytes =
- DLRT_DeoptimizeCopyFrame(reinterpret_cast<uword>(FP),
- /*is_lazy_deopt=*/1);
- LeaveSyntheticFrame(&FP, &SP);
-
- SP = FP + (frame_size_in_bytes / kWordSize);
- EnterSyntheticFrame(&FP, &SP, pc - 1);
- DLRT_DeoptimizeFillFrame(reinterpret_cast<uword>(FP));
-
- // We are now inside a valid frame.
- {
+ const bool preserve_result = (deopt_id == 0);
+
+ // Preserve result of the previous call.
+ // TODO(vegorov) we could have actually included result into the
+ // deoptimization environment because it is passed through the stack.
+ // If we do then we could remove special result handling from this code.
+ RawObject* result = SP[0];
Vyacheslav Egorov (Google) 2016/06/08 11:58:53 When not preserving result (non-lazy deopt) we nee
zra 2016/06/08 17:46:30 This and the fix below made things work.
+
+ // Leaf runtime function DeoptimizeCopyFrame expects a Dart frame.
+ // The code in this frame may not cause GC.
+ // DeoptimizeCopyFrame and DeoptimizeFillFrame are leaf runtime calls.
+ EnterSyntheticFrame(&FP, &SP, pc - 1);
zra 2016/06/07 22:31:29 I'm not sure I see how the locals from the optimiz
Vyacheslav Egorov (Google) 2016/06/08 11:58:53 If you look at the disassembled optimized code obj
zra 2016/06/08 17:46:30 Thanks!
+ const intptr_t frame_size_in_bytes =
+ DLRT_DeoptimizeCopyFrame(reinterpret_cast<uword>(FP),
+ /*is_lazy_deopt=*/ (deopt_id == 0) ? 1 : 0);
+ LeaveSyntheticFrame(&FP, &SP);
+
+ SP = FP + (frame_size_in_bytes / kWordSize);
+ EnterSyntheticFrame(&FP, &SP, pc - 1);
+ DLRT_DeoptimizeFillFrame(reinterpret_cast<uword>(FP));
+
+ // We are now inside a valid frame.
+ {
+ if (preserve_result) {
*++SP = result; // Preserve result (call below can cause GC).
- *++SP = 0; // Space for the result: number of materialization args.
- Exit(thread, FP, SP + 1, /*pc=*/0);
- NativeArguments native_args(thread, 0, SP, SP);
- INVOKE_RUNTIME(DRT_DeoptimizeMaterialize, native_args);
}
- const intptr_t materialization_arg_count =
- Smi::Value(RAW_CAST(Smi, *SP--));
- result = *SP--; // Reload the result. It might have been relocated by GC.
-
- // Restore caller PC.
- pc = SavedCallerPC(FP);
-
- // Check if it is a fake PC marking the entry frame.
- ASSERT((reinterpret_cast<uword>(pc) & 2) == 0);
-
- // Restore SP, FP and PP. Push result and dispatch.
- // Note: unlike in a normal return sequence we don't need to drop
- // arguments - those are not part of the innermost deoptimization
- // environment they were dropped by FlowGraphCompiler::RecordAfterCall.
- SP = FrameArguments(FP, materialization_arg_count);
- FP = SavedCallerFP(FP);
- pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr();
+ *++SP = 0; // Space for the result: number of materialization args.
+ Exit(thread, FP, SP + 1, /*pc=*/0);
+ NativeArguments native_args(thread, 0, SP, SP);
+ INVOKE_RUNTIME(DRT_DeoptimizeMaterialize, native_args);
+ }
+ const intptr_t materialization_arg_count =
+ Smi::Value(RAW_CAST(Smi, *SP--));
+ if (preserve_result) {
+ // Reload the result. It might have been relocated by GC.
+ result = *SP--;
+ }
+
+ // Restore caller PC.
+ pc = SavedCallerPC(FP);
+
+ // Check if it is a fake PC marking the entry frame.
+ ASSERT((reinterpret_cast<uword>(pc) & 2) == 0);
+
+ // Restore SP, FP and PP. Push result and dispatch.
+ // Note: unlike in a normal return sequence we don't need to drop
+ // arguments - those are not part of the innermost deoptimization
+ // environment they were dropped by FlowGraphCompiler::RecordAfterCall.
+ SP = FrameArguments(FP, materialization_arg_count);
Vyacheslav Egorov (Google) 2016/06/08 11:58:53 FrameArguments(FP, argc) points to the first argum
zra 2016/06/08 17:46:30 That makes sense, thanks.
+ FP = SavedCallerFP(FP);
+ pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr();
+ if (preserve_result) {
*SP = result;
- } else {
- UNIMPLEMENTED();
}
DISPATCH();
}

Powered by Google App Engine
This is Rietveld 408576698