diff options
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r-- | compiler/optimizing/nodes.h | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index d98d2ad75f..af173c8087 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -38,6 +38,7 @@ class LocationSummary; static const int kDefaultNumberOfBlocks = 8; static const int kDefaultNumberOfSuccessors = 2; static const int kDefaultNumberOfPredecessors = 2; +static const int kDefaultNumberOfDominatedBlocks = 1; static const int kDefaultNumberOfBackEdges = 1; enum IfCondition { @@ -272,6 +273,7 @@ class HBasicBlock : public ArenaObject { successors_(graph->GetArena(), kDefaultNumberOfSuccessors), loop_information_(nullptr), dominator_(nullptr), + dominated_blocks_(graph->GetArena(), kDefaultNumberOfDominatedBlocks), block_id_(-1), lifetime_start_(kNoLifetime), lifetime_end_(kNoLifetime) {} @@ -284,6 +286,10 @@ class HBasicBlock : public ArenaObject { return successors_; } + const GrowableArray<HBasicBlock*>& GetDominatedBlocks() const { + return dominated_blocks_; + } + void AddBackEdge(HBasicBlock* back_edge) { if (loop_information_ == nullptr) { loop_information_ = new (graph_->GetArena()) HLoopInformation(this, graph_); @@ -299,6 +305,7 @@ class HBasicBlock : public ArenaObject { HBasicBlock* GetDominator() const { return dominator_; } void SetDominator(HBasicBlock* dominator) { dominator_ = dominator; } + void AddDominatedBlock(HBasicBlock* block) { dominated_blocks_.Add(block); } int NumberOfBackEdges() const { return loop_information_ == nullptr @@ -418,6 +425,7 @@ class HBasicBlock : public ArenaObject { HInstructionList phis_; HLoopInformation* loop_information_; HBasicBlock* dominator_; + GrowableArray<HBasicBlock*> dominated_blocks_; int block_id_; size_t lifetime_start_; size_t lifetime_end_; @@ -473,6 +481,7 @@ FOR_EACH_INSTRUCTION(FORWARD_DECLARATION) #undef FORWARD_DECLARATION #define DECLARE_INSTRUCTION(type) \ + virtual InstructionKind GetKind() const { return k##type; } \ virtual const char* DebugName() const { return #type; } \ virtual const H##type* As##type() const OVERRIDE { return this; } \ virtual H##type* As##type() OVERRIDE { return this; } \ @@ -504,6 +513,8 @@ class HUseListNode : public ArenaObject { // Represents the side effects an instruction may have. class SideEffects : public ValueObject { public: + SideEffects() : flags_(0) {} + static SideEffects None() { return SideEffects(0); } @@ -521,11 +532,31 @@ class SideEffects : public ValueObject { return SideEffects(((1 << count) - 1) << kFlagChangesCount); } + SideEffects Union(SideEffects other) const { + return SideEffects(flags_ | other.flags_); + } + bool HasSideEffects() const { size_t all_bits_set = (1 << kFlagChangesCount) - 1; return (flags_ & all_bits_set) != 0; } + bool HasAllSideEffects() const { + size_t all_bits_set = (1 << kFlagChangesCount) - 1; + return all_bits_set == (flags_ & all_bits_set); + } + + bool DependsOn(SideEffects other) const { + size_t depends_flags = other.ComputeDependsFlags(); + return (flags_ & depends_flags) != 0; + } + + bool HasDependencies() const { + int count = kFlagDependsOnCount - kFlagChangesCount; + size_t all_bits_set = (1 << count) - 1; + return ((flags_ >> kFlagChangesCount) & all_bits_set) != 0; + } + private: static constexpr int kFlagChangesSomething = 0; static constexpr int kFlagChangesCount = kFlagChangesSomething + 1; @@ -533,10 +564,13 @@ class SideEffects : public ValueObject { static constexpr int kFlagDependsOnSomething = kFlagChangesCount; static constexpr int kFlagDependsOnCount = kFlagDependsOnSomething + 1; - private: explicit SideEffects(size_t flags) : flags_(flags) {} - const size_t flags_; + size_t ComputeDependsFlags() const { + return flags_ << kFlagChangesCount; + } + + size_t flags_; }; class HInstruction : public ArenaObject { @@ -557,6 +591,12 @@ class HInstruction : public ArenaObject { virtual ~HInstruction() {} +#define DECLARE_KIND(type) k##type, + enum InstructionKind { + FOR_EACH_INSTRUCTION(DECLARE_KIND) + }; +#undef DECLARE_KIND + HInstruction* GetNext() const { return next_; } HInstruction* GetPrevious() const { return previous_; } @@ -659,6 +699,18 @@ class HInstruction : public ArenaObject { // 2) Their inputs are identical. bool Equals(HInstruction* other) const; + virtual InstructionKind GetKind() const = 0; + + virtual size_t ComputeHashCode() const { + size_t result = GetKind(); + for (size_t i = 0, e = InputCount(); i < e; ++i) { + result = (result * 31) + InputAt(i)->GetId(); + } + return result; + } + + SideEffects GetSideEffects() const { return side_effects_; } + size_t GetLifetimePosition() const { return lifetime_position_; } void SetLifetimePosition(size_t position) { lifetime_position_ = position; } LiveInterval* GetLiveInterval() const { return live_interval_; } @@ -1258,6 +1310,8 @@ class HIntConstant : public HConstant { return other->AsIntConstant()->value_ == value_; } + virtual size_t ComputeHashCode() const { return GetValue(); } + DECLARE_INSTRUCTION(IntConstant); private: @@ -1276,6 +1330,8 @@ class HLongConstant : public HConstant { return other->AsLongConstant()->value_ == value_; } + virtual size_t ComputeHashCode() const { return static_cast<size_t>(GetValue()); } + DECLARE_INSTRUCTION(LongConstant); private: @@ -1545,6 +1601,10 @@ class HInstanceFieldGet : public HExpression<1> { return other_offset == GetFieldOffset().SizeValue(); } + virtual size_t ComputeHashCode() const { + return (HInstruction::ComputeHashCode() << 7) | GetFieldOffset().SizeValue(); + } + MemberOffset GetFieldOffset() const { return field_info_.GetFieldOffset(); } Primitive::Type GetFieldType() const { return field_info_.GetFieldType(); } |