Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 21994839d1dd14f01b5cce6a7afa7662ea8ee8d4..7dab551d2d261a21333eb637df507170021c6391 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -94,11 +94,13 @@ class LChunkBuilder; |
V(CompareJSObjectEq) \ |
V(CompareMap) \ |
V(CompareSymbolEq) \ |
+ V(CompareConstantEq) \ |
V(Constant) \ |
V(Context) \ |
V(DeleteProperty) \ |
V(Deoptimize) \ |
V(Div) \ |
+ V(ElementsKind) \ |
V(EnterInlined) \ |
V(ExternalArrayLength) \ |
V(FixedArrayLength) \ |
@@ -402,7 +404,7 @@ class HType { |
kBoolean = 0x85, // 0000 0000 1000 0101 |
kNonPrimitive = 0x101, // 0000 0001 0000 0001 |
kJSObject = 0x301, // 0000 0011 0000 0001 |
- kJSArray = 0x701, // 0000 0111 1000 0001 |
+ kJSArray = 0x701, // 0000 0111 0000 0001 |
kUninitialized = 0x1fff // 0001 1111 1111 1111 |
}; |
@@ -484,6 +486,10 @@ class HValue: public ZoneObject { |
GVN_FLAG_LIST(DECLARE_DO) |
#undef DECLARE_DO |
kFlexibleRepresentation, |
+ // Participate in Global Value Numbering, i.e. elimination of |
+ // unnecessary recomputations. If an instruction sets this flag, it must |
+ // implement DataEquals(), which will be used to determine if other |
+ // occurrences of the instruction are indeed the same. |
kUseGVN, |
kCanOverflow, |
kBailoutOnMinusZero, |
@@ -1707,6 +1713,25 @@ class HExternalArrayLength: public HUnaryOperation { |
}; |
+class HElementsKind: public HUnaryOperation { |
+ public: |
+ explicit HElementsKind(HValue* value) : HUnaryOperation(value) { |
+ set_representation(Representation::Integer32()); |
+ SetFlag(kUseGVN); |
+ SetFlag(kDependsOnMaps); |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(ElementsKind) |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) { return true; } |
+}; |
+ |
+ |
class HBitNot: public HUnaryOperation { |
public: |
explicit HBitNot(HValue* value) : HUnaryOperation(value) { |
@@ -2589,6 +2614,43 @@ class HCompareSymbolEq: public HBinaryOperation { |
}; |
+class HCompareConstantEq: public HUnaryOperation { |
+ public: |
+ HCompareConstantEq(HValue* left, int right, Token::Value op) |
+ : HUnaryOperation(left), op_(op), right_(right) { |
+ ASSERT(op == Token::EQ_STRICT); |
+ set_representation(Representation::Tagged()); |
+ SetFlag(kUseGVN); |
+ } |
+ |
+ Token::Value op() const { return op_; } |
+ int right() const { return right_; } |
+ |
+ virtual bool EmitAtUses() { |
+ return !HasSideEffects() && !HasMultipleUses(); |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Integer32(); |
+ } |
+ |
+ virtual HType CalculateInferredType() { return HType::Boolean(); } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(CompareConstantEq); |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) { |
+ HCompareConstantEq* other_instr = HCompareConstantEq::cast(other); |
+ return (op_ == other_instr->op_ && |
+ right_ == other_instr->right_); |
+ } |
+ |
+ private: |
+ const Token::Value op_; |
+ const int right_; |
+}; |
+ |
+ |
class HUnaryPredicate: public HUnaryOperation { |
public: |
explicit HUnaryPredicate(HValue* value) : HUnaryOperation(value) { |
@@ -2694,6 +2756,10 @@ class HHasInstanceType: public HUnaryPredicate { |
InstanceType from() { return from_; } |
InstanceType to() { return to_; } |
+ virtual bool EmitAtUses() { |
+ return !HasSideEffects() && !HasMultipleUses(); |
+ } |
+ |
virtual void PrintDataTo(StringStream* stream); |
DECLARE_CONCRETE_INSTRUCTION(HasInstanceType) |