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

Unified Diff: runtime/vm/flow_graph_compiler_ia32.cc

Issue 17233003: Reapply "Initial implementation of on-stack replacement (OSR)." (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 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
« no previous file with comments | « runtime/vm/flow_graph_compiler.cc ('k') | runtime/vm/flow_graph_compiler_x64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_compiler_ia32.cc
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index d28203436bfd5c066b20dec22c5a47dc1446a053..fe154c7a78612abe39b705f7fe6ba74939496d48 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -24,6 +24,7 @@ namespace dart {
DEFINE_FLAG(bool, trap_on_deoptimization, false, "Trap on deoptimization.");
DEFINE_FLAG(bool, unbox_mints, true, "Optimize 64-bit integer arithmetic.");
DECLARE_FLAG(int, optimization_counter_threshold);
+DECLARE_FLAG(int, reoptimization_counter_threshold);
DECLARE_FLAG(bool, print_ast);
DECLARE_FLAG(bool, print_scopes);
DECLARE_FLAG(bool, enable_type_checks);
@@ -1077,34 +1078,43 @@ void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
void FlowGraphCompiler::EmitFrameEntry() {
const Function& function = parsed_function().function();
- if (CanOptimizeFunction() && function.is_optimizable()) {
- const bool can_optimize = !is_optimizing() || may_reoptimize();
+ if (CanOptimizeFunction() &&
+ function.is_optimizable() &&
+ (!is_optimizing() || may_reoptimize())) {
const Register function_reg = EDI;
- if (can_optimize) {
- __ LoadObject(function_reg, function);
- }
+ __ LoadObject(function_reg, function);
// Patch point is after the eventually inlined function object.
AddCurrentDescriptor(PcDescriptors::kEntryPatch,
Isolate::kNoDeoptId,
0); // No token position.
- if (can_optimize) {
- // Reoptimization of optimized function is triggered by counting in
+ if (is_optimizing()) {
+ // Reoptimization of an optimized function is triggered by counting in
// IC stubs, but not at the entry of the function.
- if (!is_optimizing()) {
- __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
- }
__ cmpl(FieldAddress(function_reg, Function::usage_counter_offset()),
- Immediate(FLAG_optimization_counter_threshold));
- ASSERT(function_reg == EDI);
- __ j(GREATER_EQUAL, &StubCode::OptimizeFunctionLabel());
+ Immediate(FLAG_reoptimization_counter_threshold));
+ } else {
+ __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
+ __ cmpl(FieldAddress(function_reg, Function::usage_counter_offset()),
+ Immediate(FLAG_optimization_counter_threshold));
}
- } else {
+ ASSERT(function_reg == EDI);
+ __ j(GREATER_EQUAL, &StubCode::OptimizeFunctionLabel());
+ } else if (!flow_graph().IsCompiledForOsr()) {
AddCurrentDescriptor(PcDescriptors::kEntryPatch,
Isolate::kNoDeoptId,
0); // No token position.
}
__ Comment("Enter frame");
- __ EnterDartFrame(StackSize() * kWordSize);
+ if (flow_graph().IsCompiledForOsr()) {
+ intptr_t extra_slots = StackSize()
+ - flow_graph().num_stack_locals()
+ - flow_graph().num_copied_params();
+ ASSERT(extra_slots >= 0);
+ __ EnterOsrFrame(extra_slots * kWordSize);
+ } else {
+ ASSERT(StackSize() >= 0);
+ __ EnterDartFrame(StackSize() * kWordSize);
+ }
}
@@ -1136,9 +1146,10 @@ void FlowGraphCompiler::CompileGraph() {
if (num_copied_params == 0) {
#ifdef DEBUG
ASSERT(!parsed_function().function().HasOptionalParameters());
- const bool check_arguments = true;
+ const bool check_arguments = !flow_graph().IsCompiledForOsr();
#else
- const bool check_arguments = function.IsClosureFunction();
+ const bool check_arguments =
+ function.IsClosureFunction() && !flow_graph().IsCompiledForOsr();
#endif
if (check_arguments) {
__ Comment("Check argument count");
@@ -1196,7 +1207,7 @@ void FlowGraphCompiler::CompileGraph() {
// The arguments descriptor is never saved in the absence of optional
// parameters, since any argument definition test would always yield true.
ASSERT(saved_args_desc_var == NULL);
- } else {
+ } else if (!flow_graph().IsCompiledForOsr()) {
if (saved_args_desc_var != NULL) {
__ Comment("Save arguments descriptor");
const Register kArgumentsDescriptorReg = EDX;
« no previous file with comments | « runtime/vm/flow_graph_compiler.cc ('k') | runtime/vm/flow_graph_compiler_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698