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

Unified Diff: src/type-feedback-vector.h

Issue 2676583002: [ic] Encode [Keyed]StoreIC's language mode in slot kind instead of code object's flags. (Closed)
Patch Set: Rebasing Created 3 years, 10 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
Index: src/type-feedback-vector.h
diff --git a/src/type-feedback-vector.h b/src/type-feedback-vector.h
index 20ef7b20ab9cd229abd87dc75feb40341a9474ca..378c26a9809023b21c58e8f2ddee72ffbec41f2a 100644
--- a/src/type-feedback-vector.h
+++ b/src/type-feedback-vector.h
@@ -26,8 +26,10 @@ enum class FeedbackVectorSlotKind {
LOAD_IC,
LOAD_GLOBAL_IC,
KEYED_LOAD_IC,
- STORE_IC,
- KEYED_STORE_IC,
+ STORE_SLOPPY_IC,
+ STORE_STRICT_IC,
+ KEYED_STORE_SLOPPY_IC,
+ KEYED_STORE_STRICT_IC,
INTERPRETER_BINARYOP_IC,
INTERPRETER_COMPARE_IC,
STORE_DATA_PROPERTY_IN_LITERAL_IC,
@@ -56,11 +58,21 @@ inline bool IsKeyedLoadICKind(FeedbackVectorSlotKind kind) {
}
inline bool IsStoreICKind(FeedbackVectorSlotKind kind) {
- return kind == FeedbackVectorSlotKind::STORE_IC;
+ return kind == FeedbackVectorSlotKind::STORE_SLOPPY_IC ||
+ kind == FeedbackVectorSlotKind::STORE_STRICT_IC;
}
inline bool IsKeyedStoreICKind(FeedbackVectorSlotKind kind) {
- return kind == FeedbackVectorSlotKind::KEYED_STORE_IC;
+ return kind == FeedbackVectorSlotKind::KEYED_STORE_SLOPPY_IC ||
+ kind == FeedbackVectorSlotKind::KEYED_STORE_STRICT_IC;
+}
+
+inline LanguageMode GetLanguageModeFromICKind(FeedbackVectorSlotKind kind) {
+ DCHECK(IsStoreICKind(kind) || IsKeyedStoreICKind(kind));
+ return (kind == FeedbackVectorSlotKind::STORE_SLOPPY_IC ||
+ kind == FeedbackVectorSlotKind::KEYED_STORE_SLOPPY_IC)
+ ? SLOPPY
+ : STRICT;
}
std::ostream& operator<<(std::ostream& os, FeedbackVectorSlotKind kind);
@@ -69,8 +81,6 @@ std::ostream& operator<<(std::ostream& os, FeedbackVectorSlotKind kind);
template <typename Derived>
class FeedbackVectorSpecBase {
public:
- inline FeedbackVectorSlot AddSlot(FeedbackVectorSlotKind kind);
-
FeedbackVectorSlot AddCallICSlot() {
return AddSlot(FeedbackVectorSlotKind::CALL_IC);
}
@@ -91,12 +101,18 @@ class FeedbackVectorSpecBase {
return AddSlot(FeedbackVectorSlotKind::KEYED_LOAD_IC);
}
- FeedbackVectorSlot AddStoreICSlot() {
- return AddSlot(FeedbackVectorSlotKind::STORE_IC);
+ FeedbackVectorSlot AddStoreICSlot(LanguageMode language_mode) {
+ STATIC_ASSERT(LANGUAGE_END == 2);
+ return AddSlot(is_strict(language_mode)
+ ? FeedbackVectorSlotKind::STORE_STRICT_IC
+ : FeedbackVectorSlotKind::STORE_SLOPPY_IC);
}
- FeedbackVectorSlot AddKeyedStoreICSlot() {
- return AddSlot(FeedbackVectorSlotKind::KEYED_STORE_IC);
+ FeedbackVectorSlot AddKeyedStoreICSlot(LanguageMode language_mode) {
+ STATIC_ASSERT(LANGUAGE_END == 2);
+ return AddSlot(is_strict(language_mode)
+ ? FeedbackVectorSlotKind::KEYED_STORE_STRICT_IC
+ : FeedbackVectorSlotKind::KEYED_STORE_SLOPPY_IC);
}
FeedbackVectorSlot AddInterpreterBinaryOpICSlot() {
@@ -127,6 +143,8 @@ class FeedbackVectorSpecBase {
DECLARE_PRINTER(FeedbackVectorSpec)
private:
+ inline FeedbackVectorSlot AddSlot(FeedbackVectorSlotKind kind);
+
Derived* This() { return static_cast<Derived*>(this); }
};
@@ -138,9 +156,9 @@ class StaticFeedbackVectorSpec
int slots() const { return slot_count_; }
- FeedbackVectorSlotKind GetKind(int slot) const {
- DCHECK(slot >= 0 && slot < slot_count_);
- return kinds_[slot];
+ FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const {
+ DCHECK(slot.ToInt() >= 0 && slot.ToInt() < slot_count_);
+ return kinds_[slot.ToInt()];
}
private:
@@ -166,8 +184,8 @@ class FeedbackVectorSpec : public FeedbackVectorSpecBase<FeedbackVectorSpec> {
int slots() const { return static_cast<int>(slot_kinds_.size()); }
- FeedbackVectorSlotKind GetKind(int slot) const {
- return static_cast<FeedbackVectorSlotKind>(slot_kinds_.at(slot));
+ FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const {
+ return static_cast<FeedbackVectorSlotKind>(slot_kinds_.at(slot.ToInt()));
}
private:
@@ -294,6 +312,11 @@ class TypeFeedbackVector : public FixedArray {
DEFINE_SLOT_KIND_PREDICATE(IsKeyedStoreIC)
#undef DEFINE_SLOT_KIND_PREDICATE
+ // Returns language mode encoded into kind of given slot.
+ inline LanguageMode GetLanguageMode(FeedbackVectorSlot slot) const {
+ return GetLanguageModeFromICKind(GetKind(slot));
+ }
+
#ifdef OBJECT_PRINT
// For gdb debugging.
void Print();
@@ -322,9 +345,6 @@ class TypeFeedbackVector : public FixedArray {
static inline Symbol* RawUninitializedSentinel(Isolate* isolate);
static const int kDummyLoadICSlot = 0;
- static const int kDummyKeyedLoadICSlot = 2;
- static const int kDummyStoreICSlot = 4;
- static const int kDummyKeyedStoreICSlot = 6;
static Handle<TypeFeedbackVector> DummyVector(Isolate* isolate);
@@ -567,10 +587,6 @@ class KeyedLoadICNexus : public FeedbackNexus {
: FeedbackNexus(vector, slot) {
DCHECK(vector->IsKeyedLoadIC(slot));
}
- explicit KeyedLoadICNexus(Isolate* isolate)
- : FeedbackNexus(
- TypeFeedbackVector::DummyVector(isolate),
- FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedLoadICSlot)) {}
KeyedLoadICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
: FeedbackNexus(vector, slot) {
DCHECK(vector->IsKeyedLoadIC(slot));
@@ -599,10 +615,6 @@ class StoreICNexus : public FeedbackNexus {
: FeedbackNexus(vector, slot) {
DCHECK(vector->IsStoreIC(slot));
}
- explicit StoreICNexus(Isolate* isolate)
- : FeedbackNexus(
- TypeFeedbackVector::DummyVector(isolate),
- FeedbackVectorSlot(TypeFeedbackVector::kDummyStoreICSlot)) {}
StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
: FeedbackNexus(vector, slot) {
DCHECK(vector->IsStoreIC(slot));
@@ -625,10 +637,6 @@ class KeyedStoreICNexus : public FeedbackNexus {
: FeedbackNexus(vector, slot) {
DCHECK(vector->IsKeyedStoreIC(slot));
}
- explicit KeyedStoreICNexus(Isolate* isolate)
- : FeedbackNexus(
- TypeFeedbackVector::DummyVector(isolate),
- FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot)) {}
KeyedStoreICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
: FeedbackNexus(vector, slot) {
DCHECK(vector->IsKeyedStoreIC(slot));

Powered by Google App Engine
This is Rietveld 408576698