Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index b9eab45293befcf143e0bfa77abc8f347cc459b9..5c1c12528b61d92201839c6f33b141612e89fd56 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -1086,6 +1086,7 @@ class HValue: public ZoneObject { |
| virtual HValue* Canonicalize() { return this; } |
| bool Equals(HValue* other); |
| + virtual int CompareOperandCount() { return OperandCount(); } |
|
danno
2013/08/05 10:07:36
See comment below about storing the context explic
Toon Verwaest
2013/08/05 11:32:13
Done.
|
| virtual intptr_t Hashcode(); |
| // Compute unique ids upfront that is safe wrt GC and parallel recompilation. |
| @@ -2866,7 +2867,7 @@ class HLoadExternalArrayPointer: public HUnaryOperation { |
| }; |
| -class HCheckMaps: public HTemplateInstruction<2> { |
| +class HCheckMaps: public HTemplateInstruction<3> { |
|
danno
2013/08/05 10:07:36
It seems to me this class would be much cleaner if
Toon Verwaest
2013/08/05 11:32:13
Done.
|
| public: |
| static HCheckMaps* New(Zone* zone, HValue* context, HValue* value, |
| Handle<Map> map, CompilationInfo* info, |
| @@ -2874,9 +2875,11 @@ class HCheckMaps: public HTemplateInstruction<2> { |
| static HCheckMaps* New(Zone* zone, HValue* context, |
| HValue* value, SmallMapList* maps, |
| HValue *typecheck = NULL) { |
| - HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck); |
| + HCheckMaps* check_map = new(zone) HCheckMaps( |
| + context, value, zone, typecheck); |
| for (int i = 0; i < maps->length(); i++) { |
| check_map->map_set_.Add(maps->at(i), zone); |
| + check_map->has_migration_target_ |= maps->at(i)->is_migration_target(); |
| } |
| check_map->map_set_.Sort(); |
| return check_map; |
| @@ -2893,13 +2896,19 @@ class HCheckMaps: public HTemplateInstruction<2> { |
| virtual void PrintDataTo(StringStream* stream); |
| HValue* value() { return OperandAt(0); } |
| + HValue* context() { return OperandAt(2); } |
| SmallMapList* map_set() { return &map_set_; } |
| + bool has_migration_target() { |
| + return has_migration_target_; |
| + } |
| + |
| virtual void FinalizeUniqueValueId(); |
| DECLARE_CONCRETE_INSTRUCTION(CheckMaps) |
| protected: |
| + virtual int CompareOperandCount() { return OperandCount() - 1; } |
| virtual bool DataEquals(HValue* other) { |
| ASSERT_EQ(map_set_.length(), map_unique_ids_.length()); |
| HCheckMaps* b = HCheckMaps::cast(other); |
| @@ -2917,13 +2926,14 @@ class HCheckMaps: public HTemplateInstruction<2> { |
| private: |
| // Clients should use one of the static New* methods above. |
| - HCheckMaps(HValue* value, Zone *zone, HValue* typecheck) |
| - : HTemplateInstruction<2>(value->type()), |
| - omit_(false), map_unique_ids_(0, zone) { |
| + HCheckMaps(HValue* context, HValue* value, Zone *zone, HValue* typecheck) |
| + : HTemplateInstruction<3>(value->type()), |
| + omit_(false), has_migration_target_(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? |
| SetOperandAt(1, typecheck != NULL ? typecheck : value); |
| + SetOperandAt(2, context); |
| set_representation(Representation::Tagged()); |
| SetFlag(kUseGVN); |
| SetFlag(kTrackSideEffectDominators); |
| @@ -2941,6 +2951,7 @@ class HCheckMaps: public HTemplateInstruction<2> { |
| } |
| bool omit_; |
| + bool has_migration_target_; |
| SmallMapList map_set_; |
| ZoneList<UniqueValueId> map_unique_ids_; |
| }; |