diff options
author | 2015-09-15 15:33:14 +0100 | |
---|---|---|
committer | 2015-09-16 16:41:01 +0100 | |
commit | 71bf8090663d02869cafafdd530976f7f2a9db7f (patch) | |
tree | 70f910498031be392dd1f851cf38fe68bdc3154c /compiler/optimizing/ssa_builder.h | |
parent | 4919c34ead9a10d6cbdaba9967952c344b32e5b9 (diff) |
Optimizing: Tag arena allocations in SsaBuilder.
Replace GrowableArray with ArenaVector in SsaBuilder and
tag allocations with a new arena allocation type.
Change-Id: I27312c51d7be9d2ad02a974cce93b365c65c5fc4
Diffstat (limited to 'compiler/optimizing/ssa_builder.h')
-rw-r--r-- | compiler/optimizing/ssa_builder.h | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/compiler/optimizing/ssa_builder.h b/compiler/optimizing/ssa_builder.h index dc76177d9a..804296f7ba 100644 --- a/compiler/optimizing/ssa_builder.h +++ b/compiler/optimizing/ssa_builder.h @@ -17,6 +17,7 @@ #ifndef ART_COMPILER_OPTIMIZING_SSA_BUILDER_H_ #define ART_COMPILER_OPTIMIZING_SSA_BUILDER_H_ +#include "base/arena_containers.h" #include "nodes.h" #include "optimization.h" @@ -51,33 +52,33 @@ class SsaBuilder : public HGraphVisitor { explicit SsaBuilder(HGraph* graph) : HGraphVisitor(graph), current_locals_(nullptr), - loop_headers_(graph->GetArena(), kDefaultNumberOfLoops), - locals_for_(graph->GetArena(), graph->GetBlocks().size()) { - locals_for_.SetSize(graph->GetBlocks().size()); + loop_headers_(graph->GetArena()->Adapter(kArenaAllocSsaBuilder)), + locals_for_(graph->GetBlocks().size(), + ArenaVector<HInstruction*>(graph->GetArena()->Adapter(kArenaAllocSsaBuilder)), + graph->GetArena()->Adapter(kArenaAllocSsaBuilder)) { + loop_headers_.reserve(kDefaultNumberOfLoops); } void BuildSsa(); - GrowableArray<HInstruction*>* GetLocalsFor(HBasicBlock* block) { - GrowableArray<HInstruction*>* locals = locals_for_.Get(block->GetBlockId()); - if (locals == nullptr) { + ArenaVector<HInstruction*>* GetLocalsFor(HBasicBlock* block) { + DCHECK_LT(block->GetBlockId(), locals_for_.size()); + ArenaVector<HInstruction*>* locals = &locals_for_[block->GetBlockId()]; + if (locals->empty() && GetGraph()->GetNumberOfVRegs() != 0u) { const size_t vregs = GetGraph()->GetNumberOfVRegs(); - ArenaAllocator* arena = GetGraph()->GetArena(); - locals = new (arena) GrowableArray<HInstruction*>(arena, vregs); - locals->SetSize(vregs); + locals->resize(vregs, nullptr); if (block->IsCatchBlock()) { // We record incoming inputs of catch phis at throwing instructions and // must therefore eagerly create the phis. Unused phis will be removed // in the dead phi analysis. + ArenaAllocator* arena = GetGraph()->GetArena(); for (size_t i = 0; i < vregs; ++i) { HPhi* phi = new (arena) HPhi(arena, i, 0, Primitive::kPrimVoid); block->AddPhi(phi); - locals->Put(i, phi); + (*locals)[i] = phi; } } - - locals_for_.Put(block->GetBlockId(), locals); } return locals; } @@ -107,14 +108,14 @@ class SsaBuilder : public HGraphVisitor { static HPhi* GetFloatDoubleOrReferenceEquivalentOfPhi(HPhi* phi, Primitive::Type type); // Locals for the current block being visited. - GrowableArray<HInstruction*>* current_locals_; + ArenaVector<HInstruction*>* current_locals_; // Keep track of loop headers found. The last phase of the analysis iterates // over these blocks to set the inputs of their phis. - GrowableArray<HBasicBlock*> loop_headers_; + ArenaVector<HBasicBlock*> loop_headers_; // HEnvironment for each block. - GrowableArray<GrowableArray<HInstruction*>*> locals_for_; + ArenaVector<ArenaVector<HInstruction*>> locals_for_; DISALLOW_COPY_AND_ASSIGN(SsaBuilder); }; |