| 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()) {
|
|
|