summaryrefslogtreecommitdiff
path: root/compiler/optimizing/nodes.h
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r--compiler/optimizing/nodes.h93
1 files changed, 38 insertions, 55 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 2ed2d9ab20..ee82fda6c8 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -17,6 +17,7 @@
#ifndef ART_COMPILER_OPTIMIZING_NODES_H_
#define ART_COMPILER_OPTIMIZING_NODES_H_
+#include <array>
#include <type_traits>
#include "base/arena_containers.h"
@@ -81,7 +82,7 @@ enum IfCondition {
kCondGE,
};
-class HInstructionList {
+class HInstructionList : public ValueObject {
public:
HInstructionList() : first_instruction_(nullptr), last_instruction_(nullptr) {}
@@ -127,7 +128,7 @@ class HInstructionList {
};
// Control-flow graph of a method. Contains a list of basic blocks.
-class HGraph : public ArenaObject<kArenaAllocMisc> {
+class HGraph : public ArenaObject<kArenaAllocGraph> {
public:
HGraph(ArenaAllocator* arena,
const DexFile& dex_file,
@@ -464,7 +465,7 @@ class HGraph : public ArenaObject<kArenaAllocMisc> {
DISALLOW_COPY_AND_ASSIGN(HGraph);
};
-class HLoopInformation : public ArenaObject<kArenaAllocMisc> {
+class HLoopInformation : public ArenaObject<kArenaAllocLoopInfo> {
public:
HLoopInformation(HBasicBlock* header, HGraph* graph)
: header_(header),
@@ -562,7 +563,7 @@ class HLoopInformation : public ArenaObject<kArenaAllocMisc> {
// Stores try/catch information for basic blocks.
// Note that HGraph is constructed so that catch blocks cannot simultaneously
// be try blocks.
-class TryCatchInformation : public ArenaObject<kArenaAllocMisc> {
+class TryCatchInformation : public ArenaObject<kArenaAllocTryCatchInfo> {
public:
// Try block information constructor.
explicit TryCatchInformation(const HTryBoundary& try_entry)
@@ -619,7 +620,7 @@ static constexpr uint32_t kNoDexPc = -1;
// as a double linked list. Each block knows its predecessors and
// successors.
-class HBasicBlock : public ArenaObject<kArenaAllocMisc> {
+class HBasicBlock : public ArenaObject<kArenaAllocBasicBlock> {
public:
explicit HBasicBlock(HGraph* graph, uint32_t dex_pc = kNoDexPc)
: graph_(graph),
@@ -1107,7 +1108,7 @@ FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
template <typename T> class HUseList;
template <typename T>
-class HUseListNode : public ArenaObject<kArenaAllocMisc> {
+class HUseListNode : public ArenaObject<kArenaAllocUseListNode> {
public:
HUseListNode* GetPrevious() const { return prev_; }
HUseListNode* GetNext() const { return next_; }
@@ -1492,7 +1493,7 @@ class SideEffects : public ValueObject {
};
// A HEnvironment object contains the values of virtual registers at a given location.
-class HEnvironment : public ArenaObject<kArenaAllocMisc> {
+class HEnvironment : public ArenaObject<kArenaAllocEnvironment> {
public:
HEnvironment(ArenaAllocator* arena,
size_t number_of_vregs,
@@ -1682,7 +1683,7 @@ class ReferenceTypeInfo : ValueObject {
std::ostream& operator<<(std::ostream& os, const ReferenceTypeInfo& rhs);
-class HInstruction : public ArenaObject<kArenaAllocMisc> {
+class HInstruction : public ArenaObject<kArenaAllocInstruction> {
public:
explicit HInstruction(SideEffects side_effects)
: previous_(nullptr),
@@ -2038,72 +2039,54 @@ class HBackwardInstructionIterator : public ValueObject {
DISALLOW_COPY_AND_ASSIGN(HBackwardInstructionIterator);
};
-// An embedded container with N elements of type T. Used (with partial
-// specialization for N=0) because embedded arrays cannot have size 0.
-template<typename T, intptr_t N>
-class EmbeddedArray {
+template<size_t N>
+class HTemplateInstruction: public HInstruction {
public:
- EmbeddedArray() : elements_() {}
-
- intptr_t GetLength() const { return N; }
-
- const T& operator[](intptr_t i) const {
- DCHECK_LT(i, GetLength());
- return elements_[i];
- }
+ HTemplateInstruction<N>(SideEffects side_effects)
+ : HInstruction(side_effects), inputs_() {}
+ virtual ~HTemplateInstruction() {}
- T& operator[](intptr_t i) {
- DCHECK_LT(i, GetLength());
- return elements_[i];
- }
+ size_t InputCount() const OVERRIDE { return N; }
- const T& At(intptr_t i) const {
- return (*this)[i];
+ protected:
+ const HUserRecord<HInstruction*> InputRecordAt(size_t i) const OVERRIDE {
+ DCHECK_LT(i, N);
+ return inputs_[i];
}
- void SetAt(intptr_t i, const T& val) {
- (*this)[i] = val;
+ void SetRawInputRecordAt(size_t i, const HUserRecord<HInstruction*>& input) OVERRIDE {
+ DCHECK_LT(i, N);
+ inputs_[i] = input;
}
private:
- T elements_[N];
-};
+ std::array<HUserRecord<HInstruction*>, N> inputs_;
-template<typename T>
-class EmbeddedArray<T, 0> {
- public:
- intptr_t length() const { return 0; }
- const T& operator[](intptr_t i) const {
- UNUSED(i);
- LOG(FATAL) << "Unreachable";
- UNREACHABLE();
- }
- T& operator[](intptr_t i) {
- UNUSED(i);
- LOG(FATAL) << "Unreachable";
- UNREACHABLE();
- }
+ friend class SsaBuilder;
};
-template<intptr_t N>
-class HTemplateInstruction: public HInstruction {
+// HTemplateInstruction specialization for N=0.
+template<>
+class HTemplateInstruction<0>: public HInstruction {
public:
- HTemplateInstruction<N>(SideEffects side_effects)
- : HInstruction(side_effects), inputs_() {}
+ explicit HTemplateInstruction(SideEffects side_effects) : HInstruction(side_effects) {}
virtual ~HTemplateInstruction() {}
- size_t InputCount() const OVERRIDE { return N; }
+ size_t InputCount() const OVERRIDE { return 0; }
protected:
- const HUserRecord<HInstruction*> InputRecordAt(size_t i) const OVERRIDE { return inputs_[i]; }
+ const HUserRecord<HInstruction*> InputRecordAt(size_t i ATTRIBUTE_UNUSED) const OVERRIDE {
+ LOG(FATAL) << "Unreachable";
+ UNREACHABLE();
+ }
- void SetRawInputRecordAt(size_t i, const HUserRecord<HInstruction*>& input) OVERRIDE {
- inputs_[i] = input;
+ void SetRawInputRecordAt(size_t i ATTRIBUTE_UNUSED,
+ const HUserRecord<HInstruction*>& input ATTRIBUTE_UNUSED) OVERRIDE {
+ LOG(FATAL) << "Unreachable";
+ UNREACHABLE();
}
private:
- EmbeddedArray<HUserRecord<HInstruction*>, N> inputs_;
-
friend class SsaBuilder;
};
@@ -4833,7 +4816,7 @@ class HFakeString : public HTemplateInstruction<0> {
DISALLOW_COPY_AND_ASSIGN(HFakeString);
};
-class MoveOperands : public ArenaObject<kArenaAllocMisc> {
+class MoveOperands : public ArenaObject<kArenaAllocMoveOperands> {
public:
MoveOperands(Location source,
Location destination,