Index: runtime/vm/flow_graph_compiler.cc |
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc |
index 3fbeb86ece5f866050f9c32d51969abdfe0c183b..a3001527e344873df6b79f966099f51c7d959e26 100644 |
--- a/runtime/vm/flow_graph_compiler.cc |
+++ b/runtime/vm/flow_graph_compiler.cc |
@@ -1634,56 +1634,6 @@ ParallelMoveResolver::ScratchRegisterScope::~ScratchRegisterScope() { |
} |
-template <typename T> |
-static int HighestCountFirst(const T* a, const T* b) { |
- // Negative if 'a' should sort before 'b'. |
- return b->count - a->count; |
-} |
- |
- |
-static int LowestCidFirst(const CidRangeTarget* a, const CidRangeTarget* b) { |
- // Negative if 'a' should sort before 'b'. |
- return a->cid_start - b->cid_start; |
-} |
- |
- |
-// Returns 'sorted' array in decreasing count order. |
-// The expected number of elements to sort is less than 10. |
-void FlowGraphCompiler::SortICDataByCount( |
- const ICData& ic_data, |
- GrowableArray<CidRangeTarget>* sorted_arg, |
- bool drop_smi) { |
- GrowableArray<CidRangeTarget>& sorted = *sorted_arg; |
- ASSERT(ic_data.NumArgsTested() == 1); |
- const intptr_t len = ic_data.NumberOfChecks(); |
- sorted.Clear(); |
- |
- for (int i = 0; i < len; i++) { |
- intptr_t receiver_cid = ic_data.GetReceiverClassIdAt(i); |
- if (drop_smi && (receiver_cid == kSmiCid)) continue; |
- Function& target = Function::ZoneHandle(ic_data.GetTargetAt(i)); |
- sorted.Add(CidRangeTarget(receiver_cid, receiver_cid, &target, |
- ic_data.GetCountAt(i))); |
- } |
- sorted.Sort(LowestCidFirst); |
- int dest = 0; |
- |
- // Merge adjacent ranges. |
- for (int src = 0; src < sorted.length(); src++) { |
- if (src > 0 && sorted[src - 1].cid_end + 1 == sorted[src].cid_start && |
- sorted[src - 1].target->raw() == sorted[src].target->raw()) { |
- sorted[dest - 1].cid_end++; |
- sorted[dest - 1].count += sorted[dest].count; |
- } else { |
- sorted[dest++] = sorted[src]; |
- } |
- } |
- |
- sorted.SetLength(dest); |
- sorted.Sort(HighestCountFirst); |
-} |
- |
- |
const ICData* FlowGraphCompiler::GetOrAddInstanceCallICData( |
intptr_t deopt_id, |
const String& target_name, |
@@ -1803,8 +1753,8 @@ const CallTargets* FlowGraphCompiler::ResolveCallTargetsForReceiverCid( |
Function& fn = Function::ZoneHandle(zone); |
if (!LookupMethodFor(cid, selector, args_desc, &fn)) return NULL; |
- CallTargets* targets = new (zone) CallTargets(); |
- targets->Add(CidRangeTarget(cid, cid, &fn, /* count = */ 1)); |
+ CallTargets* targets = new (zone) CallTargets(zone); |
+ targets->Add(new (zone) TargetInfo(cid, cid, &fn, /* count = */ 1)); |
return targets; |
} |
@@ -1931,7 +1881,7 @@ void FlowGraphCompiler::EmitTestAndCall(const CallTargets& targets, |
// Do not use the code from the function, but let the code be patched so |
// that we can record the outgoing edges to other code. |
- const Function& function = *targets[smi_case].target; |
+ const Function& function = *targets.TargetAt(smi_case)->target; |
GenerateStaticDartCall(deopt_id, token_index, |
*StubCode::CallStaticFunction_entry(), |
RawPcDescriptors::kOther, locs, function); |
@@ -1964,7 +1914,7 @@ void FlowGraphCompiler::EmitTestAndCall(const CallTargets& targets, |
for (intptr_t i = 0; i < length; i++) { |
if (i == which_case_to_skip) continue; |
const bool is_last_check = (i == last_check); |
- const int count = targets[i].count; |
+ const int count = targets.TargetAt(i)->count; |
if (!is_last_check && !complete && count < (total_ic_calls >> 5)) { |
// This case is hit too rarely to be worth writing class-id checks inline |
// for. Note that we can't do this for calls with only one target because |
@@ -1980,7 +1930,7 @@ void FlowGraphCompiler::EmitTestAndCall(const CallTargets& targets, |
} |
// Do not use the code from the function, but let the code be patched so |
// that we can record the outgoing edges to other code. |
- const Function& function = *targets[i].target; |
+ const Function& function = *targets.TargetAt(i)->target; |
GenerateStaticDartCall(deopt_id, token_index, |
*StubCode::CallStaticFunction_entry(), |
RawPcDescriptors::kOther, locs, function); |