| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index d5b1c75ebf8b7f87bffd705e7c3a2dce999229ed..4721af1b26f9bff6488d91338ba9f8ac95f8a7b5 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -49,11 +49,11 @@ class HEnvironment;
|
| class HInferRepresentationPhase;
|
| class HInstruction;
|
| class HLoopInformation;
|
| +class HStoreNamedField;
|
| class HValue;
|
| class LInstruction;
|
| class LChunkBuilder;
|
|
|
| -
|
| #define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \
|
| V(ArithmeticBinaryOperation) \
|
| V(BinaryOperation) \
|
| @@ -3230,8 +3230,27 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> {
|
| DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation);
|
| DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double);
|
| DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>);
|
| + DECLARE_INSTRUCTION_FACTORY_P2(HConstant, Handle<Map>, UniqueValueId);
|
| DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference);
|
|
|
| + static HConstant* CreateAndInsertAfter(Zone* zone,
|
| + HValue* context,
|
| + int32_t value,
|
| + HInstruction* instruction) {
|
| + HConstant* new_constant = HConstant::New(zone, context, value);
|
| + new_constant->InsertAfter(instruction);
|
| + return new_constant;
|
| + }
|
| +
|
| + static HConstant* CreateAndInsertBefore(Zone* zone,
|
| + HValue* context,
|
| + int32_t value,
|
| + HInstruction* instruction) {
|
| + HConstant* new_constant = HConstant::New(zone, context, value);
|
| + new_constant->InsertBefore(instruction);
|
| + return new_constant;
|
| + }
|
| +
|
| Handle<Object> handle() {
|
| if (handle_.is_null()) {
|
| Factory* factory = Isolate::Current()->factory();
|
| @@ -3434,6 +3453,8 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> {
|
| bool is_not_in_new_space,
|
| bool is_cell,
|
| bool boolean_value);
|
| + HConstant(Handle<Map> handle,
|
| + UniqueValueId unique_id);
|
| explicit HConstant(ExternalReference reference);
|
|
|
| void Initialize(Representation r);
|
| @@ -5101,10 +5122,6 @@ class HAllocate V8_FINAL : public HTemplateInstruction<2> {
|
| flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED);
|
| }
|
|
|
| - void UpdateSize(HValue* size) {
|
| - SetOperandAt(1, size);
|
| - }
|
| -
|
| virtual void HandleSideEffectDominator(GVNFlag side_effect,
|
| HValue* dominator) V8_OVERRIDE;
|
|
|
| @@ -5126,7 +5143,9 @@ class HAllocate V8_FINAL : public HTemplateInstruction<2> {
|
| HType type,
|
| PretenureFlag pretenure_flag,
|
| InstanceType instance_type)
|
| - : HTemplateInstruction<2>(type) {
|
| + : HTemplateInstruction<2>(type),
|
| + dominating_allocate_(NULL),
|
| + filler_free_space_size_(NULL) {
|
| SetOperandAt(0, context);
|
| SetOperandAt(1, size);
|
| set_representation(Representation::Tagged());
|
| @@ -5143,8 +5162,27 @@ class HAllocate V8_FINAL : public HTemplateInstruction<2> {
|
| }
|
| }
|
|
|
| + void UpdateSize(HValue* size) {
|
| + SetOperandAt(1, size);
|
| + }
|
| +
|
| + HAllocate* GetFoldableDominator(HAllocate* dominator);
|
| +
|
| + void UpdateFreeSpaceFiller(int32_t filler_size);
|
| +
|
| + void CreateFreeSpaceFiller(int32_t filler_size);
|
| +
|
| + bool IsFoldable(HAllocate* allocate) {
|
| + return (IsNewSpaceAllocation() && allocate->IsNewSpaceAllocation()) ||
|
| + (IsOldDataSpaceAllocation() && allocate->IsOldDataSpaceAllocation()) ||
|
| + (IsOldPointerSpaceAllocation() &&
|
| + allocate->IsOldPointerSpaceAllocation());
|
| + }
|
| +
|
| Flags flags_;
|
| Handle<Map> known_initial_map_;
|
| + HAllocate* dominating_allocate_;
|
| + HStoreNamedField* filler_free_space_size_;
|
| };
|
|
|
|
|
| @@ -5991,6 +6029,10 @@ class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> {
|
| return access_.representation();
|
| }
|
|
|
| + void UpdateValue(HValue* value) {
|
| + SetOperandAt(1, value);
|
| + }
|
| +
|
| private:
|
| HStoreNamedField(HValue* obj,
|
| HObjectAccess access,
|
|
|