| Index: runtime/vm/intermediate_language_arm.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_arm.cc (revision 43352)
|
| +++ runtime/vm/intermediate_language_arm.cc (working copy)
|
| @@ -6029,11 +6029,9 @@
|
| const Register value = locs()->in(0).reg();
|
| const Register temp = locs()->temp(0).reg();
|
| Label is_ok;
|
| - intptr_t cix = 0;
|
| - if (unary_checks().GetReceiverClassIdAt(cix) == kSmiCid) {
|
| + if (unary_checks().GetReceiverClassIdAt(0) == kSmiCid) {
|
| __ tst(value, Operand(kSmiTagMask));
|
| __ b(&is_ok, EQ);
|
| - cix++; // Skip first check.
|
| } else {
|
| __ tst(value, Operand(kSmiTagMask));
|
| __ b(deopt, EQ);
|
| @@ -6057,10 +6055,15 @@
|
| __ b(deopt, EQ);
|
| }
|
| } else {
|
| - const intptr_t num_checks = unary_checks().NumberOfChecks();
|
| - for (intptr_t i = cix; i < num_checks; i++) {
|
| - ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
|
| - __ CompareImmediate(temp, unary_checks().GetReceiverClassIdAt(i));
|
| + GrowableArray<CidTarget> sorted_ic_data;
|
| + FlowGraphCompiler::SortICDataByCount(unary_checks(),
|
| + &sorted_ic_data,
|
| + /* drop_smi = */ true);
|
| + const intptr_t num_checks = sorted_ic_data.length();
|
| + for (intptr_t i = 0; i < num_checks; i++) {
|
| + const intptr_t cid = sorted_ic_data[i].cid;
|
| + ASSERT(cid != kSmiCid);
|
| + __ CompareImmediate(temp, cid);
|
| if (i == (num_checks - 1)) {
|
| __ b(deopt, NE);
|
| } else {
|
|
|