| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index cfbcc135dfc3eaddb2e8e9e536b7b21287b4fc96..bd8d028819ce1006a664725675f02918f9be6a2f 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -2680,39 +2680,27 @@ class HLoadExternalArrayPointer: public HUnaryOperation {
|
|
|
| class HCheckMaps: public HTemplateInstruction<2> {
|
| public:
|
| - HCheckMaps(HValue* value, Handle<Map> map, Zone* zone,
|
| - HValue* typecheck = NULL)
|
| - : map_unique_ids_(0, zone) {
|
| - SetOperandAt(0, value);
|
| - // If callers don't depend on a typecheck, they can pass in NULL. In that
|
| - // case we use a copy of the |value| argument as a dummy value.
|
| - SetOperandAt(1, typecheck != NULL ? typecheck : value);
|
| - set_representation(Representation::Tagged());
|
| - SetFlag(kUseGVN);
|
| - SetFlag(kTrackSideEffectDominators);
|
| - SetGVNFlag(kDependsOnMaps);
|
| - SetGVNFlag(kDependsOnElementsKind);
|
| - map_set()->Add(map, zone);
|
| + 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;
|
| }
|
| - HCheckMaps(HValue* value, SmallMapList* maps, Zone* zone)
|
| - : map_unique_ids_(0, zone) {
|
| - SetOperandAt(0, value);
|
| - SetOperandAt(1, value);
|
| - set_representation(Representation::Tagged());
|
| - SetFlag(kUseGVN);
|
| - SetFlag(kTrackSideEffectDominators);
|
| - SetGVNFlag(kDependsOnMaps);
|
| - SetGVNFlag(kDependsOnElementsKind);
|
| +
|
| + static HCheckMaps* New(HValue* value, SmallMapList* maps, Zone* zone,
|
| + HValue *typecheck = NULL) {
|
| + HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck);
|
| for (int i = 0; i < maps->length(); i++) {
|
| - map_set()->Add(maps->at(i), zone);
|
| + check_map->map_set_.Add(maps->at(i), zone);
|
| }
|
| - map_set()->Sort();
|
| + check_map->map_set_.Sort();
|
| + return check_map;
|
| }
|
|
|
| - static HCheckMaps* NewWithTransitions(HValue* object, Handle<Map> map,
|
| + static HCheckMaps* NewWithTransitions(HValue* value, Handle<Map> map,
|
| Zone* zone) {
|
| - HCheckMaps* check_map = new(zone) HCheckMaps(object, map, zone);
|
| - SmallMapList* map_set = check_map->map_set();
|
| + HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, value);
|
| + check_map->map_set_.Add(map, zone);
|
|
|
| // Since transitioned elements maps of the initial map don't fail the map
|
| // check, the CheckMaps instruction doesn't need to depend on ElementsKinds.
|
| @@ -2725,10 +2713,10 @@ class HCheckMaps: public HTemplateInstruction<2> {
|
| Map* transitioned_map =
|
| map->LookupElementsTransitionMap(kind);
|
| if (transitioned_map) {
|
| - map_set->Add(Handle<Map>(transitioned_map), zone);
|
| + check_map->map_set_.Add(Handle<Map>(transitioned_map), zone);
|
| }
|
| };
|
| - map_set->Sort();
|
| + check_map->map_set_.Sort();
|
| return check_map;
|
| }
|
|
|
| @@ -2763,6 +2751,20 @@ 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) {
|
| + 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);
|
| + set_representation(Representation::Tagged());
|
| + SetFlag(kUseGVN);
|
| + SetFlag(kTrackSideEffectDominators);
|
| + SetGVNFlag(kDependsOnMaps);
|
| + SetGVNFlag(kDependsOnElementsKind);
|
| + }
|
| +
|
| SmallMapList map_set_;
|
| ZoneList<UniqueValueId> map_unique_ids_;
|
| };
|
|
|