diff options
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/optimizing/inliner.cc | 28 | ||||
| -rw-r--r-- | compiler/optimizing/inliner.h | 7 | ||||
| -rw-r--r-- | compiler/optimizing/optimizing_compiler_stats.h | 27 |
3 files changed, 49 insertions, 13 deletions
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index 8c73f1d036..3e340908bf 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -1272,12 +1272,19 @@ bool HInliner::TryBuildAndInlineHelper(HInvoke* invoke_instruction, caller_instruction_counter); callee_graph->SetArtMethod(resolved_method); - // When they are needed, allocate `inline_stats` on the heap instead + // When they are needed, allocate `inline_stats_` on the Arena instead // of on the stack, as Clang might produce a stack frame too large // for this function, that would not fit the requirements of the // `-Wframe-larger-than` option. - std::unique_ptr<OptimizingCompilerStats> inline_stats = - (stats_ == nullptr) ? nullptr : MakeUnique<OptimizingCompilerStats>(); + if (stats_ != nullptr) { + // Reuse one object for all inline attempts from this caller to keep Arena memory usage low. + if (inline_stats_ == nullptr) { + void* storage = graph_->GetArena()->Alloc<OptimizingCompilerStats>(kArenaAllocMisc); + inline_stats_ = new (storage) OptimizingCompilerStats; + } else { + inline_stats_->Reset(); + } + } HGraphBuilder builder(callee_graph, &dex_compilation_unit, &outer_compilation_unit_, @@ -1285,7 +1292,7 @@ bool HInliner::TryBuildAndInlineHelper(HInvoke* invoke_instruction, *code_item, compiler_driver_, codegen_, - inline_stats.get(), + inline_stats_, resolved_method->GetQuickenedInfo(class_linker->GetImagePointerSize()), dex_cache, handles_); @@ -1468,6 +1475,11 @@ bool HInliner::TryBuildAndInlineHelper(HInvoke* invoke_instruction, DCHECK_EQ(callee_instruction_counter, callee_graph->GetCurrentInstructionId()) << "No instructions can be added to the inner graph during inlining into the outer graph"; + if (stats_ != nullptr) { + DCHECK(inline_stats_ != nullptr); + inline_stats_->AddTo(stats_); + } + return true; } @@ -1476,11 +1488,11 @@ size_t HInliner::RunOptimizations(HGraph* callee_graph, const DexCompilationUnit& dex_compilation_unit) { // Note: if the outermost_graph_ is being compiled OSR, we should not run any // optimization that could lead to a HDeoptimize. The following optimizations do not. - HDeadCodeElimination dce(callee_graph, stats_, "dead_code_elimination$inliner"); + HDeadCodeElimination dce(callee_graph, inline_stats_, "dead_code_elimination$inliner"); HConstantFolding fold(callee_graph, "constant_folding$inliner"); HSharpening sharpening(callee_graph, codegen_, dex_compilation_unit, compiler_driver_, handles_); - InstructionSimplifier simplify(callee_graph, stats_); - IntrinsicsRecognizer intrinsics(callee_graph, stats_); + InstructionSimplifier simplify(callee_graph, inline_stats_); + IntrinsicsRecognizer intrinsics(callee_graph, inline_stats_); HOptimization* optimizations[] = { &intrinsics, @@ -1504,7 +1516,7 @@ size_t HInliner::RunOptimizations(HGraph* callee_graph, dex_compilation_unit, compiler_driver_, handles_, - stats_, + inline_stats_, total_number_of_dex_registers_ + code_item->registers_size_, depth_ + 1); inliner.Run(); diff --git a/compiler/optimizing/inliner.h b/compiler/optimizing/inliner.h index 11aacab802..75d025ae41 100644 --- a/compiler/optimizing/inliner.h +++ b/compiler/optimizing/inliner.h @@ -51,7 +51,8 @@ class HInliner : public HOptimization { total_number_of_dex_registers_(total_number_of_dex_registers), depth_(depth), number_of_inlined_instructions_(0), - handles_(handles) {} + handles_(handles), + inline_stats_(nullptr) {} void Run() OVERRIDE; @@ -218,6 +219,10 @@ class HInliner : public HOptimization { size_t number_of_inlined_instructions_; VariableSizedHandleScope* const handles_; + // Used to record stats about optimizations on the inlined graph. + // If the inlining is successful, these stats are merged to the caller graph's stats. + OptimizingCompilerStats* inline_stats_; + DISALLOW_COPY_AND_ASSIGN(HInliner); }; diff --git a/compiler/optimizing/optimizing_compiler_stats.h b/compiler/optimizing/optimizing_compiler_stats.h index 203b1ec7ec..7240d40d7f 100644 --- a/compiler/optimizing/optimizing_compiler_stats.h +++ b/compiler/optimizing/optimizing_compiler_stats.h @@ -17,6 +17,7 @@ #ifndef ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_ #define ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_ +#include <atomic> #include <iomanip> #include <string> #include <type_traits> @@ -72,9 +73,12 @@ enum MethodCompilationStat { class OptimizingCompilerStats { public: - OptimizingCompilerStats() {} + OptimizingCompilerStats() { + // The std::atomic<> default constructor leaves values uninitialized, so initialize them now. + Reset(); + } - void RecordStat(MethodCompilationStat stat, size_t count = 1) { + void RecordStat(MethodCompilationStat stat, uint32_t count = 1) { compile_stats_[stat] += count; } @@ -93,7 +97,7 @@ class OptimizingCompilerStats { << " methods: " << std::fixed << std::setprecision(2) << compiled_percent << "% (" << compile_stats_[kCompiled] << ") compiled."; - for (int i = 0; i < kLastStat; i++) { + for (size_t i = 0; i < kLastStat; i++) { if (compile_stats_[i] != 0) { LOG(INFO) << PrintMethodCompilationStat(static_cast<MethodCompilationStat>(i)) << ": " << compile_stats_[i]; @@ -102,6 +106,21 @@ class OptimizingCompilerStats { } } + void AddTo(OptimizingCompilerStats* other_stats) { + for (size_t i = 0; i != kLastStat; ++i) { + uint32_t count = compile_stats_[i]; + if (count != 0) { + other_stats->RecordStat(static_cast<MethodCompilationStat>(i), count); + } + } + } + + void Reset() { + for (size_t i = 0; i != kLastStat; ++i) { + compile_stats_[i] = 0u; + } + } + private: std::string PrintMethodCompilationStat(MethodCompilationStat stat) const { std::string name; @@ -156,7 +175,7 @@ class OptimizingCompilerStats { return "OptStat#" + name; } - AtomicInteger compile_stats_[kLastStat]; + std::atomic<uint32_t> compile_stats_[kLastStat]; DISALLOW_COPY_AND_ASSIGN(OptimizingCompilerStats); }; |