blob: af7ab2f1a0d22e58c1654b903099ee3a5df7098f [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,
66 kSelectGenerated,
Calin Juravle69158982016-03-16 11:53:41 +000067 kRemovedInstanceOf,
68 kInlinedInvokeVirtualOrInterface,
Calin Juravle2ae48182016-03-16 14:05:09 +000069 kImplicitNullCheckGenerated,
70 kExplicitNullCheckGenerated,
Nicolas Geoffraydac9b192016-07-15 10:46:17 +010071 kSimplifyIf,
Nicolas Geoffrayb813ca12017-02-16 22:08:29 +000072 kInstructionSunk,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000073 kNotInlinedUnresolvedEntrypoint,
74 kNotInlinedDexCache,
75 kNotInlinedStackMaps,
76 kNotInlinedEnvironmentBudget,
77 kNotInlinedInstructionBudget,
78 kNotInlinedLoopWithoutExit,
79 kNotInlinedIrreducibleLoop,
80 kNotInlinedAlwaysThrows,
81 kNotInlinedInfiniteLoop,
82 kNotInlinedTryCatch,
83 kNotInlinedRegisterAllocator,
84 kNotInlinedCannotBuild,
85 kNotInlinedNotVerified,
86 kNotInlinedCodeItem,
87 kNotInlinedWont,
88 kNotInlinedRecursiveBudget,
89 kNotInlinedProxy,
Igor Murashkin6ef45672017-08-08 13:59:55 -070090 kConstructorFenceGeneratedNew,
91 kConstructorFenceGeneratedFinal,
92 kConstructorFenceRemovedLSE,
93 kConstructorFenceRemovedPFRA,
Igor Murashkindd018df2017-08-09 10:38:31 -070094 kConstructorFenceRemovedCFRE,
Calin Juravle48c2b032014-12-09 18:11:36 +000095 kLastStat
96};
97
98class OptimizingCompilerStats {
99 public:
Vladimir Markoff754d12017-02-24 15:01:41 +0000100 OptimizingCompilerStats() {
101 // The std::atomic<> default constructor leaves values uninitialized, so initialize them now.
102 Reset();
103 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000104
Vladimir Marko438709f2017-02-23 18:56:13 +0000105 void RecordStat(MethodCompilationStat stat, uint32_t count = 1) {
David Brazdil2d7352b2015-04-20 14:52:42 +0100106 compile_stats_[stat] += count;
Calin Juravle48c2b032014-12-09 18:11:36 +0000107 }
108
109 void Log() const {
Calin Juravlead543382015-11-19 17:26:29 +0000110 if (!kIsDebugBuild && !VLOG_IS_ON(compiler)) {
111 // Log only in debug builds or if the compiler is verbose.
112 return;
113 }
114
Calin Juravle48c2b032014-12-09 18:11:36 +0000115 if (compile_stats_[kAttemptCompilation] == 0) {
116 LOG(INFO) << "Did not compile any method.";
117 } else {
Calin Juravlead543382015-11-19 17:26:29 +0000118 float compiled_percent =
119 compile_stats_[kCompiled] * 100.0f / compile_stats_[kAttemptCompilation];
120 LOG(INFO) << "Attempted compilation of " << compile_stats_[kAttemptCompilation]
121 << " methods: " << std::fixed << std::setprecision(2)
122 << compiled_percent << "% (" << compile_stats_[kCompiled] << ") compiled.";
Nicolas Geoffray12be74e2015-03-30 13:29:08 +0100123
Vladimir Marko438709f2017-02-23 18:56:13 +0000124 for (size_t i = 0; i < kLastStat; i++) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000125 if (compile_stats_[i] != 0) {
Andreas Gampeda9badb2015-06-05 20:22:12 -0700126 LOG(INFO) << PrintMethodCompilationStat(static_cast<MethodCompilationStat>(i)) << ": "
127 << compile_stats_[i];
Calin Juravle48c2b032014-12-09 18:11:36 +0000128 }
129 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000130 }
131 }
132
Vladimir Marko438709f2017-02-23 18:56:13 +0000133 void AddTo(OptimizingCompilerStats* other_stats) {
134 for (size_t i = 0; i != kLastStat; ++i) {
135 uint32_t count = compile_stats_[i];
136 if (count != 0) {
137 other_stats->RecordStat(static_cast<MethodCompilationStat>(i), count);
138 }
139 }
140 }
141
142 void Reset() {
143 for (size_t i = 0; i != kLastStat; ++i) {
144 compile_stats_[i] = 0u;
145 }
146 }
147
Calin Juravle48c2b032014-12-09 18:11:36 +0000148 private:
Andreas Gampeda9badb2015-06-05 20:22:12 -0700149 std::string PrintMethodCompilationStat(MethodCompilationStat stat) const {
Calin Juravlead543382015-11-19 17:26:29 +0000150 std::string name;
Calin Juravle48c2b032014-12-09 18:11:36 +0000151 switch (stat) {
Calin Juravlead543382015-11-19 17:26:29 +0000152 case kAttemptCompilation : name = "AttemptCompilation"; break;
Mingyao Yang063fc772016-08-02 11:02:54 -0700153 case kCHAInline : name = "CHAInline"; break;
Calin Juravlead543382015-11-19 17:26:29 +0000154 case kCompiled : name = "Compiled"; break;
155 case kInlinedInvoke : name = "InlinedInvoke"; break;
Vladimir Markobe10e8e2016-01-22 12:09:44 +0000156 case kReplacedInvokeWithSimplePattern: name = "ReplacedInvokeWithSimplePattern"; break;
Calin Juravlead543382015-11-19 17:26:29 +0000157 case kInstructionSimplifications: name = "InstructionSimplifications"; break;
158 case kInstructionSimplificationsArch: name = "InstructionSimplificationsArch"; break;
159 case kUnresolvedMethod : name = "UnresolvedMethod"; break;
160 case kUnresolvedField : name = "UnresolvedField"; break;
161 case kUnresolvedFieldNotAFastAccess : name = "UnresolvedFieldNotAFastAccess"; break;
162 case kRemovedCheckedCast: name = "RemovedCheckedCast"; break;
163 case kRemovedDeadInstruction: name = "RemovedDeadInstruction"; break;
164 case kRemovedNullCheck: name = "RemovedNullCheck"; break;
David Brazdil86ea7ee2016-02-16 09:26:07 +0000165 case kNotCompiledSkipped: name = "NotCompiledSkipped"; break;
166 case kNotCompiledInvalidBytecode: name = "NotCompiledInvalidBytecode"; break;
David Brazdil4833f5a2015-12-16 10:37:39 +0000167 case kNotCompiledThrowCatchLoop : name = "NotCompiledThrowCatchLoop"; break;
David Brazdil15693bf2015-12-16 10:30:45 +0000168 case kNotCompiledAmbiguousArrayOp : name = "NotCompiledAmbiguousArrayOp"; break;
Calin Juravlead543382015-11-19 17:26:29 +0000169 case kNotCompiledHugeMethod : name = "NotCompiledHugeMethod"; break;
170 case kNotCompiledLargeMethodNoBranches : name = "NotCompiledLargeMethodNoBranches"; break;
171 case kNotCompiledMalformedOpcode : name = "NotCompiledMalformedOpcode"; break;
172 case kNotCompiledNoCodegen : name = "NotCompiledNoCodegen"; break;
173 case kNotCompiledPathological : name = "NotCompiledPathological"; break;
174 case kNotCompiledSpaceFilter : name = "NotCompiledSpaceFilter"; break;
175 case kNotCompiledUnhandledInstruction : name = "NotCompiledUnhandledInstruction"; break;
176 case kNotCompiledUnsupportedIsa : name = "NotCompiledUnsupportedIsa"; break;
177 case kNotCompiledVerificationError : name = "NotCompiledVerificationError"; break;
178 case kNotCompiledVerifyAtRuntime : name = "NotCompiledVerifyAtRuntime"; break;
Nicolas Geoffray73be1e82015-09-17 15:22:56 +0100179 case kInlinedMonomorphicCall: name = "InlinedMonomorphicCall"; break;
Nicolas Geoffraya42363f2015-12-17 14:57:09 +0000180 case kInlinedPolymorphicCall: name = "InlinedPolymorphicCall"; break;
Nicolas Geoffray73be1e82015-09-17 15:22:56 +0100181 case kMonomorphicCall: name = "MonomorphicCall"; break;
182 case kPolymorphicCall: name = "PolymorphicCall"; break;
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +0100183 case kMegamorphicCall: name = "MegamorphicCall"; break;
184 case kBooleanSimplified : name = "BooleanSimplified"; break;
185 case kIntrinsicRecognized : name = "IntrinsicRecognized"; break;
186 case kLoopInvariantMoved : name = "LoopInvariantMoved"; break;
187 case kSelectGenerated : name = "SelectGenerated"; break;
Calin Juravle69158982016-03-16 11:53:41 +0000188 case kRemovedInstanceOf: name = "RemovedInstanceOf"; break;
189 case kInlinedInvokeVirtualOrInterface: name = "InlinedInvokeVirtualOrInterface"; break;
Calin Juravle2ae48182016-03-16 14:05:09 +0000190 case kImplicitNullCheckGenerated: name = "ImplicitNullCheckGenerated"; break;
191 case kExplicitNullCheckGenerated: name = "ExplicitNullCheckGenerated"; break;
Nicolas Geoffraydac9b192016-07-15 10:46:17 +0100192 case kSimplifyIf: name = "SimplifyIf"; break;
Nicolas Geoffrayb813ca12017-02-16 22:08:29 +0000193 case kInstructionSunk: name = "InstructionSunk"; break;
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +0000194 case kNotInlinedUnresolvedEntrypoint: name = "NotInlinedUnresolvedEntrypoint"; break;
195 case kNotInlinedDexCache: name = "NotInlinedDexCache"; break;
196 case kNotInlinedStackMaps: name = "NotInlinedStackMaps"; break;
197 case kNotInlinedEnvironmentBudget: name = "NotInlinedEnvironmentBudget"; break;
198 case kNotInlinedInstructionBudget: name = "NotInlinedInstructionBudget"; break;
199 case kNotInlinedLoopWithoutExit: name = "NotInlinedLoopWithoutExit"; break;
200 case kNotInlinedIrreducibleLoop: name = "NotInlinedIrreducibleLoop"; break;
201 case kNotInlinedAlwaysThrows: name = "NotInlinedAlwaysThrows"; break;
202 case kNotInlinedInfiniteLoop: name = "NotInlinedInfiniteLoop"; break;
203 case kNotInlinedTryCatch: name = "NotInlinedTryCatch"; break;
204 case kNotInlinedRegisterAllocator: name = "NotInlinedRegisterAllocator"; break;
205 case kNotInlinedCannotBuild: name = "NotInlinedCannotBuild"; break;
206 case kNotInlinedNotVerified: name = "NotInlinedNotVerified"; break;
207 case kNotInlinedCodeItem: name = "NotInlinedCodeItem"; break;
208 case kNotInlinedWont: name = "NotInlinedWont"; break;
209 case kNotInlinedRecursiveBudget: name = "NotInlinedRecursiveBudget"; break;
210 case kNotInlinedProxy: name = "NotInlinedProxy"; break;
Igor Murashkin6ef45672017-08-08 13:59:55 -0700211 case kConstructorFenceGeneratedNew: name = "ConstructorFenceGeneratedNew"; break;
212 case kConstructorFenceGeneratedFinal: name = "ConstructorFenceGeneratedFinal"; break;
213 case kConstructorFenceRemovedLSE: name = "ConstructorFenceRemovedLSE"; break;
214 case kConstructorFenceRemovedPFRA: name = "ConstructorFenceRemovedPFRA"; break;
Igor Murashkindd018df2017-08-09 10:38:31 -0700215 case kConstructorFenceRemovedCFRE: name = "ConstructorFenceRemovedCFRE"; break;
Andreas Gampeda9badb2015-06-05 20:22:12 -0700216
Calin Juravlead543382015-11-19 17:26:29 +0000217 case kLastStat:
218 LOG(FATAL) << "invalid stat "
219 << static_cast<std::underlying_type<MethodCompilationStat>::type>(stat);
220 UNREACHABLE();
Calin Juravle48c2b032014-12-09 18:11:36 +0000221 }
Calin Juravlead543382015-11-19 17:26:29 +0000222 return "OptStat#" + name;
Calin Juravle48c2b032014-12-09 18:11:36 +0000223 }
224
Vladimir Marko438709f2017-02-23 18:56:13 +0000225 std::atomic<uint32_t> compile_stats_[kLastStat];
Calin Juravle48c2b032014-12-09 18:11:36 +0000226
227 DISALLOW_COPY_AND_ASSIGN(OptimizingCompilerStats);
228};
229
Igor Murashkin1e065a52017-08-09 13:20:34 -0700230inline void MaybeRecordStat(OptimizingCompilerStats* compiler_stats,
231 MethodCompilationStat stat,
232 uint32_t count = 1) {
233 if (compiler_stats != nullptr) {
234 compiler_stats->RecordStat(stat, count);
235 }
236}
237
Calin Juravle48c2b032014-12-09 18:11:36 +0000238} // namespace art
239
240#endif // ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_