| 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();
|
|
|