Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 763b6369e3583a0a1c9b1a41bd3af7e93e8fe34e..a6935cc44c625799aa66e9dbca14c66f2d250da6 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -2732,12 +2732,7 @@ class HLoadExternalArrayPointer: public HUnaryOperation { |
class HCheckMaps: public HTemplateInstruction<2> { |
public: |
static HCheckMaps* New(HValue* value, Handle<Map> map, Zone* zone, |
- HValue *typecheck = NULL) { |
- HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck); |
- check_map->map_set_.Add(map, zone); |
- return check_map; |
- } |
- |
+ CompilationInfo* info, HValue *typecheck = NULL); |
static HCheckMaps* New(HValue* value, SmallMapList* maps, Zone* zone, |
HValue *typecheck = NULL) { |
HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck); |
@@ -2771,6 +2766,8 @@ class HCheckMaps: public HTemplateInstruction<2> { |
return check_map; |
} |
+ bool CanOmitMapChecks() { return omit_; } |
+ |
virtual bool HasEscapingOperandAt(int index) { return false; } |
virtual Representation RequiredInputRepresentation(int index) { |
return Representation::Tagged(); |
@@ -2806,7 +2803,7 @@ class HCheckMaps: public HTemplateInstruction<2> { |
private: |
// Clients should use one of the static New* methods above. |
HCheckMaps(HValue* value, Zone *zone, HValue* typecheck) |
- : map_unique_ids_(0, zone) { |
+ : omit_(false), map_unique_ids_(0, zone) { |
SetOperandAt(0, value); |
// Use the object value for the dependency if NULL is passed. |
// TODO(titzer): do GVN flags already express this dependency? |
@@ -2818,6 +2815,16 @@ class HCheckMaps: public HTemplateInstruction<2> { |
SetGVNFlag(kDependsOnElementsKind); |
} |
+ void omit(CompilationInfo* info) { |
+ omit_ = true; |
+ for (int i = 0; i < map_set_.length(); i++) { |
+ Handle<Map> map = map_set_.at(i); |
+ map->AddDependentCompilationInfo(DependentCode::kPrototypeCheckGroup, |
+ info); |
+ } |
+ } |
+ |
+ bool omit_; |
SmallMapList map_set_; |
ZoneList<UniqueValueId> map_unique_ids_; |
}; |
@@ -3296,6 +3303,11 @@ class HConstant: public HTemplateInstruction<0> { |
return handle_; |
} |
+ bool InstanceOf(Handle<Map> map) { |
+ return handle_->IsJSObject() && |
+ Handle<JSObject>::cast(handle_)->map() == *map; |
+ } |
+ |
bool IsSpecialDouble() const { |
return has_double_value_ && |
(BitCast<int64_t>(double_value_) == BitCast<int64_t>(-0.0) || |