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

Unified Diff: src/crankshaft/hydrogen-instructions.h

Issue 1493983004: [crankshaft] Loads and stores to typed arrays have to reference the backing store holder (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 5 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
« no previous file with comments | « src/crankshaft/hydrogen.cc ('k') | src/crankshaft/hydrogen-instructions.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « src/crankshaft/hydrogen.cc ('k') | src/crankshaft/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698