Index: runtime/vm/flow_graph_inliner.cc |
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc |
index 05f6579c70831abdd3c1831d916fb192056b578f..3a049c2b317aa9107a096567979337fe9d04db2a 100644 |
--- a/runtime/vm/flow_graph_inliner.cc |
+++ b/runtime/vm/flow_graph_inliner.cc |
@@ -848,7 +848,8 @@ class CallSiteInliner : public ValueObject { |
// Deopt-ids overlap between caller and callee. |
if (FLAG_precompiled_mode) { |
#ifdef DART_PRECOMPILER |
- AotOptimizer optimizer(callee_graph, |
+ AotOptimizer optimizer(inliner_->precompiler_, |
+ callee_graph, |
inliner_->use_speculative_inlining_, |
inliner_->inlining_black_list_); |
optimizer.PopulateWithICData(); |
@@ -1899,14 +1900,16 @@ FlowGraphInliner::FlowGraphInliner( |
GrowableArray<TokenPosition>* inline_id_to_token_pos, |
GrowableArray<intptr_t>* caller_inline_id, |
bool use_speculative_inlining, |
- GrowableArray<intptr_t>* inlining_black_list) |
+ GrowableArray<intptr_t>* inlining_black_list, |
+ Precompiler* precompiler) |
: flow_graph_(flow_graph), |
inline_id_to_function_(inline_id_to_function), |
inline_id_to_token_pos_(inline_id_to_token_pos), |
caller_inline_id_(caller_inline_id), |
trace_inlining_(ShouldTraceInlining(flow_graph)), |
use_speculative_inlining_(use_speculative_inlining), |
- inlining_black_list_(inlining_black_list) { |
+ inlining_black_list_(inlining_black_list), |
+ precompiler_(precompiler) { |
ASSERT(!use_speculative_inlining || (inlining_black_list != NULL)); |
} |
@@ -3810,6 +3813,36 @@ bool FlowGraphInliner::TryInlineRecognizedMethod(FlowGraph* flow_graph, |
return false; |
} |
+ case MethodRecognizer::kObjectRuntimeType: { |
+ Type& type = Type::Handle(Z); |
+ if (RawObject::IsStringClassId(receiver_cid)) { |
+ type = Type::StringType(); |
+ } else if (receiver_cid == kDoubleCid) { |
+ type = Type::Double(); |
+ } else if (RawObject::IsIntegerClassId(receiver_cid)) { |
+ type = Type::IntType(); |
+ } else if (receiver_cid != kClosureCid) { |
+ const Class& cls = Class::Handle(Z, |
+ flow_graph->isolate()->class_table()->At(receiver_cid)); |
+ if (!cls.IsGeneric()) { |
+ type = cls.CanonicalType(); |
+ } |
+ } |
+ |
+ if (!type.IsNull()) { |
+ *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(), |
+ call->GetBlock()->try_index()); |
+ (*entry)->InheritDeoptTarget(Z, call); |
+ *last = new(Z) ConstantInstr(Type::ZoneHandle(Z, type.raw())); |
+ flow_graph->AppendTo(*entry, *last, |
+ call->deopt_id() != Thread::kNoDeoptId ? |
+ call->env() : NULL, |
+ FlowGraph::kValue); |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
case MethodRecognizer::kOneByteStringSetAt: { |
// This is an internal method, no need to check argument types nor |
// range. |