From 71bf8090663d02869cafafdd530976f7f2a9db7f Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Tue, 15 Sep 2015 15:33:14 +0100 Subject: Optimizing: Tag arena allocations in SsaBuilder. Replace GrowableArray with ArenaVector in SsaBuilder and tag allocations with a new arena allocation type. Change-Id: I27312c51d7be9d2ad02a974cce93b365c65c5fc4 --- compiler/optimizing/ssa_builder.h | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'compiler/optimizing/ssa_builder.h') 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(graph->GetArena()->Adapter(kArenaAllocSsaBuilder)), + graph->GetArena()->Adapter(kArenaAllocSsaBuilder)) { + loop_headers_.reserve(kDefaultNumberOfLoops); } void BuildSsa(); - GrowableArray* GetLocalsFor(HBasicBlock* block) { - GrowableArray* locals = locals_for_.Get(block->GetBlockId()); - if (locals == nullptr) { + ArenaVector* GetLocalsFor(HBasicBlock* block) { + DCHECK_LT(block->GetBlockId(), locals_for_.size()); + ArenaVector* 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(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* current_locals_; + ArenaVector* 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 loop_headers_; + ArenaVector loop_headers_; // HEnvironment for each block. - GrowableArray*> locals_for_; + ArenaVector> locals_for_; DISALLOW_COPY_AND_ASSIGN(SsaBuilder); }; -- cgit v1.2.3-59-g8ed1b