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

Unified Diff: runtime/vm/simulator_dbc.cc

Issue 2187423002: DBC: Implement coverage by adding missing count increments to unoptimized static and instance calls. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: . Created 4 years, 5 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/simulator_dbc.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/simulator_dbc.cc
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 416dda577e7635daf1b5d7bcad6818e9ac9004f2..de12ec70b006f5361c96ea22a7cff18c5cdaa4a4 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -122,6 +122,17 @@ class SimulatorHelpers {
f->ptr()->usage_counter_++;
}
+ DART_FORCE_INLINE static void IncrementICUsageCount(RawObject** entries,
+ intptr_t offset,
+ intptr_t args_tested) {
+ const intptr_t count_offset = ICData::CountIndexFor(args_tested);
+ const intptr_t raw_smi_old =
+ reinterpret_cast<intptr_t>(entries[offset + count_offset]);
+ const intptr_t raw_smi_new = raw_smi_old + Smi::RawValue(1);
+ *reinterpret_cast<intptr_t*>(&entries[offset + count_offset]) =
+ raw_smi_new;
+ }
+
DART_FORCE_INLINE static bool IsStrictEqualWithNumberCheck(RawObject* lhs,
RawObject* rhs) {
if (lhs == rhs) {
@@ -588,7 +599,8 @@ DART_FORCE_INLINE void Simulator::InstanceCall1(Thread* thread,
RawObjectPool** pp,
uint32_t** pc,
RawObject*** FP,
- RawObject*** SP) {
+ RawObject*** SP,
+ bool optimized) {
ASSERT(icdata->GetClassId() == kICDataCid);
const intptr_t kCheckedArgs = 1;
@@ -599,7 +611,8 @@ DART_FORCE_INLINE void Simulator::InstanceCall1(Thread* thread,
bool found = false;
const intptr_t length = Smi::Value(cache->length_);
- for (intptr_t i = 0;
+ intptr_t i;
+ for (i = 0;
i < (length - (kCheckedArgs + 2)); i += (kCheckedArgs + 2)) {
if (cache->data()[i + 0] == receiver_cid) {
top[0] = cache->data()[i + kCheckedArgs];
@@ -608,7 +621,11 @@ DART_FORCE_INLINE void Simulator::InstanceCall1(Thread* thread,
}
}
- if (!found) {
+ if (found) {
+ if (!optimized) {
+ SimulatorHelpers::IncrementICUsageCount(cache->data(), i, kCheckedArgs);
+ }
+ } else {
InlineCacheMiss(
kCheckedArgs, thread, icdata, call_base, top, *pc, *FP, *SP);
}
@@ -626,7 +643,8 @@ DART_FORCE_INLINE void Simulator::InstanceCall2(Thread* thread,
RawObjectPool** pp,
uint32_t** pc,
RawObject*** FP,
- RawObject*** SP) {
+ RawObject*** SP,
+ bool optimized) {
ASSERT(icdata->GetClassId() == kICDataCid);
const intptr_t kCheckedArgs = 2;
@@ -638,7 +656,8 @@ DART_FORCE_INLINE void Simulator::InstanceCall2(Thread* thread,
bool found = false;
const intptr_t length = Smi::Value(cache->length_);
- for (intptr_t i = 0;
+ intptr_t i;
+ for (i = 0;
i < (length - (kCheckedArgs + 2)); i += (kCheckedArgs + 2)) {
if ((cache->data()[i + 0] == receiver_cid) &&
(cache->data()[i + 1] == arg0_cid)) {
@@ -648,7 +667,11 @@ DART_FORCE_INLINE void Simulator::InstanceCall2(Thread* thread,
}
}
- if (!found) {
+ if (found) {
+ if (!optimized) {
+ SimulatorHelpers::IncrementICUsageCount(cache->data(), i, kCheckedArgs);
+ }
+ } else {
InlineCacheMiss(
kCheckedArgs, thread, icdata, call_base, top, *pc, *FP, *SP);
}
@@ -762,12 +785,8 @@ static DART_NOINLINE bool InvokeNativeWrapper(
ASSERT(Bytecode::IsCallOpcode(*pc)); \
const uint16_t kidx = Bytecode::DecodeD(*pc); \
const RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx)); \
- RawObject** data = icdata->ptr()->ic_data_->ptr()->data(); \
- const intptr_t count_offset = ICData::CountIndexFor(2); \
- const intptr_t raw_smi_old = \
- reinterpret_cast<intptr_t>(data[count_offset]); \
- const intptr_t raw_smi_new = raw_smi_old + Smi::RawValue(1); \
- *reinterpret_cast<intptr_t*>(&data[count_offset]) = raw_smi_new; \
+ RawObject** entries = icdata->ptr()->ic_data_->ptr()->data(); \
+ SimulatorHelpers::IncrementICUsageCount(entries, 0, 2); \
} while (0); \
// Declare bytecode handler for a smi operation (e.g. AddTOS) with the
@@ -1389,8 +1408,9 @@ RawObject* Simulator::Call(const Code& code,
// Lookup the funciton in the ICData.
RawObject* ic_data_obj = SP[0];
RawICData* ic_data = RAW_CAST(ICData, ic_data_obj);
- RawArray* cache = ic_data->ptr()->ic_data_->ptr();
- SP[0] = cache->data()[ICData::TargetIndexFor(
+ RawObject** data = ic_data->ptr()->ic_data_->ptr()->data();
+ SimulatorHelpers::IncrementICUsageCount(data, 0, 0);
+ SP[0] = data[ICData::TargetIndexFor(
ic_data->ptr()->state_bits_ & 0x3)];
RawObject** call_base = SP - argc;
RawObject** call_top = SP; // *SP contains function
@@ -1431,8 +1451,9 @@ RawObject* Simulator::Call(const Code& code,
RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
SimulatorHelpers::IncrementUsageCounter(
RAW_CAST(Function, icdata->ptr()->owner_));
- InstanceCall1(
- thread, icdata, call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
+ InstanceCall1(thread, icdata, call_base, call_top,
+ &argdesc, &pp, &pc, &FP, &SP,
+ false /* optimized */);
}
DISPATCH();
@@ -1456,8 +1477,9 @@ RawObject* Simulator::Call(const Code& code,
RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
SimulatorHelpers::IncrementUsageCounter(
RAW_CAST(Function, icdata->ptr()->owner_));
- InstanceCall2(
- thread, icdata, call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
+ InstanceCall2(thread, icdata, call_base, call_top,
+ &argdesc, &pp, &pc, &FP, &SP,
+ false /* optimized */);
}
DISPATCH();
@@ -1475,8 +1497,9 @@ RawObject* Simulator::Call(const Code& code,
RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
SimulatorHelpers::IncrementUsageCounter(FrameFunction(FP));
- InstanceCall1(
- thread, icdata, call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
+ InstanceCall1(thread, icdata, call_base, call_top,
+ &argdesc, &pp, &pc, &FP, &SP,
+ true /* optimized */);
}
DISPATCH();
@@ -1494,8 +1517,9 @@ RawObject* Simulator::Call(const Code& code,
RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
SimulatorHelpers::IncrementUsageCounter(FrameFunction(FP));
- InstanceCall2(
- thread, icdata, call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
+ InstanceCall2(thread, icdata, call_base, call_top,
+ &argdesc, &pp, &pc, &FP, &SP,
+ true /* optimized */);
}
DISPATCH();
« no previous file with comments | « runtime/vm/simulator_dbc.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698