Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index edd93f0748e0ca90e5f884542a9bf38399177875..e01f5879898c4a636f839595223e16b498e59a8b 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -4027,10 +4027,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)); |
@@ -4041,6 +4042,7 @@ class HLoadKeyedFastElement |
} |
SetOperandAt(0, obj); |
SetOperandAt(1, key); |
+ SetOperandAt(2, dependency); |
set_representation(Representation::Tagged()); |
SetGVNFlag(kDependsOnArrayElements); |
SetFlag(kUseGVN); |
@@ -4048,6 +4050,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); |
@@ -4064,9 +4067,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); |
@@ -4096,17 +4099,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); |
@@ -4114,6 +4119,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(); } |
@@ -4123,9 +4129,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() { |
@@ -4152,16 +4158,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()); |
@@ -4177,15 +4185,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; } |