| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index aed2b4bd289df6283dc57de79844f4eeb1f3f838..05f6c1ca751df022053fa0fa256897c6a63b74ce 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -36,6 +36,7 @@
|
| #include "deoptimizer.h"
|
| #include "small-pointer-list.h"
|
| #include "string-stream.h"
|
| +#include "unique.h"
|
| #include "v8conversions.h"
|
| #include "v8utils.h"
|
| #include "zone.h"
|
| @@ -2558,7 +2559,6 @@ class HCheckMaps V8_FINAL : public HTemplateInstruction<2> {
|
| for (int i = 0; i < maps->length(); i++) {
|
| check_map->Add(maps->at(i), zone);
|
| }
|
| - check_map->map_set_.Sort();
|
| return check_map;
|
| }
|
|
|
| @@ -2573,38 +2573,26 @@ class HCheckMaps V8_FINAL : public HTemplateInstruction<2> {
|
| virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
|
|
|
| HValue* value() { return OperandAt(0); }
|
| - SmallMapList* map_set() { return &map_set_; }
|
| - ZoneList<UniqueValueId>* map_unique_ids() { return &map_unique_ids_; }
|
|
|
| - bool has_migration_target() {
|
| + Unique<Map> first_map() const { return map_set_.at(0); }
|
| + UniqueSet<Map> map_set() const { return map_set_; }
|
| +
|
| + bool has_migration_target() const {
|
| return has_migration_target_;
|
| }
|
|
|
| - virtual void FinalizeUniqueValueId() V8_OVERRIDE;
|
| -
|
| DECLARE_CONCRETE_INSTRUCTION(CheckMaps)
|
|
|
| protected:
|
| virtual bool DataEquals(HValue* other) V8_OVERRIDE {
|
| - ASSERT_EQ(map_set_.length(), map_unique_ids_.length());
|
| - HCheckMaps* b = HCheckMaps::cast(other);
|
| - // Relies on the fact that map_set has been sorted before.
|
| - if (map_unique_ids_.length() != b->map_unique_ids_.length()) {
|
| - return false;
|
| - }
|
| - for (int i = 0; i < map_unique_ids_.length(); i++) {
|
| - if (map_unique_ids_.at(i) != b->map_unique_ids_.at(i)) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| + return this->map_set_.Equals(&HCheckMaps::cast(other)->map_set_);
|
| }
|
|
|
| virtual int RedefinedOperandIndex() { return 0; }
|
|
|
| private:
|
| void Add(Handle<Map> map, Zone* zone) {
|
| - map_set_.Add(map, zone);
|
| + map_set_.Add(Unique<Map>(map), zone);
|
| if (!has_migration_target_ && map->is_migration_target()) {
|
| has_migration_target_ = true;
|
| SetGVNFlag(kChangesNewSpacePromotion);
|
| @@ -2614,10 +2602,9 @@ class HCheckMaps V8_FINAL : public HTemplateInstruction<2> {
|
| // Clients should use one of the static New* methods above.
|
| HCheckMaps(HValue* value, Zone *zone, HValue* typecheck)
|
| : HTemplateInstruction<2>(value->type()),
|
| - omit_(false), has_migration_target_(false), map_unique_ids_(0, zone) {
|
| + omit_(false), has_migration_target_(false) {
|
| 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);
|
| @@ -2626,36 +2613,33 @@ class HCheckMaps V8_FINAL : 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);
|
| - if (!map->CanTransition()) continue;
|
| - map->AddDependentCompilationInfo(DependentCode::kPrototypeCheckGroup,
|
| - info);
|
| - }
|
| - }
|
| -
|
| bool omit_;
|
| bool has_migration_target_;
|
| - SmallMapList map_set_;
|
| - ZoneList<UniqueValueId> map_unique_ids_;
|
| + UniqueSet<Map> map_set_;
|
| };
|
|
|
|
|
| class HCheckValue V8_FINAL : public HUnaryOperation {
|
| public:
|
| static HCheckValue* New(Zone* zone, HValue* context,
|
| - HValue* value, Handle<JSFunction> target) {
|
| - bool in_new_space = zone->isolate()->heap()->InNewSpace(*target);
|
| + HValue* value, Handle<JSFunction> func) {
|
| + bool in_new_space = zone->isolate()->heap()->InNewSpace(*func);
|
| + // NOTE: We create an uninitialized Unique and initialize it later.
|
| + // This is because a JSFunction can move due to GC during graph creation.
|
| + // TODO(titzer): This is a migration crutch. Replace with some kind of
|
| + // Uniqueness scope later.
|
| + Unique<JSFunction> target = Unique<JSFunction>::CreateUninitialized(func);
|
| HCheckValue* check = new(zone) HCheckValue(value, target, in_new_space);
|
| return check;
|
| }
|
| static HCheckValue* New(Zone* zone, HValue* context,
|
| - HValue* value, Handle<Map> map, UniqueValueId id) {
|
| - HCheckValue* check = new(zone) HCheckValue(value, map, false);
|
| - check->object_unique_id_ = id;
|
| - return check;
|
| + HValue* value, Unique<HeapObject> target,
|
| + bool object_in_new_space) {
|
| + return new(zone) HCheckValue(value, target, object_in_new_space);
|
| + }
|
| +
|
| + virtual void FinalizeUniqueValueId() V8_OVERRIDE {
|
| + object_ = Unique<HeapObject>(object_.handle());
|
| }
|
|
|
| virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
|
| @@ -2669,11 +2653,7 @@ class HCheckValue V8_FINAL : public HUnaryOperation {
|
| virtual void Verify() V8_OVERRIDE;
|
| #endif
|
|
|
| - virtual void FinalizeUniqueValueId() V8_OVERRIDE {
|
| - object_unique_id_ = UniqueValueId(object_);
|
| - }
|
| -
|
| - Handle<HeapObject> object() const { return object_; }
|
| + Unique<HeapObject> object() const { return object_; }
|
| bool object_in_new_space() const { return object_in_new_space_; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(CheckValue)
|
| @@ -2681,19 +2661,20 @@ class HCheckValue V8_FINAL : public HUnaryOperation {
|
| protected:
|
| virtual bool DataEquals(HValue* other) V8_OVERRIDE {
|
| HCheckValue* b = HCheckValue::cast(other);
|
| - return object_unique_id_ == b->object_unique_id_;
|
| + return object_ == b->object_;
|
| }
|
|
|
| private:
|
| - HCheckValue(HValue* value, Handle<HeapObject> object, bool in_new_space)
|
| + HCheckValue(HValue* value, Unique<HeapObject> object,
|
| + bool object_in_new_space)
|
| : HUnaryOperation(value, value->type()),
|
| - object_(object), object_in_new_space_(in_new_space) {
|
| + object_(object),
|
| + object_in_new_space_(object_in_new_space) {
|
| set_representation(Representation::Tagged());
|
| SetFlag(kUseGVN);
|
| }
|
|
|
| - Handle<HeapObject> object_;
|
| - UniqueValueId object_unique_id_;
|
| + Unique<HeapObject> object_;
|
| bool object_in_new_space_;
|
| };
|
|
|
| @@ -3441,6 +3422,12 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> {
|
| unique_id_ == other;
|
| }
|
|
|
| + Unique<Object> GetUnique() const {
|
| + // TODO(titzer): store a Unique<HeapObject> inside the HConstant.
|
| + Address raw_address = reinterpret_cast<Address>(unique_id_.Hashcode());
|
| + return Unique<Object>(raw_address, handle_);
|
| + }
|
| +
|
| #ifdef DEBUG
|
| virtual void Verify() V8_OVERRIDE { }
|
| #endif
|
|
|