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

Unified Diff: runtime/vm/object.h

Issue 807593002: Merge RawICData::range_feedback_ field into RawICData::state_bits_. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years 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
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.

Powered by Google App Engine
This is Rietveld 408576698