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

Unified Diff: runtime/vm/flow_graph_optimizer.cc

Issue 254723003: Remember all deopt reasons in ic_data, not just the last one. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 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 | « runtime/vm/flow_graph_inliner.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_optimizer.cc
===================================================================
--- runtime/vm/flow_graph_optimizer.cc (revision 35455)
+++ runtime/vm/flow_graph_optimizer.cc (working copy)
@@ -109,9 +109,9 @@
// to megamorphic call.
return false;
}
- GrowableArray<intptr_t> class_ids(call->ic_data()->num_args_tested());
- ASSERT(call->ic_data()->num_args_tested() <= call->ArgumentCount());
- for (intptr_t i = 0; i < call->ic_data()->num_args_tested(); i++) {
+ GrowableArray<intptr_t> class_ids(call->ic_data()->NumArgsTested());
+ ASSERT(call->ic_data()->NumArgsTested() <= call->ArgumentCount());
+ for (intptr_t i = 0; i < call->ic_data()->NumArgsTested(); i++) {
const intptr_t cid = call->PushArgumentAt(i)->value()->Type()->ToCid();
class_ids.Add(cid);
}
@@ -173,7 +173,7 @@
static const ICData& TrySpecializeICData(const ICData& ic_data, intptr_t cid) {
- ASSERT(ic_data.num_args_tested() == 1);
+ ASSERT(ic_data.NumArgsTested() == 1);
if ((ic_data.NumberOfChecks() == 1) &&
(ic_data.GetReceiverClassIdAt(0) == cid)) {
@@ -186,12 +186,12 @@
// not found in the ICData.
if (!function.IsNull()) {
const ICData& new_ic_data = ICData::ZoneHandle(ICData::New(
- Function::Handle(ic_data.function()),
+ Function::Handle(ic_data.owner()),
String::Handle(ic_data.target_name()),
Object::empty_array(), // Dummy argument descriptor.
ic_data.deopt_id(),
- ic_data.num_args_tested()));
- new_ic_data.set_deopt_reason(ic_data.deopt_reason());
+ ic_data.NumArgsTested()));
+ new_ic_data.SetDeoptReasons(ic_data.DeoptReasons());
new_ic_data.AddReceiverCheck(cid, function);
return new_ic_data;
}
@@ -817,7 +817,7 @@
intptr_t argument_class_id) {
ASSERT(receiver_class_id != kIllegalCid);
ASSERT(argument_class_id != kIllegalCid);
- if (ic_data.num_args_tested() != 2) return false;
+ if (ic_data.NumArgsTested() != 2) return false;
Function& target = Function::Handle();
const intptr_t len = ic_data.NumberOfChecks();
@@ -851,7 +851,7 @@
const ICData& ic_data,
const GrowableArray<intptr_t>& receiver_class_ids,
const GrowableArray<intptr_t>& argument_class_ids) {
- if (ic_data.num_args_tested() != 2) return false;
+ if (ic_data.NumArgsTested() != 2) return false;
Function& target = Function::Handle();
const intptr_t len = ic_data.NumberOfChecks();
for (intptr_t i = 0; i < len; i++) {
@@ -988,7 +988,7 @@
static bool ArgIsAlways(intptr_t cid,
const ICData& ic_data,
intptr_t arg_number) {
- ASSERT(ic_data.num_args_tested() > arg_number);
+ ASSERT(ic_data.NumArgsTested() > arg_number);
const intptr_t num_checks = ic_data.NumberOfChecks();
if (num_checks == 0) return false;
for (intptr_t i = 0; i < num_checks; i++) {
@@ -1585,8 +1585,8 @@
(array_cid == kTypedDataUint32ArrayCid)) {
// Set deopt_id if we can optimistically assume that the result is Smi.
// Assume mixed Mint/Smi if this instruction caused deoptimization once.
- deopt_id = (ic_data.deopt_reason() == kDeoptUnknown) ?
- call->deopt_id() : Isolate::kNoDeoptId;
+ deopt_id = ic_data.HasDeoptReasons() ?
+ Isolate::kNoDeoptId : call->deopt_id();
}
// Array load and return.
@@ -1767,7 +1767,7 @@
bool FlowGraphOptimizer::TryReplaceWithEqualityOp(InstanceCallInstr* call,
Token::Kind op_kind) {
const ICData& ic_data = *call->ic_data();
- ASSERT(ic_data.num_args_tested() == 2);
+ ASSERT(ic_data.NumArgsTested() == 2);
ASSERT(call->ArgumentCount() == 2);
Definition* left = call->ArgumentAt(0);
@@ -1871,7 +1871,7 @@
bool FlowGraphOptimizer::TryReplaceWithRelationalOp(InstanceCallInstr* call,
Token::Kind op_kind) {
const ICData& ic_data = *call->ic_data();
- ASSERT(ic_data.num_args_tested() == 2);
+ ASSERT(ic_data.NumArgsTested() == 2);
ASSERT(call->ArgumentCount() == 2);
Definition* left = call->ArgumentAt(0);
@@ -1936,14 +1936,14 @@
if (HasOnlyTwoOf(ic_data, kSmiCid)) {
// Don't generate smi code if the IC data is marked because
// of an overflow.
- operands_type = (ic_data.deopt_reason() == kDeoptBinarySmiOp)
+ operands_type = ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)
? kMintCid
: kSmiCid;
} else if (HasTwoMintOrSmi(ic_data) &&
FlowGraphCompiler::SupportsUnboxedMints()) {
// Don't generate mint code if the IC data is marked because of an
// overflow.
- if (ic_data.deopt_reason() == kDeoptBinaryMintOp) return false;
+ if (ic_data.HasDeoptReason(ICData::kDeoptBinaryMintOp)) return false;
operands_type = kMintCid;
} else if (ShouldSpecializeForDouble(ic_data)) {
operands_type = kDoubleCid;
@@ -1962,7 +1962,7 @@
// Don't generate smi code if the IC data is marked because of an
// overflow.
// TODO(fschneider): Add unboxed mint multiplication.
- if (ic_data.deopt_reason() == kDeoptBinarySmiOp) return false;
+ if (ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)) return false;
operands_type = kSmiCid;
} else if (ShouldSpecializeForDouble(ic_data)) {
operands_type = kDoubleCid;
@@ -2005,10 +2005,10 @@
// Left shift may overflow from smi into mint or big ints.
// Don't generate smi code if the IC data is marked because
// of an overflow.
- if (ic_data.deopt_reason() == kDeoptShiftMintOp) {
+ if (ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
return false;
}
- operands_type = (ic_data.deopt_reason() == kDeoptBinarySmiOp)
+ operands_type = ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)
? kMintCid
: kSmiCid;
} else if (HasTwoMintOrSmi(ic_data) &&
@@ -2016,7 +2016,7 @@
ic_data.AsUnaryClassChecksForArgNr(1)))) {
// Don't generate mint code if the IC data is marked because of an
// overflow.
- if (ic_data.deopt_reason() == kDeoptShiftMintOp) {
+ if (ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
return false;
}
// Check for smi/mint << smi or smi/mint >> smi.
@@ -2028,7 +2028,7 @@
case Token::kMOD:
case Token::kTRUNCDIV:
if (HasOnlyTwoOf(ic_data, kSmiCid)) {
- if (ic_data.deopt_reason() == kDeoptBinarySmiOp) {
+ if (ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)) {
return false;
}
operands_type = kSmiCid;
@@ -2831,7 +2831,7 @@
const ICData& ic_data = *call->ic_data();
Definition* input = call->ArgumentAt(0);
Definition* d2i_instr = NULL;
- if (ic_data.deopt_reason() == kDeoptDoubleToSmi) {
+ if (ic_data.HasDeoptReason(ICData::kDeoptDoubleToSmi)) {
// Do not repeatedly deoptimize because result didn't fit into Smi.
d2i_instr = new DoubleToIntegerInstr(new Value(input), call);
} else {
@@ -2939,12 +2939,12 @@
if (recognized_kind == MethodRecognizer::kIntegerLeftShiftWithMask32) {
ASSERT(call->ArgumentCount() == 3);
- ASSERT(ic_data.num_args_tested() == 2);
+ ASSERT(ic_data.NumArgsTested() == 2);
Definition* value = call->ArgumentAt(0);
Definition* count = call->ArgumentAt(1);
Definition* int32_mask = call->ArgumentAt(2);
if (HasOnlyTwoOf(ic_data, kSmiCid)) {
- if (ic_data.deopt_reason() == kDeoptShiftMintOp) {
+ if (ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
return false;
}
// We cannot overflow. The input value must be a Smi
@@ -2981,7 +2981,7 @@
if (HasTwoMintOrSmi(ic_data) &&
HasOnlyOneSmi(ICData::Handle(ic_data.AsUnaryClassChecksForArgNr(1)))) {
if (!FlowGraphCompiler::SupportsUnboxedMints() ||
- (ic_data.deopt_reason() == kDeoptShiftMintOp)) {
+ ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
return false;
}
ShiftMintOpInstr* left_shift =
@@ -3407,8 +3407,8 @@
(array_cid == kTypedDataUint32ArrayCid)) {
// Set deopt_id if we can optimistically assume that the result is Smi.
// Assume mixed Mint/Smi if this instruction caused deoptimization once.
- deopt_id = (ic_data.deopt_reason() == kDeoptUnknown) ?
- call->deopt_id() : Isolate::kNoDeoptId;
+ deopt_id = ic_data.HasDeoptReasons() ?
+ Isolate::kNoDeoptId : call->deopt_id();
}
*last = new LoadIndexedInstr(new Value(array),
@@ -3489,7 +3489,7 @@
// We don't have ICData for the value stored, so we optimistically assume
// smis first. If we ever deoptimized here, we require to unbox the value
// before storing to handle the mint case, too.
- if (i_call->ic_data()->deopt_reason() == kDeoptUnknown) {
+ if (!i_call->ic_data()->HasDeoptReasons()) {
value_check = ICData::New(flow_graph_->parsed_function().function(),
i_call->function_name(),
Object::empty_array(), // Dummy args. descr.
@@ -3684,7 +3684,7 @@
const AbstractType& type,
ZoneGrowableArray<intptr_t>* results) const {
results->Clear();
- ASSERT(ic_data.num_args_tested() == 1); // Unary checks only.
+ ASSERT(ic_data.NumArgsTested() == 1); // Unary checks only.
if (!type.IsInstantiated() || type.IsMalformedOrMalbounded()) {
return Bool::null();
}
@@ -4228,7 +4228,7 @@
bool FlowGraphOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
const ICData& unary_ic_data) {
ASSERT((unary_ic_data.NumberOfChecks() > 0) &&
- (unary_ic_data.num_args_tested() == 1));
+ (unary_ic_data.NumArgsTested() == 1));
if (FLAG_enable_type_checks) {
// Checked mode setters are inlined like normal methods by conventional
// inlining.
« no previous file with comments | « runtime/vm/flow_graph_inliner.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698