blob: ff49056798d6c2a7145d0c7987ff219e40c9f4bb [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
30enum MethodCompilationStat {
31 kAttemptCompilation = 0,
Mingyao Yang063fc772016-08-02 11:02:54 -070032 kCHAInline,
Calin Juravlead543382015-11-19 17:26:29 +000033 kCompiled,
Nicolas Geoffraye53798a2014-12-01 10:31:54 +000034 kInlinedInvoke,
Vladimir Markobe10e8e2016-01-22 12:09:44 +000035 kReplacedInvokeWithSimplePattern,
Calin Juravle702d2602015-04-30 19:28:21 +010036 kInstructionSimplifications,
Alexandre Rames44b9cf92015-08-19 15:39:06 +010037 kInstructionSimplificationsArch,
Calin Juravle175dc732015-08-25 15:42:32 +010038 kUnresolvedMethod,
Calin Juravlee460d1d2015-09-29 04:52:17 +010039 kUnresolvedField,
Calin Juravle07380a22015-09-17 14:15:12 +010040 kUnresolvedFieldNotAFastAccess,
Calin Juravlead543382015-11-19 17:26:29 +000041 kRemovedCheckedCast,
42 kRemovedDeadInstruction,
43 kRemovedNullCheck,
David Brazdil86ea7ee2016-02-16 09:26:07 +000044 kNotCompiledSkipped,
45 kNotCompiledInvalidBytecode,
David Brazdil4833f5a2015-12-16 10:37:39 +000046 kNotCompiledThrowCatchLoop,
David Brazdil15693bf2015-12-16 10:30:45 +000047 kNotCompiledAmbiguousArrayOp,
Calin Juravle48c2b032014-12-09 18:11:36 +000048 kNotCompiledHugeMethod,
49 kNotCompiledLargeMethodNoBranches,
Nicolas Geoffray2e335252015-06-18 11:11:27 +010050 kNotCompiledMalformedOpcode,
Calin Juravle48c2b032014-12-09 18:11:36 +000051 kNotCompiledNoCodegen,
Calin Juravle702d2602015-04-30 19:28:21 +010052 kNotCompiledPathological,
Nicolas Geoffray36540cb2015-03-23 14:45:53 +000053 kNotCompiledSpaceFilter,
Calin Juravle48c2b032014-12-09 18:11:36 +000054 kNotCompiledUnhandledInstruction,
Calin Juravle702d2602015-04-30 19:28:21 +010055 kNotCompiledUnsupportedIsa,
Calin Juravlead543382015-11-19 17:26:29 +000056 kNotCompiledVerificationError,
Calin Juravlef1c6d9e2015-04-13 18:42:21 +010057 kNotCompiledVerifyAtRuntime,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010058 kInlinedMonomorphicCall,
Nicolas Geoffraya42363f2015-12-17 14:57:09 +000059 kInlinedPolymorphicCall,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010060 kMonomorphicCall,
61 kPolymorphicCall,
62 kMegamorphicCall,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010063 kBooleanSimplified,
64 kIntrinsicRecognized,
65 kLoopInvariantMoved,
Aart Bik21b85922017-09-06 13:29:16 -070066 kLoopVectorized,
67 kLoopVectorizedIdiom,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010068 kSelectGenerated,
Calin Juravle69158982016-03-16 11:53:41 +000069 kRemovedInstanceOf,
70 kInlinedInvokeVirtualOrInterface,
Calin Juravle2ae48182016-03-16 14:05:09 +000071 kImplicitNullCheckGenerated,
72 kExplicitNullCheckGenerated,
Nicolas Geoffraydac9b192016-07-15 10:46:17 +010073 kSimplifyIf,
Nicolas Geoffrayb813ca12017-02-16 22:08:29 +000074 kInstructionSunk,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000075 kNotInlinedUnresolvedEntrypoint,
76 kNotInlinedDexCache,
77 kNotInlinedStackMaps,
78 kNotInlinedEnvironmentBudget,
79 kNotInlinedInstructionBudget,
80 kNotInlinedLoopWithoutExit,
81 kNotInlinedIrreducibleLoop,
82 kNotInlinedAlwaysThrows,
83 kNotInlinedInfiniteLoop,
84 kNotInlinedTryCatch,
85 kNotInlinedRegisterAllocator,
86 kNotInlinedCannotBuild,
87 kNotInlinedNotVerified,
88 kNotInlinedCodeItem,
89 kNotInlinedWont,
90 kNotInlinedRecursiveBudget,
91 kNotInlinedProxy,
Igor Murashkin6ef45672017-08-08 13:59:55 -070092 kConstructorFenceGeneratedNew,
93 kConstructorFenceGeneratedFinal,
94 kConstructorFenceRemovedLSE,
95 kConstructorFenceRemovedPFRA,
Calin Juravle48c2b032014-12-09 18:11:36 +000096 kLastStat
97};
98
99class OptimizingCompilerStats {
100 public:
Vladimir Markoff754d12017-02-24 15:01:41 +0000101 OptimizingCompilerStats() {
102 // The std::atomic<> default constructor leaves values uninitialized, so initialize them now.
103 Reset();
104 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000105
Vladimir Marko438709f2017-02-23 18:56:13 +0000106 void RecordStat(MethodCompilationStat stat, uint32_t count = 1) {
David Brazdil2d7352b2015-04-20 14:52:42 +0100107 compile_stats_[stat] += count;
Calin Juravle48c2b032014-12-09 18:11:36 +0000108 }
109
110 void Log() const {
Calin Juravlead543382015-11-19 17:26:29 +0000111 if (!kIsDebugBuild && !VLOG_IS_ON(compiler)) {
112 // Log only in debug builds or if the compiler is verbose.
113 return;
114 }
115
Calin Juravle48c2b032014-12-09 18:11:36 +0000116 if (compile_stats_[kAttemptCompilation] == 0) {
117 LOG(INFO) << "Did not compile any method.";
118 } else {
Calin Juravlead543382015-11-19 17:26:29 +0000119 float compiled_percent =
120 compile_stats_[kCompiled] * 100.0f / compile_stats_[kAttemptCompilation];
121 LOG(INFO) << "Attempted compilation of " << compile_stats_[kAttemptCompilation]
122 << " methods: " << std::fixed << std::setprecision(2)
123 << compiled_percent << "% (" << compile_stats_[kCompiled] << ") compiled.";
Nicolas Geoffray12be74e2015-03-30 13:29:08 +0100124
Vladimir Marko438709f2017-02-23 18:56:13 +0000125 for (size_t i = 0; i < kLastStat; i++) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000126 if (compile_stats_[i] != 0) {
Andreas Gampeda9badb2015-06-05 20:22:12 -0700127 LOG(INFO) << PrintMethodCompilationStat(static_cast<MethodCompilationStat>(i)) << ": "
128 << compile_stats_[i];
Calin Juravle48c2b032014-12-09 18:11:36 +0000129 }
130 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000131 }
132 }
133
Vladimir Marko438709f2017-02-23 18:56:13 +0000134 void AddTo(OptimizingCompilerStats* other_stats) {
135 for (size_t i = 0; i != kLastStat; ++i) {
136 uint32_t count = compile_stats_[i];
137 if (count != 0) {
138 other_stats->RecordStat(static_cast<MethodCompilationStat>(i), count);
139 }
140 }
141 }
142
143 void Reset() {
144 for (size_t i = 0; i != kLastStat; ++i) {
145 compile_stats_[i] = 0u;
146 }
147 }
148
Calin Juravle48c2b032014-12-09 18:11:36 +0000149 private:
Andreas Gampeda9badb2015-06-05 20:22:12 -0700150 std::string PrintMethodCompilationStat(MethodCompilationStat stat) const {
Calin Juravlead543382015-11-19 17:26:29 +0000151 std::string name;
Calin Juravle48c2b032014-12-09 18:11:36 +0000152 switch (stat) {
Calin Juravlead543382015-11-19 17:26:29 +0000153 case kAttemptCompilation : name = "AttemptCompilation"; break;
Mingyao Yang063fc772016-08-02 11:02:54 -0700154 case kCHAInline : name = "CHAInline"; break;
Calin Juravlead543382015-11-19 17:26:29 +0000155 case kCompiled : name = "Compiled"; break;
156 case kInlinedInvoke : name = "InlinedInvoke"; break;
Vladimir Markobe10e8e2016-01-22 12:09:44 +0000157 case kReplacedInvokeWithSimplePattern: name = "ReplacedInvokeWithSimplePattern"; break;
Calin Juravlead543382015-11-19 17:26:29 +0000158 case kInstructionSimplifications: name = "InstructionSimplifications"; break;
159 case kInstructionSimplificationsArch: name = "InstructionSimplificationsArch"; break;
160 case kUnresolvedMethod : name = "UnresolvedMethod"; break;
161 case kUnresolvedField : name = "UnresolvedField"; break;
162 case kUnresolvedFieldNotAFastAccess : name = "UnresolvedFieldNotAFastAccess"; break;
163 case kRemovedCheckedCast: name = "RemovedCheckedCast"; break;
164 case kRemovedDeadInstruction: name = "RemovedDeadInstruction"; break;
165 case kRemovedNullCheck: name = "RemovedNullCheck"; break;
David Brazdil86ea7ee2016-02-16 09:26:07 +0000166 case kNotCompiledSkipped: name = "NotCompiledSkipped"; break;
167 case kNotCompiledInvalidBytecode: name = "NotCompiledInvalidBytecode"; break;
David Brazdil4833f5a2015-12-16 10:37:39 +0000168 case kNotCompiledThrowCatchLoop : name = "NotCompiledThrowCatchLoop"; break;
David Brazdil15693bf2015-12-16 10:30:45 +0000169 case kNotCompiledAmbiguousArrayOp : name = "NotCompiledAmbiguousArrayOp"; break;
Calin Juravlead543382015-11-19 17:26:29 +0000170 case kNotCompiledHugeMethod : name = "NotCompiledHugeMethod"; break;
171 case kNotCompiledLargeMethodNoBranches : name = "NotCompiledLargeMethodNoBranches"; break;
172 case kNotCompiledMalformedOpcode : name = "NotCompiledMalformedOpcode"; break;
173 case kNotCompiledNoCodegen : name = "NotCompiledNoCodegen"; break;
174 case kNotCompiledPathological : name = "NotCompiledPathological"; break;
175 case kNotCompiledSpaceFilter : name = "NotCompiledSpaceFilter"; break;
176 case kNotCompiledUnhandledInstruction : name = "NotCompiledUnhandledInstruction"; break;
177 case kNotCompiledUnsupportedIsa : name = "NotCompiledUnsupportedIsa"; break;
178 case kNotCompiledVerificationError : name = "NotCompiledVerificationError"; break;
179 case kNotCompiledVerifyAtRuntime : name = "NotCompiledVerifyAtRuntime"; break;
Nicolas Geoffray73be1e82015-09-17 15:22:56 +0100180 case kInlinedMonomorphicCall: name = "InlinedMonomorphicCall"; break;
Nicolas Geoffraya42363f2015-12-17 14:57:09 +0000181 case kInlinedPolymorphicCall: name = "InlinedPolymorphicCall"; break;
Nicolas Geoffray73be1e82015-09-17 15:22:56 +0100182 case kMonomorphicCall: name = "MonomorphicCall"; break;
183 case kPolymorphicCall: name = "PolymorphicCall"; break;
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +0100184 case kMegamorphicCall: name = "MegamorphicCall"; break;
185 case kBooleanSimplified : name = "BooleanSimplified"; break;
186 case kIntrinsicRecognized : name = "IntrinsicRecognized"; break;
187 case kLoopInvariantMoved : name = "LoopInvariantMoved"; break;
Aart Bik21b85922017-09-06 13:29:16 -0700188 case kLoopVectorized : name = "LoopVectorized"; break;
189 case kLoopVectorizedIdiom : name = "LoopVectorizedIdiom"; break;
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +0100190 case kSelectGenerated : name = "SelectGenerated"; break;
Calin Juravle69158982016-03-16 11:53:41 +0000191 case kRemovedInstanceOf: name = "RemovedInstanceOf"; break;
192 case kInlinedInvokeVirtualOrInterface: name = "InlinedInvokeVirtualOrInterface"; break;
Calin Juravle2ae48182016-03-16 14:05:09 +0000193 case kImplicitNullCheckGenerated: name = "ImplicitNullCheckGenerated"; break;
194 case kExplicitNullCheckGenerated: name = "ExplicitNullCheckGenerated"; break;
Nicolas Geoffraydac9b192016-07-15 10:46:17 +0100195 case kSimplifyIf: name = "SimplifyIf"; break;
Nicolas Geoffrayb813ca12017-02-16 22:08:29 +0000196 case kInstructionSunk: name = "InstructionSunk"; break;
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +0000197 case kNotInlinedUnresolvedEntrypoint: name = "NotInlinedUnresolvedEntrypoint"; break;
198 case kNotInlinedDexCache: name = "NotInlinedDexCache"; break;
199 case kNotInlinedStackMaps: name = "NotInlinedStackMaps"; break;
200 case kNotInlinedEnvironmentBudget: name = "NotInlinedEnvironmentBudget"; break;
201 case kNotInlinedInstructionBudget: name = "NotInlinedInstructionBudget"; break;
202 case kNotInlinedLoopWithoutExit: name = "NotInlinedLoopWithoutExit"; break;
203 case kNotInlinedIrreducibleLoop: name = "NotInlinedIrreducibleLoop"; break;
204 case kNotInlinedAlwaysThrows: name = "NotInlinedAlwaysThrows"; break;
205 case kNotInlinedInfiniteLoop: name = "NotInlinedInfiniteLoop"; break;
206 case kNotInlinedTryCatch: name = "NotInlinedTryCatch"; break;
207 case kNotInlinedRegisterAllocator: name = "NotInlinedRegisterAllocator"; break;
208 case kNotInlinedCannotBuild: name = "NotInlinedCannotBuild"; break;
209 case kNotInlinedNotVerified: name = "NotInlinedNotVerified"; break;
210 case kNotInlinedCodeItem: name = "NotInlinedCodeItem"; break;
211 case kNotInlinedWont: name = "NotInlinedWont"; break;
212 case kNotInlinedRecursiveBudget: name = "NotInlinedRecursiveBudget"; break;
213 case kNotInlinedProxy: name = "NotInlinedProxy"; break;
Igor Murashkin6ef45672017-08-08 13:59:55 -0700214 case kConstructorFenceGeneratedNew: name = "ConstructorFenceGeneratedNew"; break;
215 case kConstructorFenceGeneratedFinal: name = "ConstructorFenceGeneratedFinal"; break;
216 case kConstructorFenceRemovedLSE: name = "ConstructorFenceRemovedLSE"; break;
217 case kConstructorFenceRemovedPFRA: name = "ConstructorFenceRemovedPFRA"; break;
Andreas Gampeda9badb2015-06-05 20:22:12 -0700218
Calin Juravlead543382015-11-19 17:26:29 +0000219 case kLastStat:
220 LOG(FATAL) << "invalid stat "
221 << static_cast<std::underlying_type<MethodCompilationStat>::type>(stat);
222 UNREACHABLE();
Calin Juravle48c2b032014-12-09 18:11:36 +0000223 }
Calin Juravlead543382015-11-19 17:26:29 +0000224 return "OptStat#" + name;
Calin Juravle48c2b032014-12-09 18:11:36 +0000225 }
226
Vladimir Marko438709f2017-02-23 18:56:13 +0000227 std::atomic<uint32_t> compile_stats_[kLastStat];
Calin Juravle48c2b032014-12-09 18:11:36 +0000228
229 DISALLOW_COPY_AND_ASSIGN(OptimizingCompilerStats);
230};
231
Igor Murashkin1e065a52017-08-09 13:20:34 -0700232inline void MaybeRecordStat(OptimizingCompilerStats* compiler_stats,
233 MethodCompilationStat stat,
234 uint32_t count = 1) {
235 if (compiler_stats != nullptr) {
236 compiler_stats->RecordStat(stat, count);
237 }
238}
239
Calin Juravle48c2b032014-12-09 18:11:36 +0000240} // namespace art
241
242#endif // ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_