Index: runtime/vm/aot_optimizer.cc |
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc |
index 00131579c16799ad18408bc5371c31cd49c62e3e..93501ec22d2a20ce6b26dec3902564d3ff997271 100644 |
--- a/runtime/vm/aot_optimizer.cc |
+++ b/runtime/vm/aot_optimizer.cc |
@@ -100,32 +100,6 @@ void AotOptimizer::ApplyICData() { |
} |
-void AotOptimizer::PopulateWithICData() { |
- ASSERT(current_iterator_ == NULL); |
- for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator(); |
- !block_it.Done(); block_it.Advance()) { |
- ForwardInstructionIterator it(block_it.Current()); |
- for (; !it.Done(); it.Advance()) { |
- Instruction* instr = it.Current(); |
- if (instr->IsInstanceCall()) { |
- InstanceCallInstr* call = instr->AsInstanceCall(); |
- if (!call->HasICData()) { |
- const Array& arguments_descriptor = Array::Handle( |
- zone(), ArgumentsDescriptor::New(call->ArgumentCount(), |
- call->argument_names())); |
- const ICData& ic_data = ICData::ZoneHandle( |
- zone(), ICData::New(function(), call->function_name(), |
- arguments_descriptor, call->deopt_id(), |
- call->checked_argument_count(), false)); |
- call->set_ic_data(&ic_data); |
- } |
- } |
- } |
- current_iterator_ = NULL; |
- } |
-} |
- |
- |
bool AotOptimizer::RecognizeRuntimeTypeGetter(InstanceCallInstr* call) { |
if ((precompiler_ == NULL) || !precompiler_->get_runtime_type_is_unique()) { |
return false; |
@@ -1550,47 +1524,51 @@ void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) { |
return; |
} |
- TypeRangeCache* cache = thread()->type_range_cache(); |
- intptr_t lower_limit, upper_limit; |
- if (cache != NULL && |
- cache->InstanceOfHasClassRange(type, &lower_limit, &upper_limit)) { |
- // left.instanceof(type) => |
- // _classRangeCheck(left.cid, lower_limit, upper_limit) |
- |
- LoadClassIdInstr* left_cid = new (Z) LoadClassIdInstr(new (Z) Value(left)); |
- InsertBefore(call, left_cid, NULL, FlowGraph::kValue); |
- ConstantInstr* lower_cid = |
- flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(lower_limit))); |
- ConstantInstr* upper_cid = |
- flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(upper_limit))); |
- |
- ZoneGrowableArray<PushArgumentInstr*>* args = |
- new (Z) ZoneGrowableArray<PushArgumentInstr*>(3); |
- PushArgumentInstr* arg = new (Z) PushArgumentInstr(new (Z) Value(left_cid)); |
- InsertBefore(call, arg, NULL, FlowGraph::kEffect); |
- args->Add(arg); |
- arg = new (Z) PushArgumentInstr(new (Z) Value(lower_cid)); |
- InsertBefore(call, arg, NULL, FlowGraph::kEffect); |
- args->Add(arg); |
- arg = new (Z) PushArgumentInstr(new (Z) Value(upper_cid)); |
- InsertBefore(call, arg, NULL, FlowGraph::kEffect); |
- args->Add(arg); |
- |
- const Library& dart_internal = |
- Library::Handle(Z, Library::InternalLibrary()); |
- const String& target_name = negate ? Symbols::_classRangeCheckNegative() |
- : Symbols::_classRangeCheck(); |
- const Function& target = Function::ZoneHandle( |
- Z, dart_internal.LookupFunctionAllowPrivate(target_name)); |
- ASSERT(!target.IsNull()); |
- ASSERT(target.IsRecognized() && target.always_inline()); |
- |
- StaticCallInstr* new_call = |
- new (Z) StaticCallInstr(call->token_pos(), target, |
- Object::null_array(), // argument_names |
- args, call->deopt_id()); |
- ReplaceCall(call, new_call); |
- return; |
+ if (precompiler_ != NULL) { |
+ TypeRangeCache* cache = precompiler_->type_range_cache(); |
+ intptr_t lower_limit, upper_limit; |
+ if (cache != NULL && |
+ cache->InstanceOfHasClassRange(type, &lower_limit, &upper_limit)) { |
+ // left.instanceof(type) => |
+ // _classRangeCheck(left.cid, lower_limit, upper_limit) |
+ |
+ LoadClassIdInstr* left_cid = |
+ new (Z) LoadClassIdInstr(new (Z) Value(left)); |
+ InsertBefore(call, left_cid, NULL, FlowGraph::kValue); |
+ ConstantInstr* lower_cid = |
+ flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(lower_limit))); |
+ ConstantInstr* upper_cid = |
+ flow_graph()->GetConstant(Smi::Handle(Z, Smi::New(upper_limit))); |
+ |
+ ZoneGrowableArray<PushArgumentInstr*>* args = |
+ new (Z) ZoneGrowableArray<PushArgumentInstr*>(3); |
+ PushArgumentInstr* arg = |
+ new (Z) PushArgumentInstr(new (Z) Value(left_cid)); |
+ InsertBefore(call, arg, NULL, FlowGraph::kEffect); |
+ args->Add(arg); |
+ arg = new (Z) PushArgumentInstr(new (Z) Value(lower_cid)); |
+ InsertBefore(call, arg, NULL, FlowGraph::kEffect); |
+ args->Add(arg); |
+ arg = new (Z) PushArgumentInstr(new (Z) Value(upper_cid)); |
+ InsertBefore(call, arg, NULL, FlowGraph::kEffect); |
+ args->Add(arg); |
+ |
+ const Library& dart_internal = |
+ Library::Handle(Z, Library::InternalLibrary()); |
+ const String& target_name = negate ? Symbols::_classRangeCheckNegative() |
+ : Symbols::_classRangeCheck(); |
+ const Function& target = Function::ZoneHandle( |
+ Z, dart_internal.LookupFunctionAllowPrivate(target_name)); |
+ ASSERT(!target.IsNull()); |
+ ASSERT(target.IsRecognized() && target.always_inline()); |
+ |
+ StaticCallInstr* new_call = |
+ new (Z) StaticCallInstr(call->token_pos(), target, |
+ Object::null_array(), // argument_names |
+ args, call->deopt_id()); |
+ ReplaceCall(call, new_call); |
+ return; |
+ } |
} |
const ICData& unary_checks = |