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, |