diff options
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r-- | compiler/optimizing/nodes.h | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index f8149d16e3..5d232857ae 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -50,6 +50,7 @@ class LiveInterval; class LocationSummary; class SlowPathCode; class SsaBuilder; +class HExtendedLoopInformation; static const int kDefaultNumberOfBlocks = 8; static const int kDefaultNumberOfSuccessors = 2; @@ -390,7 +391,8 @@ class HLoopInformation : public ArenaObject<kArenaAllocMisc> { suspend_check_(nullptr), back_edges_(graph->GetArena(), kDefaultNumberOfBackEdges), // Make bit vector growable, as the number of blocks may change. - blocks_(graph->GetArena(), graph->GetBlocks().Size(), true) {} + blocks_(graph->GetArena(), graph->GetBlocks().Size(), true), + extended_loop_info_(nullptr) {} HBasicBlock* GetHeader() const { return header_; @@ -466,6 +468,14 @@ class HLoopInformation : public ArenaObject<kArenaAllocMisc> { void Add(HBasicBlock* block); void Remove(HBasicBlock* block); + void SetExtendedLoopInformation(HExtendedLoopInformation *extended_loop_info) { + extended_loop_info_ = extended_loop_info; + } + + HExtendedLoopInformation* GetExtendedLoopInformation() { + return extended_loop_info_; + } + private: // Internal recursive implementation of `Populate`. void PopulateRecursive(HBasicBlock* block); @@ -475,6 +485,8 @@ class HLoopInformation : public ArenaObject<kArenaAllocMisc> { GrowableArray<HBasicBlock*> back_edges_; ArenaBitVector blocks_; + HExtendedLoopInformation* extended_loop_info_; + DISALLOW_COPY_AND_ASSIGN(HLoopInformation); }; @@ -3128,17 +3140,25 @@ class HNullCheck : public HExpression<1> { class FieldInfo : public ValueObject { public: - FieldInfo(MemberOffset field_offset, Primitive::Type field_type, bool is_volatile) - : field_offset_(field_offset), field_type_(field_type), is_volatile_(is_volatile) {} + FieldInfo(MemberOffset field_offset, + Primitive::Type field_type, + bool is_volatile, + uint32_t index) + : field_offset_(field_offset), + field_type_(field_type), + is_volatile_(is_volatile), + index_(index) {} MemberOffset GetFieldOffset() const { return field_offset_; } Primitive::Type GetFieldType() const { return field_type_; } + uint32_t GetFieldIndex() const { return index_; } bool IsVolatile() const { return is_volatile_; } private: const MemberOffset field_offset_; const Primitive::Type field_type_; const bool is_volatile_; + uint32_t index_; }; class HInstanceFieldGet : public HExpression<1> { @@ -3146,13 +3166,15 @@ class HInstanceFieldGet : public HExpression<1> { HInstanceFieldGet(HInstruction* value, Primitive::Type field_type, MemberOffset field_offset, - bool is_volatile) + bool is_volatile, + uint32_t field_idx) : HExpression(field_type, SideEffects::DependsOnSomething()), - field_info_(field_offset, field_type, is_volatile) { + field_info_(field_offset, field_type, is_volatile, field_idx) { SetRawInputAt(0, value); } bool CanBeMoved() const OVERRIDE { return !IsVolatile(); } + // TODO: add CanBeNull for accessing a first page field from cannot-be-null object bool InstructionDataEquals(HInstruction* other) const OVERRIDE { HInstanceFieldGet* other_get = other->AsInstanceFieldGet(); @@ -3168,9 +3190,11 @@ class HInstanceFieldGet : public HExpression<1> { } const FieldInfo& GetFieldInfo() const { return field_info_; } + uint32_t GetFieldIndex() const { return field_info_.GetFieldIndex(); } MemberOffset GetFieldOffset() const { return field_info_.GetFieldOffset(); } Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); } bool IsVolatile() const { return field_info_.IsVolatile(); } + bool IsPrimitiveField() const { return (GetFieldType() != Primitive::kPrimNot); } DECLARE_INSTRUCTION(InstanceFieldGet); @@ -3186,22 +3210,26 @@ class HInstanceFieldSet : public HTemplateInstruction<2> { HInstruction* value, Primitive::Type field_type, MemberOffset field_offset, - bool is_volatile) + bool is_volatile, + uint32_t field_idx) : HTemplateInstruction(SideEffects::ChangesSomething()), - field_info_(field_offset, field_type, is_volatile) { + field_info_(field_offset, field_type, is_volatile, field_idx) { SetRawInputAt(0, object); SetRawInputAt(1, value); } + // TODO: add CanBeNull for accessing a first page field from cannot-be-null object bool CanDoImplicitNullCheckOn(HInstruction* obj) const OVERRIDE { return (obj == InputAt(0)) && GetFieldOffset().Uint32Value() < kPageSize; } const FieldInfo& GetFieldInfo() const { return field_info_; } + uint32_t GetFieldIndex() const { return field_info_.GetFieldIndex(); } MemberOffset GetFieldOffset() const { return field_info_.GetFieldOffset(); } Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); } bool IsVolatile() const { return field_info_.IsVolatile(); } HInstruction* GetValue() const { return InputAt(1); } + bool IsPrimitiveField() const { return (GetFieldType() != Primitive::kPrimNot); } DECLARE_INSTRUCTION(InstanceFieldSet); @@ -3564,9 +3592,10 @@ class HStaticFieldGet : public HExpression<1> { HStaticFieldGet(HInstruction* cls, Primitive::Type field_type, MemberOffset field_offset, - bool is_volatile) + bool is_volatile, + uint32_t field_idx) : HExpression(field_type, SideEffects::DependsOnSomething()), - field_info_(field_offset, field_type, is_volatile) { + field_info_(field_offset, field_type, is_volatile, field_idx) { SetRawInputAt(0, cls); } @@ -3583,9 +3612,11 @@ class HStaticFieldGet : public HExpression<1> { } const FieldInfo& GetFieldInfo() const { return field_info_; } + uint32_t GetFieldIndex() const { return field_info_.GetFieldIndex(); } MemberOffset GetFieldOffset() const { return field_info_.GetFieldOffset(); } Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); } bool IsVolatile() const { return field_info_.IsVolatile(); } + bool IsPrimitiveField() const { return (GetFieldType() != Primitive::kPrimNot); } DECLARE_INSTRUCTION(StaticFieldGet); @@ -3601,17 +3632,20 @@ class HStaticFieldSet : public HTemplateInstruction<2> { HInstruction* value, Primitive::Type field_type, MemberOffset field_offset, - bool is_volatile) + bool is_volatile, + uint32_t field_idx) : HTemplateInstruction(SideEffects::ChangesSomething()), - field_info_(field_offset, field_type, is_volatile) { + field_info_(field_offset, field_type, is_volatile, field_idx) { SetRawInputAt(0, cls); SetRawInputAt(1, value); } const FieldInfo& GetFieldInfo() const { return field_info_; } + uint32_t GetFieldIndex() const { return field_info_.GetFieldIndex(); } MemberOffset GetFieldOffset() const { return field_info_.GetFieldOffset(); } Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); } bool IsVolatile() const { return field_info_.IsVolatile(); } + bool IsPrimitiveField() const { return (GetFieldType() != Primitive::kPrimNot); } HInstruction* GetValue() const { return InputAt(1); } |