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

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

Issue 2342853002: [TypeFeedbackVector] special ic slots for interpreter compare/binary ops. (Closed)
Patch Set: Code comments. Created 4 years, 3 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 a633fd2cafdecf4dc72fadd461ae7c9ececf4a13..526d0b0c299f91f5535aa4ca0ea4ab85eee42983 100644
--- a/src/type-feedback-vector.h
+++ b/src/type-feedback-vector.h
@@ -10,6 +10,7 @@
#include "src/base/logging.h"
#include "src/elements-kind.h"
#include "src/objects.h"
+#include "src/type-hints.h"
#include "src/zone-containers.h"
namespace v8 {
@@ -27,6 +28,8 @@ enum class FeedbackVectorSlotKind {
KEYED_LOAD_IC,
STORE_IC,
KEYED_STORE_IC,
+ INTERPRETER_BINARYOP_IC,
+ INTERPRETER_COMPARE_IC,
// This is a general purpose slot that occupies one feedback vector element.
GENERAL,
@@ -67,6 +70,14 @@ class FeedbackVectorSpecBase {
return AddSlot(FeedbackVectorSlotKind::KEYED_STORE_IC);
}
+ FeedbackVectorSlot AddInterpreterBinaryOpICSlot() {
+ return AddSlot(FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC);
+ }
+
+ FeedbackVectorSlot AddInterpreterCompareICSlot() {
+ return AddSlot(FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC);
+ }
+
FeedbackVectorSlot AddGeneralSlot() {
return AddSlot(FeedbackVectorSlotKind::GENERAL);
}
@@ -207,7 +218,7 @@ class TypeFeedbackMetadata : public FixedArray {
static const char* Kind2String(FeedbackVectorSlotKind kind);
private:
- static const int kFeedbackVectorSlotKindBits = 4;
+ static const int kFeedbackVectorSlotKindBits = 5;
STATIC_ASSERT(static_cast<int>(FeedbackVectorSlotKind::KINDS_NUMBER) <
(1 << kFeedbackVectorSlotKindBits));
@@ -236,7 +247,8 @@ class TypeFeedbackVector : public FixedArray {
static const int kInvocationCountIndex = 1;
static const int kReservedIndexCount = 2;
- inline void ComputeCounts(int* with_type_info, int* generic);
+ inline void ComputeCounts(int* with_type_info, int* generic,
+ bool code_is_interpreted);
inline bool is_empty() const;
@@ -636,6 +648,72 @@ class KeyedStoreICNexus : public FeedbackNexus {
InlineCacheState StateFromFeedback() const override;
Name* FindFirstName() const override;
};
+
+class BinaryOpICNexus final : public FeedbackNexus {
+ public:
+ BinaryOpICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
+ : FeedbackNexus(vector, slot) {
+ DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC,
+ vector->GetKind(slot));
+ }
+ BinaryOpICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
+ : FeedbackNexus(vector, slot) {
+ DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC,
+ vector->GetKind(slot));
+ }
+
+ void Clear(Code* host);
+
+ InlineCacheState StateFromFeedback() const final;
+ BinaryOperationHint GetBinaryOperationFeedback() const;
+
+ int ExtractMaps(MapHandleList* maps) const final {
+ // BinaryOpICs don't record map feedback.
+ return 0;
+ }
+ MaybeHandle<Object> FindHandlerForMap(Handle<Map> map) const final {
+ return MaybeHandle<Code>();
+ }
+ bool FindHandlers(List<Handle<Object>>* code_list,
+ int length = -1) const final {
+ return length == 0;
+ }
+};
+
+class CompareICNexus final : public FeedbackNexus {
+ public:
+ CompareICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
+ : FeedbackNexus(vector, slot) {
+ DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC,
+ vector->GetKind(slot));
+ }
+ CompareICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
+ : FeedbackNexus(vector, slot) {
+ DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC,
+ vector->GetKind(slot));
+ }
+
+ void Clear(Code* host);
+
+ InlineCacheState StateFromFeedback() const final;
+ CompareOperationHint GetCompareOperationFeedback() const;
+
+ int ExtractMaps(MapHandleList* maps) const final {
+ // BinaryOpICs don't record map feedback.
+ return 0;
+ }
+ MaybeHandle<Object> FindHandlerForMap(Handle<Map> map) const final {
+ return MaybeHandle<Code>();
+ }
+ bool FindHandlers(List<Handle<Object>>* code_list,
+ int length = -1) const final {
+ return length == 0;
+ }
+};
+
+inline BinaryOperationHint BinaryOperationHintFromFeedback(int type_feedback);
+inline CompareOperationHint CompareOperationHintFromFeedback(int type_feedback);
+
} // namespace internal
} // namespace v8

Powered by Google App Engine
This is Rietveld 408576698