Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index 4227b8ee067531a4dae5a6c7d4dc21cea5f46dac..8fc7aa12a6254070e8210661403300d311945344 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -792,7 +792,7 @@ class HValue: public ZoneObject { |
| // occurrences of the instruction are indeed the same. |
| kUseGVN, |
| // Track instructions that are dominating side effects. If an instruction |
| - // sets this flag, it must implement SetSideEffectDominator() and should |
| + // sets this flag, it must implement HandleSideEffectDominator() and should |
| // indicate which side effects to track by setting GVN flags. |
| kTrackSideEffectDominators, |
| kCanOverflow, |
| @@ -1111,7 +1111,8 @@ class HValue: public ZoneObject { |
| // This function must be overridden for instructions which have the |
| // kTrackSideEffectDominators flag set, to track instructions that are |
| // dominating side effects. |
| - virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator) { |
| + virtual void HandleSideEffectDominator(GVNFlag side_effect, |
| + HValue* dominator) { |
| UNREACHABLE(); |
| } |
| @@ -2776,7 +2777,8 @@ class HCheckMaps: public HTemplateInstruction<2> { |
| virtual Representation RequiredInputRepresentation(int index) { |
| return Representation::Tagged(); |
| } |
| - virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator); |
| + virtual void HandleSideEffectDominator(GVNFlag side_effect, |
| + HValue* dominator); |
| virtual void PrintDataTo(StringStream* stream); |
| virtual HType CalculateInferredType(); |
| @@ -4977,10 +4979,12 @@ class HAllocateObject: public HTemplateInstruction<1> { |
| virtual Representation RequiredInputRepresentation(int index) { |
| return Representation::Tagged(); |
| } |
| + |
| virtual Handle<Map> GetMonomorphicJSObjectMap() { |
| ASSERT(!constructor_initial_map_.is_null()); |
| return constructor_initial_map_; |
| } |
| + |
| virtual HType CalculateInferredType(); |
| DECLARE_CONCRETE_INSTRUCTION(AllocateObject) |
| @@ -5009,7 +5013,9 @@ class HAllocate: public HTemplateInstruction<2> { |
| SetOperandAt(0, context); |
| SetOperandAt(1, size); |
| set_representation(Representation::Tagged()); |
| + SetFlag(kTrackSideEffectDominators); |
| SetGVNFlag(kChangesNewSpacePromotion); |
| + SetGVNFlag(kDependsOnNewSpacePromotion); |
| } |
| static Flags DefaultFlags() { |
| @@ -5027,6 +5033,7 @@ class HAllocate: public HTemplateInstruction<2> { |
| HValue* context() { return OperandAt(0); } |
| HValue* size() { return OperandAt(1); } |
| + HType type() { return type_; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| if (index == 0) { |
| @@ -5063,6 +5070,13 @@ class HAllocate: public HTemplateInstruction<2> { |
| return (flags_ & ALLOCATE_DOUBLE_ALIGNED) != 0; |
| } |
| + void UpdateSize(HValue* size) { |
| + SetOperandAt(1, size); |
| + } |
| + |
| + virtual void HandleSideEffectDominator(GVNFlag side_effect, |
| + HValue* dominator); |
| + |
| virtual void PrintDataTo(StringStream* stream); |
| DECLARE_CONCRETE_INSTRUCTION(Allocate) |
| @@ -5075,8 +5089,9 @@ class HAllocate: public HTemplateInstruction<2> { |
| class HInnerAllocatedObject: public HTemplateInstruction<1> { |
| public: |
| - HInnerAllocatedObject(HValue* value, int offset) |
| - : offset_(offset) { |
| + HInnerAllocatedObject(HValue* value, int offset, HType type = HType::Tagged()) |
| + : offset_(offset), |
| + type_(type) { |
| ASSERT(value->IsAllocate()); |
| SetOperandAt(0, value); |
| set_representation(Representation::Tagged()); |
| @@ -5089,12 +5104,15 @@ class HInnerAllocatedObject: public HTemplateInstruction<1> { |
| return Representation::Tagged(); |
| } |
| + virtual HType CalculateInferredType(); |
| + |
| virtual void PrintDataTo(StringStream* stream); |
| DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject) |
| private: |
| int offset_; |
| + HType type_; |
| }; |
| @@ -5780,7 +5798,8 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
| HObjectAccess access, |
| HValue* val, |
| Representation field_representation |
| - = Representation::Tagged()) |
| + = Representation::Tagged(), |
| + bool no_observable_side_effects = false) |
| : access_(access), |
| field_representation_(field_representation), |
| transition_(), |
| @@ -5789,6 +5808,9 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
| SetOperandAt(0, obj); |
| SetOperandAt(1, val); |
| access.SetGVNFlags(this, true); |
| + if (no_observable_side_effects) { |
|
titzer
2013/07/08 12:40:14
Please don't add more flags to this constructor; y
Michael Starzinger
2013/07/08 12:44:06
Can we add a TODO here that this argument should g
Hannes Payer (out of office)
2013/07/08 13:43:48
Done.
Hannes Payer (out of office)
2013/07/08 13:43:48
This is needed otherwise the HGraph Verifier is no
titzer
2013/07/08 13:49:38
In either case, you should set the flag where you
Michael Starzinger
2013/07/08 14:02:43
+1 on Ben's last comment.
Hannes Payer (out of office)
2013/07/09 08:26:15
Done.
|
| + SetFlag(HValue::kHasNoObservableSideEffects); |
| + } |
| } |
| DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) |
| @@ -5804,7 +5826,8 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
| } |
| return Representation::Tagged(); |
| } |
| - virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator) { |
| + virtual void HandleSideEffectDominator(GVNFlag side_effect, |
| + HValue* dominator) { |
| ASSERT(side_effect == kChangesNewSpacePromotion); |
| new_space_dominator_ = dominator; |
| } |
| @@ -5998,7 +6021,8 @@ class HStoreKeyed |
| return value()->IsConstant() && HConstant::cast(value())->IsTheHole(); |
| } |
| - virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator) { |
| + virtual void HandleSideEffectDominator(GVNFlag side_effect, |
| + HValue* dominator) { |
| ASSERT(side_effect == kChangesNewSpacePromotion); |
| new_space_dominator_ = dominator; |
| } |