Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index a4e9ed72b1505026de7592a09d9cbe493f848598..abf6a67fc70b6011f35dd8b48a9e236c4c13ad35 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -667,7 +667,7 @@ class HValue: public ZoneObject { |
| // Operands. |
| virtual int OperandCount() = 0; |
| - virtual HValue* OperandAt(int index) = 0; |
| + virtual HValue* OperandAt(int index) const = 0; |
| void SetOperandAt(int index, HValue* value); |
| void DeleteAndReplaceWith(HValue* other); |
| @@ -778,6 +778,10 @@ class HValue: public ZoneObject { |
| UNREACHABLE(); |
| } |
| + bool IsDead() const { |
| + return HasNoUses() && !HasObservableSideEffects() && IsDeletable(); |
| + } |
| + |
| #ifdef DEBUG |
| virtual void Verify() = 0; |
| #endif |
| @@ -862,6 +866,8 @@ class HValue: public ZoneObject { |
| GVNFlagSet gvn_flags_; |
| private: |
| + virtual bool IsDeletable() const { return false; } |
| + |
| DISALLOW_COPY_AND_ASSIGN(HValue); |
| }; |
| @@ -930,7 +936,7 @@ template<int V> |
| class HTemplateInstruction : public HInstruction { |
| public: |
| int OperandCount() { return V; } |
| - HValue* OperandAt(int i) { return inputs_[i]; } |
| + HValue* OperandAt(int i) const { return inputs_[i]; } |
| protected: |
| void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } |
| @@ -982,7 +988,7 @@ class HTemplateControlInstruction: public HControlInstruction { |
| void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; } |
| int OperandCount() { return V; } |
| - HValue* OperandAt(int i) { return inputs_[i]; } |
| + HValue* OperandAt(int i) const { return inputs_[i]; } |
| protected: |
| @@ -1027,7 +1033,7 @@ class HDeoptimize: public HControlInstruction { |
| } |
| virtual int OperandCount() { return values_.length(); } |
| - virtual HValue* OperandAt(int index) { return values_[index]; } |
| + virtual HValue* OperandAt(int index) const { return values_[index]; } |
| virtual void PrintDataTo(StringStream* stream); |
| virtual int SuccessorCount() { return 0; } |
| @@ -1284,6 +1290,9 @@ class HChange: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1303,6 +1312,9 @@ class HClampToUint8: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1341,7 +1353,7 @@ class HSimulate: public HInstruction { |
| AddValue(kNoIndex, value); |
| } |
| virtual int OperandCount() { return values_.length(); } |
| - virtual HValue* OperandAt(int index) { return values_[index]; } |
| + virtual HValue* OperandAt(int index) const { return values_[index]; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| return Representation::None(); |
| @@ -1514,6 +1526,9 @@ class HThisFunction: public HTemplateInstruction<0> { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1532,6 +1547,9 @@ class HContext: public HTemplateInstruction<0> { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1550,6 +1568,9 @@ class HOuterContext: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1595,6 +1616,9 @@ class HGlobalObject: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1614,6 +1638,9 @@ class HGlobalReceiver: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1899,6 +1926,9 @@ class HJSArrayLength: public HTemplateInstruction<2> { |
| protected: |
| virtual bool DataEquals(HValue* other_raw) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1919,6 +1949,9 @@ class HFixedArrayBaseLength: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1939,6 +1972,9 @@ class HMapEnumLength: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1958,6 +1994,9 @@ class HElementsKind: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -1980,6 +2019,9 @@ class HBitNot: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -2062,6 +2104,8 @@ class HUnaryMathOperation: public HTemplateInstruction<2> { |
| } |
| private: |
| + virtual bool IsDeletable() const { return true; } |
| + |
| BuiltinFunctionId op_; |
| }; |
| @@ -2086,6 +2130,9 @@ class HLoadElements: public HTemplateInstruction<2> { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -2109,6 +2156,9 @@ class HLoadExternalArrayPointer: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -2408,7 +2458,7 @@ class HPhi: public HValue { |
| } |
| virtual HType CalculateInferredType(); |
| virtual int OperandCount() { return inputs_.length(); } |
| - virtual HValue* OperandAt(int index) { return inputs_[index]; } |
| + virtual HValue* OperandAt(int index) const { return inputs_[index]; } |
| HValue* GetRedundantReplacement(); |
| void AddInput(HValue* value); |
| bool HasRealUses(); |
| @@ -2504,6 +2554,9 @@ class HArgumentsObject: public HTemplateInstruction<0> { |
| } |
| DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -2632,6 +2685,8 @@ class HConstant: public HTemplateInstruction<0> { |
| } |
| private: |
| + virtual bool IsDeletable() const { return true; } |
| + |
| // If this is a numerical constant, handle_ either points to to the |
| // HeapObject the constant originated from or is null. If the |
| // constant is non-numeric, handle_ always points to a valid |
| @@ -2754,6 +2809,9 @@ class HArgumentsElements: public HTemplateInstruction<0> { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| + |
| bool from_inlined_; |
| }; |
| @@ -2773,6 +2831,9 @@ class HArgumentsLength: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -2898,6 +2959,8 @@ class HBitwiseBinaryOperation: public HBinaryOperation { |
| DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) |
| private: |
| + virtual bool IsDeletable() const { return true; } |
| + |
| Representation observed_input_representation_[3]; |
| }; |
| @@ -2921,6 +2984,9 @@ class HMathFloorOfDiv: public HBinaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -2953,6 +3019,9 @@ class HArithmeticBinaryOperation: public HBinaryOperation { |
| } |
| return HValue::InferredRepresentation(); |
| } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -3238,6 +3307,9 @@ class HGetCachedArrayIndex: public HUnaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -3342,7 +3414,7 @@ class HPower: public HTemplateInstruction<2> { |
| } |
| HValue* left() { return OperandAt(0); } |
| - HValue* right() { return OperandAt(1); } |
| + HValue* right() const { return OperandAt(1); } |
| virtual Representation RequiredInputRepresentation(int index) { |
| return index == 0 |
| @@ -3354,6 +3426,11 @@ class HPower: public HTemplateInstruction<2> { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + virtual bool IsDeletable() const { |
| + return !right()->representation().IsTagged(); |
| + } |
| }; |
| @@ -3371,6 +3448,9 @@ class HRandom: public HTemplateInstruction<1> { |
| } |
| DECLARE_CONCRETE_INSTRUCTION(Random) |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -3761,7 +3841,7 @@ class HLoadGlobalCell: public HTemplateInstruction<0> { |
| } |
| Handle<JSGlobalPropertyCell> cell() const { return cell_; } |
| - bool RequiresHoleCheck(); |
| + bool RequiresHoleCheck() const; |
| virtual void PrintDataTo(StringStream* stream); |
| @@ -3783,6 +3863,8 @@ class HLoadGlobalCell: public HTemplateInstruction<0> { |
| } |
| private: |
| + virtual bool IsDeletable() const { return !RequiresHoleCheck(); } |
| + |
| Handle<JSGlobalPropertyCell> cell_; |
| PropertyDetails details_; |
| }; |
| @@ -3943,7 +4025,7 @@ class HLoadContextSlot: public HUnaryOperation { |
| return mode_ == kCheckDeoptimize; |
| } |
| - bool RequiresHoleCheck() { |
| + bool RequiresHoleCheck() const { |
| return mode_ != kNoCheck; |
| } |
| @@ -3962,6 +4044,8 @@ class HLoadContextSlot: public HUnaryOperation { |
| } |
| private: |
| + virtual bool IsDeletable() const { return !RequiresHoleCheck(); } |
| + |
| int slot_index_; |
| Mode mode_; |
| }; |
| @@ -4054,6 +4138,8 @@ class HLoadNamedField: public HUnaryOperation { |
| } |
| private: |
| + virtual bool IsDeletable() const { return true; } |
| + |
| bool is_in_object_; |
| int offset_; |
| }; |
| @@ -4200,7 +4286,7 @@ class HLoadKeyedFastElement |
| virtual void PrintDataTo(StringStream* stream); |
| - bool RequiresHoleCheck(); |
| + bool RequiresHoleCheck() const; |
| DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) |
| @@ -4214,6 +4300,8 @@ class HLoadKeyedFastElement |
| } |
| private: |
| + virtual bool IsDeletable() const { return !RequiresHoleCheck(); } |
| + |
| class ElementsKindField: public BitField<ElementsKind, 0, 4> {}; |
| class IndexOffsetField: public BitField<uint32_t, 4, 27> {}; |
| class IsDehoistedField: public BitField<bool, 31, 1> {}; |
| @@ -4260,7 +4348,7 @@ class HLoadKeyedFastDoubleElement |
| return Representation::None(); |
| } |
| - bool RequiresHoleCheck() { |
| + bool RequiresHoleCheck() const { |
| return hole_check_mode_ == PERFORM_HOLE_CHECK; |
| } |
| @@ -4277,6 +4365,8 @@ class HLoadKeyedFastDoubleElement |
| } |
| private: |
| + virtual bool IsDeletable() const { return !RequiresHoleCheck(); } |
| + |
| uint32_t index_offset_; |
| bool is_dehoisted_; |
| HoleCheckMode hole_check_mode_; |
| @@ -4341,6 +4431,10 @@ class HLoadKeyedSpecializedArrayElement |
| } |
| private: |
| + virtual bool IsDeletable() const { |
| + return elements_kind_ != EXTERNAL_UNSIGNED_INT_ELEMENTS; |
|
Jakob Kummerow
2012/10/10 15:24:18
As discussed offline, this instruction is always d
Sven Panne
2012/10/11 06:48:32
Done.
|
| + } |
| + |
| ElementsKind elements_kind_; |
| uint32_t index_offset_; |
| bool is_dehoisted_; |
| @@ -4722,6 +4816,10 @@ class HStringAdd: public HBinaryOperation { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + // TODO(svenpanne) Might be safe, but leave it out until we know for sure. |
| + // private: |
| + // virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -4756,6 +4854,10 @@ class HStringCharCodeAt: public HTemplateInstruction<3> { |
| virtual Range* InferRange(Zone* zone) { |
| return new(zone) Range(0, String::kMaxUtf16CodeUnit); |
| } |
| + |
| + // TODO(svenpanne) Might be safe, but leave it out until we know for sure. |
| + // private: |
| + // virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -4782,6 +4884,10 @@ class HStringCharFromCode: public HTemplateInstruction<2> { |
| virtual bool DataEquals(HValue* other) { return true; } |
| DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) |
| + |
| + // TODO(svenpanne) Might be safe, but leave it out until we know for sure. |
| + // private: |
| + // virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -4810,6 +4916,9 @@ class HStringLength: public HUnaryOperation { |
| virtual Range* InferRange(Zone* zone) { |
| return new(zone) Range(0, String::kMaxLength); |
| } |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -4836,6 +4945,9 @@ class HAllocateObject: public HTemplateInstruction<1> { |
| DECLARE_CONCRETE_INSTRUCTION(AllocateObject) |
| private: |
| + // TODO(svenpanne) Might be safe, but leave it out until we know for sure. |
| + // virtual bool IsDeletable() const { return true; } |
| + |
| Handle<JSFunction> constructor_; |
| }; |
| @@ -4852,6 +4964,8 @@ class HMaterializedLiteral: public HTemplateInstruction<V> { |
| int depth() const { return depth_; } |
| private: |
| + virtual bool IsDeletable() const { return true; } |
| + |
| int literal_index_; |
| int depth_; |
| }; |
| @@ -5027,6 +5141,8 @@ class HFunctionLiteral: public HTemplateInstruction<1> { |
| bool pretenure() const { return pretenure_; } |
| private: |
| + virtual bool IsDeletable() const { return true; } |
| + |
| Handle<SharedFunctionInfo> shared_info_; |
| bool pretenure_; |
| }; |
| @@ -5051,6 +5167,9 @@ class HTypeof: public HTemplateInstruction<2> { |
| } |
| DECLARE_CONCRETE_INSTRUCTION(Typeof) |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -5069,6 +5188,9 @@ class HToFastProperties: public HUnaryOperation { |
| } |
| DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -5083,6 +5205,9 @@ class HValueOf: public HUnaryOperation { |
| } |
| DECLARE_CONCRETE_INSTRUCTION(ValueOf) |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |
| @@ -5279,6 +5404,9 @@ class HLoadFieldByIndex : public HTemplateInstruction<2> { |
| } |
| DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); |
| + |
| + private: |
| + virtual bool IsDeletable() const { return true; } |
| }; |