blob: a2e92d2931c120d35d3b3dd1198c90c736b500b1 [file] [log] [blame]
Calin Juravle48c2b032014-12-09 18:11:36 +00001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_
18#define ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_
19
Vladimir Marko438709f2017-02-23 18:56:13 +000020#include <atomic>
Calin Juravlead543382015-11-19 17:26:29 +000021#include <iomanip>
Calin Juravle48c2b032014-12-09 18:11:36 +000022#include <string>
Andreas Gampeda9badb2015-06-05 20:22:12 -070023#include <type_traits>
Calin Juravle48c2b032014-12-09 18:11:36 +000024
25#include "atomic.h"
Igor Murashkin6ef45672017-08-08 13:59:55 -070026#include "globals.h"
Calin Juravle48c2b032014-12-09 18:11:36 +000027
28namespace art {
29
Vladimir Markocd09e1f2017-11-24 15:02:40 +000030enum class MethodCompilationStat {
31 kAttemptBytecodeCompilation = 0,
32 kAttemptIntrinsicCompilation,
33 kCompiledNativeStub,
34 kCompiledIntrinsic,
35 kCompiledBytecode,
Mingyao Yang063fc772016-08-02 11:02:54 -070036 kCHAInline,
Nicolas Geoffraye53798a2014-12-01 10:31:54 +000037 kInlinedInvoke,
Vladimir Markobe10e8e2016-01-22 12:09:44 +000038 kReplacedInvokeWithSimplePattern,
Calin Juravle702d2602015-04-30 19:28:21 +010039 kInstructionSimplifications,
Alexandre Rames44b9cf92015-08-19 15:39:06 +010040 kInstructionSimplificationsArch,
Calin Juravle175dc732015-08-25 15:42:32 +010041 kUnresolvedMethod,
Calin Juravlee460d1d2015-09-29 04:52:17 +010042 kUnresolvedField,
Calin Juravle07380a22015-09-17 14:15:12 +010043 kUnresolvedFieldNotAFastAccess,
Calin Juravlead543382015-11-19 17:26:29 +000044 kRemovedCheckedCast,
45 kRemovedDeadInstruction,
46 kRemovedNullCheck,
David Brazdil86ea7ee2016-02-16 09:26:07 +000047 kNotCompiledSkipped,
48 kNotCompiledInvalidBytecode,
David Brazdil4833f5a2015-12-16 10:37:39 +000049 kNotCompiledThrowCatchLoop,
David Brazdil15693bf2015-12-16 10:30:45 +000050 kNotCompiledAmbiguousArrayOp,
Calin Juravle48c2b032014-12-09 18:11:36 +000051 kNotCompiledHugeMethod,
52 kNotCompiledLargeMethodNoBranches,
Nicolas Geoffray2e335252015-06-18 11:11:27 +010053 kNotCompiledMalformedOpcode,
Calin Juravle48c2b032014-12-09 18:11:36 +000054 kNotCompiledNoCodegen,
Calin Juravle702d2602015-04-30 19:28:21 +010055 kNotCompiledPathological,
Nicolas Geoffray36540cb2015-03-23 14:45:53 +000056 kNotCompiledSpaceFilter,
Calin Juravle48c2b032014-12-09 18:11:36 +000057 kNotCompiledUnhandledInstruction,
Calin Juravle702d2602015-04-30 19:28:21 +010058 kNotCompiledUnsupportedIsa,
Calin Juravlead543382015-11-19 17:26:29 +000059 kNotCompiledVerificationError,
Calin Juravlef1c6d9e2015-04-13 18:42:21 +010060 kNotCompiledVerifyAtRuntime,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010061 kInlinedMonomorphicCall,
Nicolas Geoffraya42363f2015-12-17 14:57:09 +000062 kInlinedPolymorphicCall,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010063 kMonomorphicCall,
64 kPolymorphicCall,
65 kMegamorphicCall,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010066 kBooleanSimplified,
67 kIntrinsicRecognized,
68 kLoopInvariantMoved,
Aart Bik21b85922017-09-06 13:29:16 -070069 kLoopVectorized,
70 kLoopVectorizedIdiom,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010071 kSelectGenerated,
Calin Juravle69158982016-03-16 11:53:41 +000072 kRemovedInstanceOf,
73 kInlinedInvokeVirtualOrInterface,
Calin Juravle2ae48182016-03-16 14:05:09 +000074 kImplicitNullCheckGenerated,
75 kExplicitNullCheckGenerated,
Nicolas Geoffraydac9b192016-07-15 10:46:17 +010076 kSimplifyIf,
Nicolas Geoffrayb813ca12017-02-16 22:08:29 +000077 kInstructionSunk,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000078 kNotInlinedUnresolvedEntrypoint,
79 kNotInlinedDexCache,
80 kNotInlinedStackMaps,
81 kNotInlinedEnvironmentBudget,
82 kNotInlinedInstructionBudget,
83 kNotInlinedLoopWithoutExit,
84 kNotInlinedIrreducibleLoop,
85 kNotInlinedAlwaysThrows,
86 kNotInlinedInfiniteLoop,
87 kNotInlinedTryCatch,
88 kNotInlinedRegisterAllocator,
89 kNotInlinedCannotBuild,
90 kNotInlinedNotVerified,
91 kNotInlinedCodeItem,
92 kNotInlinedWont,
93 kNotInlinedRecursiveBudget,
94 kNotInlinedProxy,
Igor Murashkin6ef45672017-08-08 13:59:55 -070095 kConstructorFenceGeneratedNew,
96 kConstructorFenceGeneratedFinal,
97 kConstructorFenceRemovedLSE,
98 kConstructorFenceRemovedPFRA,
Igor Murashkindd018df2017-08-09 10:38:31 -070099 kConstructorFenceRemovedCFRE,
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000100 kJitOutOfMemoryForCommit,
Calin Juravle48c2b032014-12-09 18:11:36 +0000101 kLastStat
102};
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000103std::ostream& operator<<(std::ostream& os, const MethodCompilationStat& rhs);
Calin Juravle48c2b032014-12-09 18:11:36 +0000104
105class OptimizingCompilerStats {
106 public:
Vladimir Markoff754d12017-02-24 15:01:41 +0000107 OptimizingCompilerStats() {
108 // The std::atomic<> default constructor leaves values uninitialized, so initialize them now.
109 Reset();
110 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000111
Vladimir Marko438709f2017-02-23 18:56:13 +0000112 void RecordStat(MethodCompilationStat stat, uint32_t count = 1) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000113 size_t stat_index = static_cast<size_t>(stat);
114 DCHECK_LT(stat_index, arraysize(compile_stats_));
115 compile_stats_[stat_index] += count;
116 }
117
118 uint32_t GetStat(MethodCompilationStat stat) const {
119 size_t stat_index = static_cast<size_t>(stat);
120 DCHECK_LT(stat_index, arraysize(compile_stats_));
121 return compile_stats_[stat_index];
Calin Juravle48c2b032014-12-09 18:11:36 +0000122 }
123
124 void Log() const {
Calin Juravlead543382015-11-19 17:26:29 +0000125 if (!kIsDebugBuild && !VLOG_IS_ON(compiler)) {
126 // Log only in debug builds or if the compiler is verbose.
127 return;
128 }
129
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000130 uint32_t compiled_intrinsics = GetStat(MethodCompilationStat::kCompiledIntrinsic);
131 uint32_t compiled_native_stubs = GetStat(MethodCompilationStat::kCompiledNativeStub);
132 uint32_t bytecode_attempts =
133 GetStat(MethodCompilationStat::kAttemptBytecodeCompilation);
134 if (compiled_intrinsics == 0u && compiled_native_stubs == 0u && bytecode_attempts == 0u) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000135 LOG(INFO) << "Did not compile any method.";
136 } else {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000137 uint32_t compiled_bytecode_methods =
138 GetStat(MethodCompilationStat::kCompiledBytecode);
139 // Successful intrinsic compilation preempts other compilation attempts but failed intrinsic
140 // compilation shall still count towards bytecode or native stub compilation attempts.
141 uint32_t num_compilation_attempts =
142 compiled_intrinsics + compiled_native_stubs + bytecode_attempts;
143 uint32_t num_successful_compilations =
144 compiled_intrinsics + compiled_native_stubs + compiled_bytecode_methods;
145 float compiled_percent = num_successful_compilations * 100.0f / num_compilation_attempts;
146 LOG(INFO) << "Attempted compilation of "
147 << num_compilation_attempts << " methods: " << std::fixed << std::setprecision(2)
148 << compiled_percent << "% (" << num_successful_compilations << ") compiled.";
Nicolas Geoffray12be74e2015-03-30 13:29:08 +0100149
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000150 for (size_t i = 0; i < arraysize(compile_stats_); ++i) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000151 if (compile_stats_[i] != 0) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000152 LOG(INFO) << "OptStat#" << static_cast<MethodCompilationStat>(i) << ": "
Andreas Gampeda9badb2015-06-05 20:22:12 -0700153 << compile_stats_[i];
Calin Juravle48c2b032014-12-09 18:11:36 +0000154 }
155 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000156 }
157 }
158
Vladimir Marko438709f2017-02-23 18:56:13 +0000159 void AddTo(OptimizingCompilerStats* other_stats) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000160 for (size_t i = 0; i != arraysize(compile_stats_); ++i) {
Vladimir Marko438709f2017-02-23 18:56:13 +0000161 uint32_t count = compile_stats_[i];
162 if (count != 0) {
163 other_stats->RecordStat(static_cast<MethodCompilationStat>(i), count);
164 }
165 }
166 }
167
168 void Reset() {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000169 for (std::atomic<uint32_t>& stat : compile_stats_) {
170 stat = 0u;
Vladimir Marko438709f2017-02-23 18:56:13 +0000171 }
172 }
173
Calin Juravle48c2b032014-12-09 18:11:36 +0000174 private:
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000175 std::atomic<uint32_t> compile_stats_[static_cast<size_t>(MethodCompilationStat::kLastStat)];
Calin Juravle48c2b032014-12-09 18:11:36 +0000176
177 DISALLOW_COPY_AND_ASSIGN(OptimizingCompilerStats);
178};
179
Igor Murashkin1e065a52017-08-09 13:20:34 -0700180inline void MaybeRecordStat(OptimizingCompilerStats* compiler_stats,
181 MethodCompilationStat stat,
182 uint32_t count = 1) {
183 if (compiler_stats != nullptr) {
184 compiler_stats->RecordStat(stat, count);
185 }
186}
187
Calin Juravle48c2b032014-12-09 18:11:36 +0000188} // namespace art
189
190#endif // ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_