Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index ee25193441e33f39056fcecebb99931949ef8cbf..c2cb271277afc0e4ccdfb9fd15f3f374aab96cb3 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -4053,10 +4053,11 @@ class ArrayInstructionInterface { |
}; |
class HLoadKeyedFastElement |
- : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
+ : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
public: |
HLoadKeyedFastElement(HValue* obj, |
HValue* key, |
+ HValue* dependency, |
ElementsKind elements_kind = FAST_ELEMENTS) |
: bit_field_(0) { |
ASSERT(IsFastSmiOrObjectElementsKind(elements_kind)); |
@@ -4067,6 +4068,7 @@ class HLoadKeyedFastElement |
} |
SetOperandAt(0, obj); |
SetOperandAt(1, key); |
+ SetOperandAt(2, dependency); |
set_representation(Representation::Tagged()); |
SetGVNFlag(kDependsOnArrayElements); |
SetFlag(kUseGVN); |
@@ -4074,6 +4076,7 @@ class HLoadKeyedFastElement |
HValue* object() { return OperandAt(0); } |
HValue* key() { return OperandAt(1); } |
+ HValue* dependency() { return OperandAt(2); } |
uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); } |
void SetIndexOffset(uint32_t index_offset) { |
bit_field_ = IndexOffsetField::update(bit_field_, index_offset); |
@@ -4090,9 +4093,9 @@ class HLoadKeyedFastElement |
virtual Representation RequiredInputRepresentation(int index) { |
// The key is supposed to be Integer32. |
- return index == 0 |
- ? Representation::Tagged() |
- : Representation::Integer32(); |
+ if (index == 0) return Representation::Tagged(); |
+ if (index == 1) return Representation::Integer32(); |
+ return Representation::None(); |
} |
virtual void PrintDataTo(StringStream* stream); |
@@ -4122,17 +4125,19 @@ enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK }; |
class HLoadKeyedFastDoubleElement |
- : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
+ : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
public: |
HLoadKeyedFastDoubleElement( |
HValue* elements, |
HValue* key, |
+ HValue* dependency, |
HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK) |
: index_offset_(0), |
is_dehoisted_(false), |
hole_check_mode_(hole_check_mode) { |
SetOperandAt(0, elements); |
SetOperandAt(1, key); |
+ SetOperandAt(2, dependency); |
set_representation(Representation::Double()); |
SetGVNFlag(kDependsOnDoubleArrayElements); |
SetFlag(kUseGVN); |
@@ -4140,6 +4145,7 @@ class HLoadKeyedFastDoubleElement |
HValue* elements() { return OperandAt(0); } |
HValue* key() { return OperandAt(1); } |
+ HValue* dependency() { return OperandAt(2); } |
uint32_t index_offset() { return index_offset_; } |
void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
HValue* GetKey() { return key(); } |
@@ -4149,9 +4155,9 @@ class HLoadKeyedFastDoubleElement |
virtual Representation RequiredInputRepresentation(int index) { |
// The key is supposed to be Integer32. |
- return index == 0 |
- ? Representation::Tagged() |
- : Representation::Integer32(); |
+ if (index == 0) return Representation::Tagged(); |
+ if (index == 1) return Representation::Integer32(); |
+ return Representation::None(); |
} |
bool RequiresHoleCheck() { |
@@ -4178,16 +4184,18 @@ class HLoadKeyedFastDoubleElement |
class HLoadKeyedSpecializedArrayElement |
- : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
+ : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
public: |
HLoadKeyedSpecializedArrayElement(HValue* external_elements, |
HValue* key, |
+ HValue* dependency, |
ElementsKind elements_kind) |
: elements_kind_(elements_kind), |
index_offset_(0), |
is_dehoisted_(false) { |
SetOperandAt(0, external_elements); |
SetOperandAt(1, key); |
+ SetOperandAt(2, dependency); |
if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
set_representation(Representation::Double()); |
@@ -4203,15 +4211,15 @@ class HLoadKeyedSpecializedArrayElement |
virtual void PrintDataTo(StringStream* stream); |
virtual Representation RequiredInputRepresentation(int index) { |
- // The key is supposed to be Integer32, but the base pointer |
- // for the element load is a naked pointer. |
- return index == 0 |
- ? Representation::External() |
- : Representation::Integer32(); |
+ // The key is supposed to be Integer32. |
+ if (index == 0) return Representation::External(); |
+ if (index == 1) return Representation::Integer32(); |
+ return Representation::None(); |
} |
HValue* external_pointer() { return OperandAt(0); } |
HValue* key() { return OperandAt(1); } |
+ HValue* dependency() { return OperandAt(2); } |
ElementsKind elements_kind() const { return elements_kind_; } |
uint32_t index_offset() { return index_offset_; } |
void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |