Optimizing: Tag arena allocations in SsaBuilder.

Replace GrowableArray with ArenaVector in SsaBuilder and
tag allocations with a new arena allocation type.

Change-Id: I27312c51d7be9d2ad02a974cce93b365c65c5fc4
diff --git a/compiler/optimizing/ssa_builder.h b/compiler/optimizing/ssa_builder.h
index dc76177..804296f 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 @@
   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 @@
   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);
 };