Index: runtime/vm/compiler.cc |
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc |
index 94d2f28373cb1f05213e321a5161ad8dbaf278dd..a16d8537e4b1eaf93e9bba8ed327f712889dcc59 100644 |
--- a/runtime/vm/compiler.cc |
+++ b/runtime/vm/compiler.cc |
@@ -45,6 +45,8 @@ DEFINE_FLAG(bool, common_subexpression_elimination, true, |
DEFINE_FLAG(bool, loop_invariant_code_motion, true, |
"Do loop invariant code motion."); |
DEFINE_FLAG(bool, propagate_types, true, "Do static type propagation."); |
+DEFINE_FLAG(bool, allocation_sinking, true, |
+ "attempt to sink temporary allocations to side exits"); |
DEFINE_FLAG(int, deoptimization_counter_threshold, 16, |
"How many times we allow deoptimization before we disallow optimization."); |
DEFINE_FLAG(bool, use_inlining, true, "Enable call-site inlining"); |
@@ -292,6 +294,20 @@ static bool CompileParsedFunctionHelper(const ParsedFunction& parsed_function, |
propagator.Propagate(); |
DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
} |
+ |
+ // Detach environments from the instructions that can't deoptimize. |
+ // Do it before we attempt to perform allocation sinking to minimize |
+ // amount of materializations it has to perform. |
+ optimizer.EliminateEnvironments(); |
+ |
+ // Attempt to sink allocations of temporary non-escaping objects to |
+ // the deoptimization path. |
+ AllocationSinking* sinking = NULL; |
+ if (FLAG_allocation_sinking) { |
+ sinking = new AllocationSinking(flow_graph); |
+ sinking->Optimize(); |
+ } |
+ |
if (optimizer.Canonicalize()) { |
// To fully remove redundant boxing (e.g. BoxDouble used only in |
// environments and UnboxDouble instructions) instruction we |
@@ -302,6 +318,14 @@ static bool CompileParsedFunctionHelper(const ParsedFunction& parsed_function, |
} |
DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
+ if (sinking != NULL) { |
+ // Remove all MaterializeObject instructions inserted by allocation |
+ // sinking from the flow graph and let them float on the side referenced |
+ // only from environments. Register allocator will consider them |
+ // as part of a deoptimization environment. |
+ sinking->DetachMaterializations(); |
+ } |
+ |
// Perform register allocation on the SSA graph. |
FlowGraphAllocator allocator(*flow_graph); |
allocator.AllocateRegisters(); |