Chromium Code Reviews| Index: runtime/vm/object.h |
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
| index afc884eee1c74d4cbd92ce697408755e007fd761..56fc48e3559c47ca272beb948b64f50864cf3aad 100644 |
| --- a/runtime/vm/object.h |
| +++ b/runtime/vm/object.h |
| @@ -3547,20 +3547,19 @@ class ICData : public Object { |
| return raw_ptr()->deopt_id_; |
| } |
| - uint32_t range_feedback() const { |
| - return raw_ptr()->range_feedback_; |
| - } |
| - |
| + // Note: only deopts with reasons below kUnknown in this list are recorded in |
|
zra
2014/12/15 20:57:38
"below" could be a little confusing. I first read
|
| + // the ICData. All other reasons are used purely for printing informational |
| + // messages printed during deoptimization itself. |
| #define DEOPT_REASONS(V) \ |
| + V(BinarySmiOp) \ |
| + V(BinaryMintOp) \ |
| + V(DoubleToSmi) \ |
| V(Unknown) \ |
| V(InstanceGetter) \ |
| V(PolymorphicInstanceCallTestFail) \ |
| V(InstanceCallNoICData) \ |
| V(IntegerToDouble) \ |
| - V(BinarySmiOp) \ |
| - V(BinaryMintOp) \ |
| V(UnaryMintOp) \ |
| - V(ShiftMintOp) \ |
| V(BinaryDoubleOp) \ |
| V(InstanceSetter) \ |
| V(Equality) \ |
| @@ -3573,7 +3572,6 @@ class ICData : public Object { |
| V(CheckSmi) \ |
| V(CheckArrayBound) \ |
| V(AtCall) \ |
| - V(DoubleToSmi) \ |
| V(Int32Load) \ |
| V(Uint32Load) \ |
| V(GuardField) \ |
| @@ -3586,6 +3584,10 @@ class ICData : public Object { |
| #undef DEFINE_ENUM_LIST |
| }; |
| + enum { |
| + kLastRecordedDeoptReason = kDeoptUnknown - 1 |
| + }; |
| + |
| enum DeoptFlags { |
| // Deoptimization is caused by an optimistically hoisted instruction. |
| kHoisted = 1 << 0, |
| @@ -3645,10 +3647,6 @@ class ICData : public Object { |
| return OFFSET_OF(RawICData, owner_); |
| } |
| - static intptr_t range_feedback_offset() { |
| - return OFFSET_OF(RawICData, range_feedback_); |
| - } |
| - |
| // Used for unoptimized static calls when no class-ids are checked. |
| void AddTarget(const Function& target) const; |
| @@ -3756,17 +3754,22 @@ class ICData : public Object { |
| // |
| // DecodeRangeFeedbackAt() helper maps these states into the RangeFeedback |
| // enumeration. |
| - enum RangeFeedbackBits { |
| + enum RangeFeedbackLatticeBits { |
| kSignedRangeBit = 1 << 0, |
| kInt32RangeBit = 1 << 1, |
| kUint32RangeBit = 1 << 2, |
| kInt64RangeBit = 1 << 3, |
| kBitsPerRangeFeedback = 4, |
| - kRangeFeedbackMask = (1 << kBitsPerRangeFeedback) - 1 |
| + kRangeFeedbackMask = (1 << kBitsPerRangeFeedback) - 1, |
| + kRangeFeedbackSlots = 3 |
| }; |
| static bool IsValidRangeFeedbackIndex(intptr_t index) { |
| - return (0 <= index) && (index < 3); |
| + return (0 <= index) && (index < kRangeFeedbackSlots); |
| + } |
| + |
| + static intptr_t RangeFeedbackShift(intptr_t index) { |
| + return (index * kBitsPerRangeFeedback) + kRangeFeedbackPos; |
| } |
| static const char* RangeFeedbackToString(RangeFeedback feedback) { |
| @@ -3802,14 +3805,15 @@ class ICData : public Object { |
| void SetNumArgsTested(intptr_t value) const; |
| void set_ic_data(const Array& value) const; |
| void set_state_bits(uint32_t bits) const; |
| - void set_range_feedback(uint32_t feedback); |
| enum { |
| kNumArgsTestedPos = 0, |
| kNumArgsTestedSize = 2, |
| kDeoptReasonPos = kNumArgsTestedPos + kNumArgsTestedSize, |
| - kDeoptReasonSize = kDeoptNumReasons, |
| + kDeoptReasonSize = kLastRecordedDeoptReason + 1, |
| kIssuedJSWarningBit = kDeoptReasonPos + kDeoptReasonSize, |
| + kRangeFeedbackPos = kIssuedJSWarningBit + 1, |
| + kRangeFeedbackSize = kBitsPerRangeFeedback * kRangeFeedbackSlots |
| }; |
| class NumArgsTestedBits : public BitField<uint32_t, |
| @@ -3817,6 +3821,8 @@ class ICData : public Object { |
| class DeoptReasonBits : public BitField<uint32_t, |
| ICData::kDeoptReasonPos, ICData::kDeoptReasonSize> {}; // NOLINT |
| class IssuedJSWarningBit : public BitField<bool, kIssuedJSWarningBit, 1> {}; |
| + class RangeFeedbackBits : public BitField<uint32_t, |
| + ICData::kRangeFeedbackPos, ICData::kRangeFeedbackSize> {}; // NOLINT |
| #if defined(DEBUG) |
| // Used in asserts to verify that a check is not added twice. |