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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <setjmp.h> // NOLINT 5 #include <setjmp.h> // NOLINT
6 #include <stdlib.h> 6 #include <stdlib.h>
7 7
8 #include "vm/globals.h" 8 #include "vm/globals.h"
9 #if defined(TARGET_ARCH_DBC) 9 #if defined(TARGET_ARCH_DBC)
10 10
(...skipping 1948 matching lines...) Expand 10 before | Expand all | Expand 10 after
1959 ASSERT(array->GetClassId() == kArrayCid); 1959 ASSERT(array->GetClassId() == kArrayCid);
1960 ASSERT(!index->IsHeapObject()); 1960 ASSERT(!index->IsHeapObject());
1961 ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_)); 1961 ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
1962 array->StorePointer(array->ptr()->data() + Smi::Value(index), value); 1962 array->StorePointer(array->ptr()->data() + Smi::Value(index), value);
1963 DISPATCH(); 1963 DISPATCH();
1964 } 1964 }
1965 1965
1966 { 1966 {
1967 BYTECODE(Deopt, A_D); 1967 BYTECODE(Deopt, A_D);
1968 const uint16_t deopt_id = rD; 1968 const uint16_t deopt_id = rD;
1969 if (deopt_id == 0) { // Lazy deoptimization. 1969 const bool preserve_result = (deopt_id == 0);
1970 // Preserve result of the previous call.
1971 // TODO(vegorov) we could have actually included result into the
1972 // deoptimization environment because it is passed through the stack.
1973 // If we do then we could remove special result handling from this code.
1974 RawObject* result = SP[0];
1975 1970
1976 // Leaf runtime function DeoptimizeCopyFrame expects a Dart frame. 1971 // Preserve result of the previous call.
1977 // The code in this frame may not cause GC. 1972 // TODO(vegorov) we could have actually included result into the
1978 // DeoptimizeCopyFrame and DeoptimizeFillFrame are leaf runtime calls. 1973 // deoptimization environment because it is passed through the stack.
1979 EnterSyntheticFrame(&FP, &SP, pc - 1); 1974 // If we do then we could remove special result handling from this code.
1980 const intptr_t frame_size_in_bytes = 1975 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.
1981 DLRT_DeoptimizeCopyFrame(reinterpret_cast<uword>(FP),
1982 /*is_lazy_deopt=*/1);
1983 LeaveSyntheticFrame(&FP, &SP);
1984 1976
1985 SP = FP + (frame_size_in_bytes / kWordSize); 1977 // Leaf runtime function DeoptimizeCopyFrame expects a Dart frame.
1986 EnterSyntheticFrame(&FP, &SP, pc - 1); 1978 // The code in this frame may not cause GC.
1987 DLRT_DeoptimizeFillFrame(reinterpret_cast<uword>(FP)); 1979 // DeoptimizeCopyFrame and DeoptimizeFillFrame are leaf runtime calls.
1980 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!
1981 const intptr_t frame_size_in_bytes =
1982 DLRT_DeoptimizeCopyFrame(reinterpret_cast<uword>(FP),
1983 /*is_lazy_deopt=*/ (deopt_id == 0) ? 1 : 0);
1984 LeaveSyntheticFrame(&FP, &SP);
1988 1985
1989 // We are now inside a valid frame. 1986 SP = FP + (frame_size_in_bytes / kWordSize);
1990 { 1987 EnterSyntheticFrame(&FP, &SP, pc - 1);
1988 DLRT_DeoptimizeFillFrame(reinterpret_cast<uword>(FP));
1989
1990 // We are now inside a valid frame.
1991 {
1992 if (preserve_result) {
1991 *++SP = result; // Preserve result (call below can cause GC). 1993 *++SP = result; // Preserve result (call below can cause GC).
1992 *++SP = 0; // Space for the result: number of materialization args.
1993 Exit(thread, FP, SP + 1, /*pc=*/0);
1994 NativeArguments native_args(thread, 0, SP, SP);
1995 INVOKE_RUNTIME(DRT_DeoptimizeMaterialize, native_args);
1996 } 1994 }
1997 const intptr_t materialization_arg_count = 1995 *++SP = 0; // Space for the result: number of materialization args.
1998 Smi::Value(RAW_CAST(Smi, *SP--)); 1996 Exit(thread, FP, SP + 1, /*pc=*/0);
1999 result = *SP--; // Reload the result. It might have been relocated by GC. 1997 NativeArguments native_args(thread, 0, SP, SP);
1998 INVOKE_RUNTIME(DRT_DeoptimizeMaterialize, native_args);
1999 }
2000 const intptr_t materialization_arg_count =
2001 Smi::Value(RAW_CAST(Smi, *SP--));
2002 if (preserve_result) {
2003 // Reload the result. It might have been relocated by GC.
2004 result = *SP--;
2005 }
2000 2006
2001 // Restore caller PC. 2007 // Restore caller PC.
2002 pc = SavedCallerPC(FP); 2008 pc = SavedCallerPC(FP);
2003 2009
2004 // Check if it is a fake PC marking the entry frame. 2010 // Check if it is a fake PC marking the entry frame.
2005 ASSERT((reinterpret_cast<uword>(pc) & 2) == 0); 2011 ASSERT((reinterpret_cast<uword>(pc) & 2) == 0);
2006 2012
2007 // Restore SP, FP and PP. Push result and dispatch. 2013 // Restore SP, FP and PP. Push result and dispatch.
2008 // Note: unlike in a normal return sequence we don't need to drop 2014 // Note: unlike in a normal return sequence we don't need to drop
2009 // arguments - those are not part of the innermost deoptimization 2015 // arguments - those are not part of the innermost deoptimization
2010 // environment they were dropped by FlowGraphCompiler::RecordAfterCall. 2016 // environment they were dropped by FlowGraphCompiler::RecordAfterCall.
2011 SP = FrameArguments(FP, materialization_arg_count); 2017 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.
2012 FP = SavedCallerFP(FP); 2018 FP = SavedCallerFP(FP);
2013 pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr(); 2019 pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr();
2020 if (preserve_result) {
2014 *SP = result; 2021 *SP = result;
2015 } else {
2016 UNIMPLEMENTED();
2017 } 2022 }
2018 DISPATCH(); 2023 DISPATCH();
2019 } 2024 }
2020 2025
2021 { 2026 {
2022 BYTECODE(Trap, 0); 2027 BYTECODE(Trap, 0);
2023 UNIMPLEMENTED(); 2028 UNIMPLEMENTED();
2024 DISPATCH(); 2029 DISPATCH();
2025 } 2030 }
2026 2031
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
2122 special_[kExceptionSpecialIndex] = raw_exception; 2127 special_[kExceptionSpecialIndex] = raw_exception;
2123 special_[kStacktraceSpecialIndex] = raw_stacktrace; 2128 special_[kStacktraceSpecialIndex] = raw_stacktrace;
2124 buf->Longjmp(); 2129 buf->Longjmp();
2125 UNREACHABLE(); 2130 UNREACHABLE();
2126 } 2131 }
2127 2132
2128 } // namespace dart 2133 } // namespace dart
2129 2134
2130 2135
2131 #endif // defined TARGET_ARCH_DBC 2136 #endif // defined TARGET_ARCH_DBC
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698