From 5233f93ee336b3581ccdb993ff6342c52fec34b0 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Tue, 29 Sep 2015 19:01:15 +0100 Subject: [PATCH] Optimizing: Tag even more arena allocations. Tag previously "Misc" arena allocations with more specific allocation types. Move some native heap allocations to the arena in BCE. Bug: 23736311 Change-Id: If8ef15a8b614dc3314bdfb35caa23862c9d4d25c --- compiler/optimizing/bounds_check_elimination.cc | 26 +++++++++++++------------ compiler/optimizing/builder.cc | 2 +- compiler/optimizing/code_generator.h | 9 ++++++--- compiler/optimizing/code_generator_arm.cc | 8 +++++--- compiler/optimizing/code_generator_arm64.cc | 13 ++++++++----- compiler/optimizing/code_generator_x86.cc | 6 +++--- compiler/optimizing/code_generator_x86_64.cc | 8 ++++---- compiler/optimizing/gvn.cc | 4 ++-- compiler/optimizing/induction_var_analysis.cc | 18 ++++++++++------- compiler/optimizing/induction_var_analysis.h | 2 +- compiler/optimizing/locations.h | 2 +- compiler/optimizing/register_allocator.cc | 6 ++++-- compiler/optimizing/ssa_liveness_analysis.h | 8 ++++---- runtime/base/arena_allocator.cc | 2 ++ runtime/base/arena_allocator.h | 2 ++ 15 files changed, 68 insertions(+), 48 deletions(-) diff --git a/compiler/optimizing/bounds_check_elimination.cc b/compiler/optimizing/bounds_check_elimination.cc index 42b354191..960f4d9b7 100644 --- a/compiler/optimizing/bounds_check_elimination.cc +++ b/compiler/optimizing/bounds_check_elimination.cc @@ -410,7 +410,7 @@ class ArrayAccessInsideLoopFinder : public ValueObject { * of an existing value range, NewArray or a loop phi corresponding to an * incrementing/decrementing array index (MonotonicValueRange). */ -class ValueRange : public ArenaObject { +class ValueRange : public ArenaObject { public: ValueRange(ArenaAllocator* allocator, ValueBound lower, ValueBound upper) : allocator_(allocator), lower_(lower), upper_(upper) {} @@ -1112,7 +1112,14 @@ class BCEVisitor : public HGraphVisitor { BCEVisitor(HGraph* graph, HInductionVarAnalysis* induction_analysis) : HGraphVisitor(graph), - maps_(graph->GetBlocks().size()), + maps_(graph->GetBlocks().size(), + ArenaSafeMap( + std::less(), + graph->GetArena()->Adapter(kArenaAllocBoundsCheckElimination)), + graph->GetArena()->Adapter(kArenaAllocBoundsCheckElimination)), + first_constant_index_bounds_check_map_( + std::less(), + graph->GetArena()->Adapter(kArenaAllocBoundsCheckElimination)), need_to_revisit_block_(false), initial_block_size_(graph->GetBlocks().size()), induction_range_(induction_analysis) {} @@ -1137,14 +1144,9 @@ class BCEVisitor : public HGraphVisitor { // Added blocks don't keep value ranges. return nullptr; } - int block_id = basic_block->GetBlockId(); - if (maps_.at(block_id) == nullptr) { - std::unique_ptr> map( - new ArenaSafeMap( - std::less(), GetGraph()->GetArena()->Adapter())); - maps_.at(block_id) = std::move(map); - } - return maps_.at(block_id).get(); + uint32_t block_id = basic_block->GetBlockId(); + DCHECK_LT(block_id, maps_.size()); + return &maps_[block_id]; } // Traverse up the dominator tree to look for value range info. @@ -1842,11 +1844,11 @@ class BCEVisitor : public HGraphVisitor { } } - std::vector>> maps_; + ArenaVector> maps_; // Map an HArrayLength instruction's id to the first HBoundsCheck instruction in // a block that checks a constant index against that HArrayLength. - SafeMap first_constant_index_bounds_check_map_; + ArenaSafeMap first_constant_index_bounds_check_map_; // For the block, there is at least one HArrayLength instruction for which there // is more than one bounds check instruction with constant indexing. And it's diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 7ae405ab3..cb36f6223 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -324,7 +324,7 @@ void HGraphBuilder::InsertTryBoundaryBlocks(const DexFile::CodeItem& code_item) // Keep a map of all try blocks and their respective TryItems. We do not use // the block's pointer but rather its id to ensure deterministic iteration. ArenaSafeMap try_block_info( - std::less(), arena_->Adapter()); + std::less(), arena_->Adapter(kArenaAllocGraphBuilder)); // Obtain TryItem information for blocks with throwing instructions, and split // blocks which are both try & catch to simplify the graph. diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index b58a3ff7f..5da0e5918 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -425,9 +425,12 @@ class CodeGenerator { core_spill_mask_(0), fpu_spill_mask_(0), first_register_slot_in_slow_path_(0), - blocked_core_registers_(graph->GetArena()->AllocArray(number_of_core_registers)), - blocked_fpu_registers_(graph->GetArena()->AllocArray(number_of_fpu_registers)), - blocked_register_pairs_(graph->GetArena()->AllocArray(number_of_register_pairs)), + blocked_core_registers_(graph->GetArena()->AllocArray(number_of_core_registers, + kArenaAllocCodeGenerator)), + blocked_fpu_registers_(graph->GetArena()->AllocArray(number_of_fpu_registers, + kArenaAllocCodeGenerator)), + blocked_register_pairs_(graph->GetArena()->AllocArray(number_of_register_pairs, + kArenaAllocCodeGenerator)), number_of_core_registers_(number_of_core_registers), number_of_fpu_registers_(number_of_fpu_registers), number_of_register_pairs_(number_of_register_pairs), diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index da7a6755e..f29e2ba8a 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -438,9 +438,11 @@ CodeGeneratorARM::CodeGeneratorARM(HGraph* graph, move_resolver_(graph->GetArena(), this), assembler_(), isa_features_(isa_features), - method_patches_(MethodReferenceComparator(), graph->GetArena()->Adapter()), - call_patches_(MethodReferenceComparator(), graph->GetArena()->Adapter()), - relative_call_patches_(graph->GetArena()->Adapter()) { + method_patches_(MethodReferenceComparator(), + graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + call_patches_(MethodReferenceComparator(), + graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + relative_call_patches_(graph->GetArena()->Adapter(kArenaAllocCodeGenerator)) { // Always save the LR register to mimic Quick. AddAllocatedRegister(Location::RegisterLocation(LR)); } diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 31900d536..c97e367b1 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -542,11 +542,14 @@ CodeGeneratorARM64::CodeGeneratorARM64(HGraph* graph, instruction_visitor_(graph, this), move_resolver_(graph->GetArena(), this), isa_features_(isa_features), - uint64_literals_(std::less(), graph->GetArena()->Adapter()), - method_patches_(MethodReferenceComparator(), graph->GetArena()->Adapter()), - call_patches_(MethodReferenceComparator(), graph->GetArena()->Adapter()), - relative_call_patches_(graph->GetArena()->Adapter()), - pc_rel_dex_cache_patches_(graph->GetArena()->Adapter()) { + uint64_literals_(std::less(), + graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + method_patches_(MethodReferenceComparator(), + graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + call_patches_(MethodReferenceComparator(), + graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + relative_call_patches_(graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + pc_rel_dex_cache_patches_(graph->GetArena()->Adapter(kArenaAllocCodeGenerator)) { // Save the link register (containing the return address) to mimic Quick. AddAllocatedRegister(LocationFrom(lr)); } diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 277f6b48c..a47a95e3b 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -475,8 +475,8 @@ CodeGeneratorX86::CodeGeneratorX86(HGraph* graph, instruction_visitor_(graph, this), move_resolver_(graph->GetArena(), this), isa_features_(isa_features), - method_patches_(graph->GetArena()->Adapter()), - relative_call_patches_(graph->GetArena()->Adapter()) { + method_patches_(graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + relative_call_patches_(graph->GetArena()->Adapter(kArenaAllocCodeGenerator)) { // Use a fake return address register to mimic Quick. AddAllocatedRegister(Location::RegisterLocation(kFakeReturnRegister)); } @@ -5623,7 +5623,7 @@ void CodeGeneratorX86::Finalize(CodeAllocator* allocator) { /** * Class to handle late fixup of offsets into constant area. */ -class RIPFixup : public AssemblerFixup, public ArenaObject { +class RIPFixup : public AssemblerFixup, public ArenaObject { public: RIPFixup(const CodeGeneratorX86& codegen, int offset) : codegen_(codegen), offset_into_constant_area_(offset) {} diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index 453c6fd6e..b845a271d 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -626,9 +626,9 @@ CodeGeneratorX86_64::CodeGeneratorX86_64(HGraph* graph, move_resolver_(graph->GetArena(), this), isa_features_(isa_features), constant_area_start_(0), - method_patches_(graph->GetArena()->Adapter()), - relative_call_patches_(graph->GetArena()->Adapter()), - pc_rel_dex_cache_patches_(graph->GetArena()->Adapter()) { + method_patches_(graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + relative_call_patches_(graph->GetArena()->Adapter(kArenaAllocCodeGenerator)), + pc_rel_dex_cache_patches_(graph->GetArena()->Adapter(kArenaAllocCodeGenerator)) { AddAllocatedRegister(Location::RegisterLocation(kFakeReturnRegister)); } @@ -5279,7 +5279,7 @@ void CodeGeneratorX86_64::Finalize(CodeAllocator* allocator) { /** * Class to handle late fixup of offsets into constant area. */ -class RIPFixup : public AssemblerFixup, public ArenaObject { +class RIPFixup : public AssemblerFixup, public ArenaObject { public: RIPFixup(const CodeGeneratorX86_64& codegen, int offset) : codegen_(codegen), offset_into_constant_area_(offset) {} diff --git a/compiler/optimizing/gvn.cc b/compiler/optimizing/gvn.cc index 5050e155f..7cf061773 100644 --- a/compiler/optimizing/gvn.cc +++ b/compiler/optimizing/gvn.cc @@ -39,7 +39,7 @@ class ValueSet : public ArenaObject { explicit ValueSet(ArenaAllocator* allocator) : allocator_(allocator), num_buckets_(kMinimumNumberOfBuckets), - buckets_(allocator->AllocArray(num_buckets_)), + buckets_(allocator->AllocArray(num_buckets_, kArenaAllocGvn)), buckets_owned_(allocator, num_buckets_, false), num_entries_(0) { // ArenaAllocator returns zeroed memory, so no need to set buckets to null. @@ -52,7 +52,7 @@ class ValueSet : public ArenaObject { ValueSet(ArenaAllocator* allocator, const ValueSet& to_copy) : allocator_(allocator), num_buckets_(to_copy.IdealBucketCount()), - buckets_(allocator->AllocArray(num_buckets_)), + buckets_(allocator->AllocArray(num_buckets_, kArenaAllocGvn)), buckets_owned_(allocator, num_buckets_, false), num_entries_(to_copy.num_entries_) { // ArenaAllocator returns zeroed memory, so entries of buckets_ and diff --git a/compiler/optimizing/induction_var_analysis.cc b/compiler/optimizing/induction_var_analysis.cc index 9fb430445..52c729d5f 100644 --- a/compiler/optimizing/induction_var_analysis.cc +++ b/compiler/optimizing/induction_var_analysis.cc @@ -74,11 +74,14 @@ static void RotateEntryPhiFirst(HLoopInformation* loop, HInductionVarAnalysis::HInductionVarAnalysis(HGraph* graph) : HOptimization(graph, kInductionPassName), global_depth_(0), - stack_(graph->GetArena()->Adapter()), - scc_(graph->GetArena()->Adapter()), - map_(std::less(), graph->GetArena()->Adapter()), - cycle_(std::less(), graph->GetArena()->Adapter()), - induction_(std::less(), graph->GetArena()->Adapter()) { + stack_(graph->GetArena()->Adapter(kArenaAllocInductionVarAnalysis)), + scc_(graph->GetArena()->Adapter(kArenaAllocInductionVarAnalysis)), + map_(std::less(), + graph->GetArena()->Adapter(kArenaAllocInductionVarAnalysis)), + cycle_(std::less(), + graph->GetArena()->Adapter(kArenaAllocInductionVarAnalysis)), + induction_(std::less(), + graph->GetArena()->Adapter(kArenaAllocInductionVarAnalysis)) { } void HInductionVarAnalysis::Run() { @@ -228,7 +231,7 @@ void HInductionVarAnalysis::ClassifyNonTrivial(HLoopInformation* loop) { // Rotate proper entry-phi to front. if (size > 1) { - ArenaVector other(graph_->GetArena()->Adapter()); + ArenaVector other(graph_->GetArena()->Adapter(kArenaAllocInductionVarAnalysis)); RotateEntryPhiFirst(loop, &scc_, &other); } @@ -637,7 +640,8 @@ void HInductionVarAnalysis::AssignInfo(HLoopInformation* loop, if (it == induction_.end()) { it = induction_.Put(loop, ArenaSafeMap( - std::less(), graph_->GetArena()->Adapter())); + std::less(), + graph_->GetArena()->Adapter(kArenaAllocInductionVarAnalysis))); } it->second.Put(instruction, info); } diff --git a/compiler/optimizing/induction_var_analysis.h b/compiler/optimizing/induction_var_analysis.h index 190a0db65..ba5bfc215 100644 --- a/compiler/optimizing/induction_var_analysis.h +++ b/compiler/optimizing/induction_var_analysis.h @@ -78,7 +78,7 @@ class HInductionVarAnalysis : public HOptimization { * (4) periodic * nop: a, then defined by b (repeated when exhausted) */ - struct InductionInfo : public ArenaObject { + struct InductionInfo : public ArenaObject { InductionInfo(InductionClass ic, InductionOp op, InductionInfo* a, diff --git a/compiler/optimizing/locations.h b/compiler/optimizing/locations.h index 76bd595fc..de4fb7e20 100644 --- a/compiler/optimizing/locations.h +++ b/compiler/optimizing/locations.h @@ -468,7 +468,7 @@ static constexpr bool kIntrinsified = true; * The intent is to have the code for generating the instruction independent of * register allocation. A register allocator just has to provide a LocationSummary. */ -class LocationSummary : public ArenaObject { +class LocationSummary : public ArenaObject { public: enum CallKind { kNoCall, diff --git a/compiler/optimizing/register_allocator.cc b/compiler/optimizing/register_allocator.cc index c43e58ffc..9cdb89b7b 100644 --- a/compiler/optimizing/register_allocator.cc +++ b/compiler/optimizing/register_allocator.cc @@ -187,7 +187,8 @@ void RegisterAllocator::AllocateRegistersInternal() { } number_of_registers_ = codegen_->GetNumberOfCoreRegisters(); - registers_array_ = allocator_->AllocArray(number_of_registers_); + registers_array_ = allocator_->AllocArray(number_of_registers_, + kArenaAllocRegisterAllocator); processing_core_registers_ = true; unhandled_ = &unhandled_core_intervals_; for (LiveInterval* fixed : physical_core_register_intervals_) { @@ -206,7 +207,8 @@ void RegisterAllocator::AllocateRegistersInternal() { handled_.clear(); number_of_registers_ = codegen_->GetNumberOfFloatingPointRegisters(); - registers_array_ = allocator_->AllocArray(number_of_registers_); + registers_array_ = allocator_->AllocArray(number_of_registers_, + kArenaAllocRegisterAllocator); processing_core_registers_ = false; unhandled_ = &unhandled_fp_intervals_; for (LiveInterval* fixed : physical_fp_register_intervals_) { diff --git a/compiler/optimizing/ssa_liveness_analysis.h b/compiler/optimizing/ssa_liveness_analysis.h index 414cc7d95..e4b0999d4 100644 --- a/compiler/optimizing/ssa_liveness_analysis.h +++ b/compiler/optimizing/ssa_liveness_analysis.h @@ -27,7 +27,7 @@ class SsaLivenessAnalysis; static constexpr int kNoRegister = -1; -class BlockInfo : public ArenaObject { +class BlockInfo : public ArenaObject { public: BlockInfo(ArenaAllocator* allocator, const HBasicBlock& block, size_t number_of_ssa_values) : block_(block), @@ -55,7 +55,7 @@ class BlockInfo : public ArenaObject { * A live range contains the start and end of a range where an instruction or a temporary * is live. */ -class LiveRange FINAL : public ArenaObject { +class LiveRange FINAL : public ArenaObject { public: LiveRange(size_t start, size_t end, LiveRange* next) : start_(start), end_(end), next_(next) { DCHECK_LT(start, end); @@ -101,7 +101,7 @@ class LiveRange FINAL : public ArenaObject { /** * A use position represents a live interval use at a given position. */ -class UsePosition : public ArenaObject { +class UsePosition : public ArenaObject { public: UsePosition(HInstruction* user, HEnvironment* environment, @@ -169,7 +169,7 @@ class UsePosition : public ArenaObject { DISALLOW_COPY_AND_ASSIGN(UsePosition); }; -class SafepointPosition : public ArenaObject { +class SafepointPosition : public ArenaObject { public: explicit SafepointPosition(HInstruction* instruction) : instruction_(instruction), diff --git a/runtime/base/arena_allocator.cc b/runtime/base/arena_allocator.cc index 691b57ff2..345428c2a 100644 --- a/runtime/base/arena_allocator.cc +++ b/runtime/base/arena_allocator.cc @@ -83,6 +83,8 @@ const char* const ArenaAllocatorStatsImpl::kAllocNames[] = { "BaselineMaps ", "Optimization ", "GVN ", + "InductionVar ", + "BCE ", "SsaLiveness ", "SsaPhiElim ", "RefTypeProp ", diff --git a/runtime/base/arena_allocator.h b/runtime/base/arena_allocator.h index 17045c62d..b4f19ee8d 100644 --- a/runtime/base/arena_allocator.h +++ b/runtime/base/arena_allocator.h @@ -93,6 +93,8 @@ enum ArenaAllocKind { kArenaAllocBaselineMaps, kArenaAllocOptimization, kArenaAllocGvn, + kArenaAllocInductionVarAnalysis, + kArenaAllocBoundsCheckElimination, kArenaAllocSsaLiveness, kArenaAllocSsaPhiElimination, kArenaAllocReferenceTypePropagation, -- 2.11.0