Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1148)

Unified Diff: runtime/vm/aot_optimizer.cc

Issue 2734883002: ICData::NumberOfChecks is O(n) so don't call it in loops (Closed)
Patch Set: Add const Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | runtime/vm/code_generator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « no previous file | runtime/vm/code_generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698