Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index a623775f2f8aa68dddb9fbd3c93703321bfde43f..0278b73cf0a9906b5709d794028e0d22c20c0014 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -155,6 +155,7 @@ class LChunkBuilder; |
V(StoreKeyedGeneric) \ |
V(StoreNamedField) \ |
V(StoreNamedGeneric) \ |
+ V(StringAdd) \ |
V(StringCharCodeAt) \ |
V(StringCharFromCode) \ |
V(StringLength) \ |
@@ -1707,6 +1708,16 @@ class HCheckInstanceType: public HUnaryOperation { |
virtual void Verify(); |
#endif |
+ virtual HValue* Canonicalize() { |
+ if (!value()->type().IsUninitialized() && |
+ value()->type().IsString() && |
+ first() == FIRST_STRING_TYPE && |
+ last() == LAST_STRING_TYPE) { |
+ return NULL; |
+ } |
+ return this; |
+ } |
+ |
static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value); |
InstanceType first() const { return first_; } |
@@ -1748,6 +1759,18 @@ class HCheckNonSmi: public HUnaryOperation { |
virtual void Verify(); |
#endif |
+ virtual HValue* Canonicalize() { |
+ HType value_type = value()->type(); |
+ if (!value_type.IsUninitialized() && |
+ (value_type.IsHeapNumber() || |
+ value_type.IsString() || |
+ value_type.IsBoolean() || |
+ value_type.IsNonPrimitive())) { |
+ return NULL; |
+ } |
+ return this; |
+ } |
+ |
DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check_non_smi") |
protected: |
@@ -3408,6 +3431,29 @@ class HStoreKeyedGeneric: public HTemplateInstruction<4> { |
}; |
+class HStringAdd: public HBinaryOperation { |
+ public: |
+ HStringAdd(HValue* left, HValue* right) : HBinaryOperation(left, right) { |
+ set_representation(Representation::Tagged()); |
+ SetFlag(kUseGVN); |
+ SetFlag(kDependsOnMaps); |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
+ |
+ virtual HType CalculateInferredType() { |
+ return HType::String(); |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string_add") |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) { return true; } |
+}; |
+ |
+ |
class HStringCharCodeAt: public HBinaryOperation { |
public: |
HStringCharCodeAt(HValue* string, HValue* index) |