| Index: runtime/vm/aot_optimizer.cc
|
| diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
|
| index 306fce4fc6919dea0052d6e7d50ebf788ac17cc8..1ff277f486325b70647c3f4524f874442f104834 100644
|
| --- a/runtime/vm/aot_optimizer.cc
|
| +++ b/runtime/vm/aot_optimizer.cc
|
| @@ -501,7 +501,7 @@ bool AotOptimizer::TryReplaceWithIndexedOp(InstanceCallInstr* call) {
|
| if (!call->HasICData()) return false;
|
| const ICData& ic_data =
|
| ICData::Handle(Z, call->ic_data()->AsUnaryClassChecks());
|
| - if (ic_data.NumberOfChecks() != 1) {
|
| + if (!ic_data.NumberOfChecksIs(1)) {
|
| return false;
|
| }
|
| return FlowGraphInliner::TryReplaceInstanceCallWithInline(
|
| @@ -1303,7 +1303,8 @@ RawBool* AotOptimizer::InstanceOfAsBool(
|
| Class& cls = Class::Handle(Z);
|
|
|
| bool results_differ = false;
|
| - for (int i = 0; i < ic_data.NumberOfChecks(); i++) {
|
| + const intptr_t number_of_checks = ic_data.NumberOfChecks();
|
| + for (int i = 0; i < number_of_checks; i++) {
|
| cls = class_table.At(ic_data.GetReceiverClassIdAt(i));
|
| if (cls.NumTypeArguments() > 0) {
|
| return Bool::null();
|
| @@ -1559,12 +1560,12 @@ void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
|
|
|
| const ICData& unary_checks =
|
| ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks());
|
| - if ((unary_checks.NumberOfChecks() > 0) &&
|
| - (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks)) {
|
| + const intptr_t number_of_checks = unary_checks.NumberOfChecks();
|
| + if (number_of_checks > 0 && number_of_checks <= FLAG_max_polymorphic_checks) {
|
| ZoneGrowableArray<intptr_t>* results =
|
| - new (Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
|
| + new (Z) ZoneGrowableArray<intptr_t>(number_of_checks * 2);
|
| InstanceOfAsBool(unary_checks, type, results);
|
| - if (results->length() == unary_checks.NumberOfChecks() * 2) {
|
| + if (results->length() == number_of_checks * 2) {
|
| const bool can_deopt = TryExpandTestCidsResult(results, type);
|
| if (can_deopt && !IsAllowedForInlining(call->deopt_id())) {
|
| // Guard against repeated speculative inlining.
|
| @@ -1597,10 +1598,10 @@ void AotOptimizer::ReplaceWithTypeCast(InstanceCallInstr* call) {
|
| ASSERT(!type.IsMalformedOrMalbounded());
|
| const ICData& unary_checks =
|
| ICData::ZoneHandle(Z, call->ic_data()->AsUnaryClassChecks());
|
| - if ((unary_checks.NumberOfChecks() > 0) &&
|
| - (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks)) {
|
| + const intptr_t number_of_checks = unary_checks.NumberOfChecks();
|
| + if (number_of_checks > 0 && number_of_checks <= FLAG_max_polymorphic_checks) {
|
| ZoneGrowableArray<intptr_t>* results =
|
| - new (Z) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
|
| + new (Z) ZoneGrowableArray<intptr_t>(number_of_checks * 2);
|
| const Bool& as_bool =
|
| Bool::ZoneHandle(Z, InstanceOfAsBool(unary_checks, type, results));
|
| if (as_bool.raw() == Bool::True().raw()) {
|
| @@ -1665,7 +1666,7 @@ bool AotOptimizer::TryInlineFieldAccess(InstanceCallInstr* call) {
|
|
|
| const ICData& unary_checks =
|
| ICData::Handle(Z, call->ic_data()->AsUnaryClassChecks());
|
| - if ((unary_checks.NumberOfChecks() > 0) && (op_kind == Token::kSET) &&
|
| + if (!unary_checks.NumberOfChecksIs(0) && (op_kind == Token::kSET) &&
|
| TryInlineInstanceSetter(call, unary_checks)) {
|
| return true;
|
| }
|
| @@ -1706,8 +1707,8 @@ void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
|
|
|
| const ICData& unary_checks =
|
| ICData::ZoneHandle(Z, instr->ic_data()->AsUnaryClassChecks());
|
| - if (IsAllowedForInlining(instr->deopt_id()) &&
|
| - (unary_checks.NumberOfChecks() > 0)) {
|
| + const intptr_t number_of_checks = unary_checks.NumberOfChecks();
|
| + if (IsAllowedForInlining(instr->deopt_id()) && number_of_checks > 0) {
|
| if ((op_kind == Token::kINDEX) && TryReplaceWithIndexedOp(instr)) {
|
| return;
|
| }
|
| @@ -1737,8 +1738,7 @@ void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
|
| }
|
| }
|
|
|
| - bool has_one_target =
|
| - (unary_checks.NumberOfChecks() > 0) && unary_checks.HasOneTarget();
|
| + bool has_one_target = number_of_checks > 0 && unary_checks.HasOneTarget();
|
| if (has_one_target) {
|
| // Check if the single target is a polymorphic target, if it is,
|
| // we don't have one target.
|
| @@ -1932,7 +1932,7 @@ void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
|
| instr->ReplaceWith(call, current_iterator());
|
| return;
|
| } else if ((ic_data.raw() != ICData::null()) &&
|
| - (ic_data.NumberOfChecks() > 0)) {
|
| + !ic_data.NumberOfChecksIs(0)) {
|
| PolymorphicInstanceCallInstr* call =
|
| new (Z) PolymorphicInstanceCallInstr(instr, ic_data,
|
| /* with_checks = */ true,
|
| @@ -2021,7 +2021,7 @@ void AotOptimizer::VisitStaticCall(StaticCallInstr* call) {
|
| // We can handle only monomorphic min/max call sites with both arguments
|
| // being either doubles or smis.
|
| if (CanUnboxDouble() && call->HasICData() &&
|
| - (call->ic_data()->NumberOfChecks() == 1)) {
|
| + call->ic_data()->NumberOfChecksIs(1)) {
|
| const ICData& ic_data = *call->ic_data();
|
| intptr_t result_cid = kIllegalCid;
|
| if (ICDataHasReceiverArgumentClassIds(ic_data, kDoubleCid,
|
| @@ -2047,7 +2047,7 @@ void AotOptimizer::VisitStaticCall(StaticCallInstr* call) {
|
| break;
|
| }
|
| case MethodRecognizer::kDoubleFromInteger: {
|
| - if (call->HasICData() && (call->ic_data()->NumberOfChecks() == 1)) {
|
| + if (call->HasICData() && call->ic_data()->NumberOfChecksIs(1)) {
|
| const ICData& ic_data = *call->ic_data();
|
| if (CanUnboxDouble()) {
|
| if (ArgIsAlways(kSmiCid, ic_data, 1)) {
|
| @@ -2090,7 +2090,7 @@ bool AotOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
|
| }
|
|
|
| ASSERT(instr->HasICData());
|
| - if (unary_ic_data.NumberOfChecks() == 0) {
|
| + if (unary_ic_data.NumberOfChecksIs(0)) {
|
| // No type feedback collected.
|
| return false;
|
| }
|
|
|