| Index: runtime/vm/intermediate_language_dbc.cc
|
| diff --git a/runtime/vm/intermediate_language_dbc.cc b/runtime/vm/intermediate_language_dbc.cc
|
| index 3838de2cbf23169b146711bf97fbfdd8a6d999b3..73e2a4044985e022982e4a804c0533fc064721ac 100644
|
| --- a/runtime/vm/intermediate_language_dbc.cc
|
| +++ b/runtime/vm/intermediate_language_dbc.cc
|
| @@ -1499,55 +1499,56 @@ EMIT_NATIVE_CODE(CheckClassId, 1) {
|
| EMIT_NATIVE_CODE(CheckClass, 1) {
|
| const Register value = locs()->in(0).reg();
|
| if (IsNullCheck()) {
|
| - ASSERT(DeoptIfNull() || DeoptIfNotNull());
|
| - if (DeoptIfNull()) {
|
| + ASSERT(IsDeoptIfNull() || IsDeoptIfNotNull());
|
| + if (IsDeoptIfNull()) {
|
| __ IfEqNull(value);
|
| } else {
|
| __ IfNeNull(value);
|
| }
|
| } else {
|
| - ASSERT((unary_checks().GetReceiverClassIdAt(0) != kSmiCid) ||
|
| - (unary_checks().NumberOfChecks() > 1));
|
| - const intptr_t may_be_smi =
|
| - (unary_checks().GetReceiverClassIdAt(0) == kSmiCid) ? 1 : 0;
|
| + ASSERT(!targets_.IsMonomorphic() || !targets_.HasReceiverClassId(kSmiCid));
|
| + const intptr_t may_be_smi = targets_.HasReceiverClassId(kSmiCid) ? 1 : 0;
|
| bool is_dense_switch = false;
|
| intptr_t cid_mask = 0;
|
| if (IsDenseSwitch()) {
|
| - ASSERT(cids_[0] < cids_[cids_.length() - 1]);
|
| cid_mask = ComputeCidMask();
|
| is_dense_switch = Smi::IsValid(cid_mask);
|
| }
|
| if (is_dense_switch) {
|
| - const intptr_t low_cid = cids_[0];
|
| + intptr_t min = targets_.ComputeLowestCid();
|
| __ CheckDenseSwitch(value, may_be_smi);
|
| - __ Nop(compiler->ToEmbeddableCid(low_cid, this));
|
| + __ Nop(compiler->ToEmbeddableCid(min, this));
|
| __ Nop(__ AddConstant(Smi::Handle(Smi::New(cid_mask))));
|
| } else {
|
| - GrowableArray<CidRangeTarget> sorted_ic_data;
|
| - FlowGraphCompiler::SortICDataByCount(unary_checks(), &sorted_ic_data,
|
| - /* drop_smi = */ true);
|
| - const intptr_t sorted_length = sorted_ic_data.length();
|
| -
|
| bool using_ranges = false;
|
| - for (intptr_t i = 0; i < sorted_length; i++) {
|
| - if (sorted_ic_data[i].cid_start != sorted_ic_data[i].cid_end) {
|
| + int smi_adjustment = 0;
|
| + int length = targets_.length();
|
| + for (intptr_t i = 0; i < length; i++) {
|
| + if (targets_[i].cid_start != targets_[i].cid_end) {
|
| using_ranges = true;
|
| - break;
|
| + } else if (targets_[i].cid_start == kSmiCid) {
|
| + ASSERT(targets_[i].cid_end == kSmiCid);
|
| + ASSERT(smi_adjustment == 0);
|
| + smi_adjustment = 1;
|
| }
|
| }
|
|
|
| - if (!Utils::IsUint(8, sorted_length)) {
|
| + if (!Utils::IsUint(8, length)) {
|
| Unsupported(compiler);
|
| UNREACHABLE();
|
| }
|
| if (using_ranges) {
|
| - __ CheckCidsByRange(value, may_be_smi, sorted_length * 2);
|
| + __ CheckCidsByRange(value, may_be_smi, (length - smi_adjustment) * 2);
|
| } else {
|
| - __ CheckCids(value, may_be_smi, sorted_length);
|
| + __ CheckCids(value, may_be_smi, length - smi_adjustment);
|
| }
|
| - for (intptr_t i = 0; i < sorted_length; i++) {
|
| - intptr_t cid_start = sorted_ic_data[i].cid_start;
|
| - intptr_t cid_end = sorted_ic_data[i].cid_end;
|
| + for (intptr_t i = 0; i < length; i++) {
|
| + intptr_t cid_start = targets_[i].cid_start;
|
| + intptr_t cid_end = targets_[i].cid_end;
|
| + if (cid_start == kSmiCid && cid_end == kSmiCid) {
|
| + ASSERT(smi_adjustment == 1);
|
| + continue;
|
| + }
|
| __ Nop(compiler->ToEmbeddableCid(cid_start, this));
|
| if (using_ranges) {
|
| __ Nop(compiler->ToEmbeddableCid(1 + cid_end - cid_start, this));
|
|
|