Index: runtime/vm/flow_graph_inliner.cc |
=================================================================== |
--- runtime/vm/flow_graph_inliner.cc (revision 27611) |
+++ runtime/vm/flow_graph_inliner.cc (working copy) |
@@ -381,8 +381,7 @@ |
class CallSiteInliner : public ValueObject { |
public: |
- CallSiteInliner(FlowGraph* flow_graph, |
- GrowableArray<const Field*>* guarded_fields) |
+ explicit CallSiteInliner(FlowGraph* flow_graph) |
: caller_graph_(flow_graph), |
inlined_(false), |
initial_size_(flow_graph->InstructionCount()), |
@@ -390,8 +389,7 @@ |
inlining_depth_(1), |
collected_call_sites_(NULL), |
inlining_call_sites_(NULL), |
- function_cache_(), |
- guarded_fields_(guarded_fields) { } |
+ function_cache_() { } |
FlowGraph* caller_graph() const { return caller_graph_; } |
@@ -543,9 +541,11 @@ |
// Build the callee graph. |
InlineExitCollector* exit_collector = |
new InlineExitCollector(caller_graph_, call); |
+ GrowableArray<const Field*> inlined_guarded_fields; |
FlowGraphBuilder builder(parsed_function, |
ic_data_array, |
exit_collector, |
+ &inlined_guarded_fields, |
Isolate::kNoDeoptId); |
builder.SetInitialBlockId(caller_graph_->max_block_id()); |
FlowGraph* callee_graph; |
@@ -606,7 +606,7 @@ |
&CompilerStats::graphinliner_opt_timer, |
isolate); |
// TODO(zerny): Do more optimization passes on the callee graph. |
- FlowGraphOptimizer optimizer(callee_graph, guarded_fields_); |
+ FlowGraphOptimizer optimizer(callee_graph); |
optimizer.ApplyICData(); |
DEBUG_ASSERT(callee_graph->VerifyUseLists()); |
} |
@@ -667,6 +667,13 @@ |
call_data->callee_graph = callee_graph; |
call_data->parameter_stubs = param_stubs; |
call_data->exit_collector = exit_collector; |
+ |
+ // When inlined, we add the guarded fields of the callee to the caller's |
+ // list of guarded fields. |
+ for (intptr_t i = 0; i < inlined_guarded_fields.length(); ++i) { |
+ caller_graph_->builder().AddToGuardedFields(*inlined_guarded_fields[i]); |
+ } |
+ |
TRACE_INLINING(OS::Print(" Success\n")); |
return true; |
} else { |
@@ -995,7 +1002,6 @@ |
CallSites* collected_call_sites_; |
CallSites* inlining_call_sites_; |
GrowableArray<ParsedFunction*> function_cache_; |
- GrowableArray<const Field*>* guarded_fields_; |
DISALLOW_COPY_AND_ASSIGN(CallSiteInliner); |
}; |
@@ -1431,7 +1437,7 @@ |
printer.PrintBlocks(); |
} |
- CallSiteInliner inliner(flow_graph_, guarded_fields_); |
+ CallSiteInliner inliner(flow_graph_); |
inliner.InlineCalls(); |
if (inliner.inlined()) { |