Index: src/crankshaft/hydrogen-instructions.h |
diff --git a/src/crankshaft/hydrogen-instructions.h b/src/crankshaft/hydrogen-instructions.h |
index bba8f33e1441cadb349c65312d65023e2b6e701b..c47adf0e68cd7f6a0687c388d848ac693f9a16da 100644 |
--- a/src/crankshaft/hydrogen-instructions.h |
+++ b/src/crankshaft/hydrogen-instructions.h |
@@ -926,6 +926,12 @@ std::ostream& operator<<(std::ostream& os, const ChangesOf& v); |
return new (zone) I(p1, p2, p3, p4, p5, p6); \ |
} |
+#define DECLARE_INSTRUCTION_FACTORY_P7(I, P1, P2, P3, P4, P5, P6, P7) \ |
+ static I* New(Isolate* isolate, Zone* zone, HValue* context, P1 p1, P2 p2, \ |
+ P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { \ |
+ return new (zone) I(p1, p2, p3, p4, p5, p6, p7); \ |
+ } |
+ |
#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \ |
static I* New(Isolate* isolate, Zone* zone, HValue* context) { \ |
return new (zone) I(context); \ |
@@ -6507,14 +6513,14 @@ enum LoadKeyedHoleMode { |
}; |
-class HLoadKeyed final : public HTemplateInstruction<3>, |
+class HLoadKeyed final : public HTemplateInstruction<4>, |
public ArrayInstructionInterface { |
public: |
- DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, |
+ DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, HValue*, |
ElementsKind); |
- DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, |
+ DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, HValue*, |
ElementsKind, LoadKeyedHoleMode); |
- DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, |
+ DECLARE_INSTRUCTION_FACTORY_P7(HLoadKeyed, HValue*, HValue*, HValue*, HValue*, |
ElementsKind, LoadKeyedHoleMode, int); |
bool is_fixed_typed_array() const { |
@@ -6527,6 +6533,11 @@ class HLoadKeyed final : public HTemplateInstruction<3>, |
return OperandAt(2); |
} |
bool HasDependency() const { return OperandAt(0) != OperandAt(2); } |
+ HValue* backing_store_owner() const { |
+ DCHECK(HasBackingStoreOwner()); |
+ return OperandAt(3); |
+ } |
+ bool HasBackingStoreOwner() const { return OperandAt(0) != OperandAt(3); } |
uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } |
bool TryIncreaseBaseOffset(uint32_t increase_by_value) override; |
HValue* GetKey() override { return key(); } |
@@ -6557,7 +6568,12 @@ class HLoadKeyed final : public HTemplateInstruction<3>, |
return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
OperandAt(1)->representation()); |
} |
- return Representation::None(); |
+ if (index == 2) { |
+ return Representation::None(); |
+ } |
+ DCHECK_EQ(3, index); |
+ return HasBackingStoreOwner() ? Representation::Tagged() |
+ : Representation::None(); |
} |
Representation observed_input_representation(int index) override { |
@@ -6585,7 +6601,7 @@ class HLoadKeyed final : public HTemplateInstruction<3>, |
private: |
HLoadKeyed(HValue* obj, HValue* key, HValue* dependency, |
- ElementsKind elements_kind, |
+ HValue* backing_store_owner, ElementsKind elements_kind, |
LoadKeyedHoleMode mode = NEVER_RETURN_HOLE, |
int offset = kDefaultKeyedHeaderOffsetSentinel) |
: bit_field_(0) { |
@@ -6598,7 +6614,9 @@ class HLoadKeyed final : public HTemplateInstruction<3>, |
SetOperandAt(0, obj); |
SetOperandAt(1, key); |
- SetOperandAt(2, dependency != NULL ? dependency : obj); |
+ SetOperandAt(2, dependency != nullptr ? dependency : obj); |
+ SetOperandAt(3, backing_store_owner != nullptr ? backing_store_owner : obj); |
+ DCHECK_EQ(HasBackingStoreOwner(), is_fixed_typed_array()); |
if (!is_fixed_typed_array()) { |
// I can detect the case between storing double (holey and fast) and |
@@ -6951,15 +6969,16 @@ class HStoreNamedGeneric final : public HTemplateInstruction<3> { |
}; |
-class HStoreKeyed final : public HTemplateInstruction<3>, |
+class HStoreKeyed final : public HTemplateInstruction<4>, |
public ArrayInstructionInterface { |
public: |
- DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, |
- ElementsKind); |
DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, |
- ElementsKind, StoreFieldOrKeyedMode); |
+ HValue*, ElementsKind); |
DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, |
- ElementsKind, StoreFieldOrKeyedMode, int); |
+ HValue*, ElementsKind, StoreFieldOrKeyedMode); |
+ DECLARE_INSTRUCTION_FACTORY_P7(HStoreKeyed, HValue*, HValue*, HValue*, |
+ HValue*, ElementsKind, StoreFieldOrKeyedMode, |
+ int); |
Representation RequiredInputRepresentation(int index) override { |
// kind_fast: tagged[int32] = tagged |
@@ -6973,10 +6992,13 @@ class HStoreKeyed final : public HTemplateInstruction<3>, |
} else if (index == 1) { |
return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
OperandAt(1)->representation()); |
+ } else if (index == 2) { |
+ return RequiredValueRepresentation(elements_kind(), store_mode()); |
} |
- DCHECK_EQ(index, 2); |
- return RequiredValueRepresentation(elements_kind(), store_mode()); |
+ DCHECK_EQ(3, index); |
+ return HasBackingStoreOwner() ? Representation::Tagged() |
+ : Representation::None(); |
} |
static Representation RequiredValueRepresentation( |
@@ -7005,7 +7027,7 @@ class HStoreKeyed final : public HTemplateInstruction<3>, |
} |
Representation observed_input_representation(int index) override { |
- if (index < 2) return RequiredInputRepresentation(index); |
+ if (index != 2) return RequiredInputRepresentation(index); |
if (IsUninitialized()) { |
return Representation::None(); |
} |
@@ -7019,6 +7041,11 @@ class HStoreKeyed final : public HTemplateInstruction<3>, |
HValue* elements() const { return OperandAt(0); } |
HValue* key() const { return OperandAt(1); } |
HValue* value() const { return OperandAt(2); } |
+ HValue* backing_store_owner() const { |
+ DCHECK(HasBackingStoreOwner()); |
+ return OperandAt(3); |
+ } |
+ bool HasBackingStoreOwner() const { return OperandAt(0) != OperandAt(3); } |
bool value_is_smi() const { return IsFastSmiElementsKind(elements_kind()); } |
StoreFieldOrKeyedMode store_mode() const { |
return StoreModeField::decode(bit_field_); |
@@ -7074,7 +7101,8 @@ class HStoreKeyed final : public HTemplateInstruction<3>, |
DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) |
private: |
- HStoreKeyed(HValue* obj, HValue* key, HValue* val, ElementsKind elements_kind, |
+ HStoreKeyed(HValue* obj, HValue* key, HValue* val, |
+ HValue* backing_store_owner, ElementsKind elements_kind, |
StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, |
int offset = kDefaultKeyedHeaderOffsetSentinel) |
: base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel |
@@ -7088,6 +7116,8 @@ class HStoreKeyed final : public HTemplateInstruction<3>, |
SetOperandAt(0, obj); |
SetOperandAt(1, key); |
SetOperandAt(2, val); |
+ SetOperandAt(3, backing_store_owner != nullptr ? backing_store_owner : obj); |
+ DCHECK_EQ(HasBackingStoreOwner(), is_fixed_typed_array()); |
if (IsFastObjectElementsKind(elements_kind)) { |
SetFlag(kTrackSideEffectDominators); |