blob: f246228074daf87f20601089fa18057e964b9db6 [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
David Sehrc431b9d2018-03-02 12:01:51 -080025#include "base/atomic.h"
26#include "base/globals.h"
Andreas Gampe57943812017-12-06 21:39:13 -080027#include "base/logging.h" // For VLOG_IS_ON.
Calin Juravle48c2b032014-12-09 18:11:36 +000028
29namespace art {
30
Vladimir Markocd09e1f2017-11-24 15:02:40 +000031enum class MethodCompilationStat {
32 kAttemptBytecodeCompilation = 0,
33 kAttemptIntrinsicCompilation,
34 kCompiledNativeStub,
35 kCompiledIntrinsic,
36 kCompiledBytecode,
Mingyao Yang063fc772016-08-02 11:02:54 -070037 kCHAInline,
Nicolas Geoffraye53798a2014-12-01 10:31:54 +000038 kInlinedInvoke,
Vladimir Markobe10e8e2016-01-22 12:09:44 +000039 kReplacedInvokeWithSimplePattern,
Calin Juravle702d2602015-04-30 19:28:21 +010040 kInstructionSimplifications,
Alexandre Rames44b9cf92015-08-19 15:39:06 +010041 kInstructionSimplificationsArch,
Calin Juravle175dc732015-08-25 15:42:32 +010042 kUnresolvedMethod,
Calin Juravlee460d1d2015-09-29 04:52:17 +010043 kUnresolvedField,
Calin Juravle07380a22015-09-17 14:15:12 +010044 kUnresolvedFieldNotAFastAccess,
Calin Juravlead543382015-11-19 17:26:29 +000045 kRemovedCheckedCast,
46 kRemovedDeadInstruction,
47 kRemovedNullCheck,
David Brazdil86ea7ee2016-02-16 09:26:07 +000048 kNotCompiledSkipped,
49 kNotCompiledInvalidBytecode,
David Brazdil4833f5a2015-12-16 10:37:39 +000050 kNotCompiledThrowCatchLoop,
David Brazdil15693bf2015-12-16 10:30:45 +000051 kNotCompiledAmbiguousArrayOp,
Calin Juravle48c2b032014-12-09 18:11:36 +000052 kNotCompiledHugeMethod,
Nicolas Geoffrayd147e2f2018-05-16 11:37:41 +010053 kNotCompiledIrreducibleAndStringInit,
Calin Juravle48c2b032014-12-09 18:11:36 +000054 kNotCompiledLargeMethodNoBranches,
Nicolas Geoffray2e335252015-06-18 11:11:27 +010055 kNotCompiledMalformedOpcode,
Calin Juravle48c2b032014-12-09 18:11:36 +000056 kNotCompiledNoCodegen,
Calin Juravle702d2602015-04-30 19:28:21 +010057 kNotCompiledPathological,
Nicolas Geoffray36540cb2015-03-23 14:45:53 +000058 kNotCompiledSpaceFilter,
Calin Juravle48c2b032014-12-09 18:11:36 +000059 kNotCompiledUnhandledInstruction,
Calin Juravle702d2602015-04-30 19:28:21 +010060 kNotCompiledUnsupportedIsa,
Calin Juravlead543382015-11-19 17:26:29 +000061 kNotCompiledVerificationError,
Calin Juravlef1c6d9e2015-04-13 18:42:21 +010062 kNotCompiledVerifyAtRuntime,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010063 kInlinedMonomorphicCall,
Nicolas Geoffraya42363f2015-12-17 14:57:09 +000064 kInlinedPolymorphicCall,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010065 kMonomorphicCall,
66 kPolymorphicCall,
67 kMegamorphicCall,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010068 kBooleanSimplified,
69 kIntrinsicRecognized,
70 kLoopInvariantMoved,
Aart Bik21b85922017-09-06 13:29:16 -070071 kLoopVectorized,
72 kLoopVectorizedIdiom,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010073 kSelectGenerated,
Calin Juravle69158982016-03-16 11:53:41 +000074 kRemovedInstanceOf,
75 kInlinedInvokeVirtualOrInterface,
Calin Juravle2ae48182016-03-16 14:05:09 +000076 kImplicitNullCheckGenerated,
77 kExplicitNullCheckGenerated,
Nicolas Geoffraydac9b192016-07-15 10:46:17 +010078 kSimplifyIf,
Aart Bika8b8e9b2018-01-09 11:01:02 -080079 kSimplifyThrowingInvoke,
Nicolas Geoffrayb813ca12017-02-16 22:08:29 +000080 kInstructionSunk,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000081 kNotInlinedUnresolvedEntrypoint,
82 kNotInlinedDexCache,
83 kNotInlinedStackMaps,
84 kNotInlinedEnvironmentBudget,
85 kNotInlinedInstructionBudget,
86 kNotInlinedLoopWithoutExit,
87 kNotInlinedIrreducibleLoop,
88 kNotInlinedAlwaysThrows,
89 kNotInlinedInfiniteLoop,
90 kNotInlinedTryCatch,
91 kNotInlinedRegisterAllocator,
92 kNotInlinedCannotBuild,
93 kNotInlinedNotVerified,
94 kNotInlinedCodeItem,
95 kNotInlinedWont,
96 kNotInlinedRecursiveBudget,
97 kNotInlinedProxy,
Igor Murashkin6ef45672017-08-08 13:59:55 -070098 kConstructorFenceGeneratedNew,
99 kConstructorFenceGeneratedFinal,
100 kConstructorFenceRemovedLSE,
101 kConstructorFenceRemovedPFRA,
Igor Murashkindd018df2017-08-09 10:38:31 -0700102 kConstructorFenceRemovedCFRE,
Vladimir Marko175e7862018-03-27 09:03:13 +0000103 kBitstringTypeCheck,
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000104 kJitOutOfMemoryForCommit,
Calin Juravle48c2b032014-12-09 18:11:36 +0000105 kLastStat
106};
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000107std::ostream& operator<<(std::ostream& os, const MethodCompilationStat& rhs);
Calin Juravle48c2b032014-12-09 18:11:36 +0000108
109class OptimizingCompilerStats {
110 public:
Vladimir Markoff754d12017-02-24 15:01:41 +0000111 OptimizingCompilerStats() {
112 // The std::atomic<> default constructor leaves values uninitialized, so initialize them now.
113 Reset();
114 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000115
Vladimir Marko438709f2017-02-23 18:56:13 +0000116 void RecordStat(MethodCompilationStat stat, uint32_t count = 1) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000117 size_t stat_index = static_cast<size_t>(stat);
118 DCHECK_LT(stat_index, arraysize(compile_stats_));
119 compile_stats_[stat_index] += count;
120 }
121
122 uint32_t GetStat(MethodCompilationStat stat) const {
123 size_t stat_index = static_cast<size_t>(stat);
124 DCHECK_LT(stat_index, arraysize(compile_stats_));
125 return compile_stats_[stat_index];
Calin Juravle48c2b032014-12-09 18:11:36 +0000126 }
127
128 void Log() const {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000129 uint32_t compiled_intrinsics = GetStat(MethodCompilationStat::kCompiledIntrinsic);
130 uint32_t compiled_native_stubs = GetStat(MethodCompilationStat::kCompiledNativeStub);
131 uint32_t bytecode_attempts =
132 GetStat(MethodCompilationStat::kAttemptBytecodeCompilation);
133 if (compiled_intrinsics == 0u && compiled_native_stubs == 0u && bytecode_attempts == 0u) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000134 LOG(INFO) << "Did not compile any method.";
135 } else {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000136 uint32_t compiled_bytecode_methods =
137 GetStat(MethodCompilationStat::kCompiledBytecode);
138 // Successful intrinsic compilation preempts other compilation attempts but failed intrinsic
139 // compilation shall still count towards bytecode or native stub compilation attempts.
140 uint32_t num_compilation_attempts =
141 compiled_intrinsics + compiled_native_stubs + bytecode_attempts;
142 uint32_t num_successful_compilations =
143 compiled_intrinsics + compiled_native_stubs + compiled_bytecode_methods;
144 float compiled_percent = num_successful_compilations * 100.0f / num_compilation_attempts;
145 LOG(INFO) << "Attempted compilation of "
146 << num_compilation_attempts << " methods: " << std::fixed << std::setprecision(2)
147 << compiled_percent << "% (" << num_successful_compilations << ") compiled.";
Nicolas Geoffray12be74e2015-03-30 13:29:08 +0100148
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000149 for (size_t i = 0; i < arraysize(compile_stats_); ++i) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000150 if (compile_stats_[i] != 0) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000151 LOG(INFO) << "OptStat#" << static_cast<MethodCompilationStat>(i) << ": "
Andreas Gampeda9badb2015-06-05 20:22:12 -0700152 << compile_stats_[i];
Calin Juravle48c2b032014-12-09 18:11:36 +0000153 }
154 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000155 }
156 }
157
Vladimir Marko438709f2017-02-23 18:56:13 +0000158 void AddTo(OptimizingCompilerStats* other_stats) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000159 for (size_t i = 0; i != arraysize(compile_stats_); ++i) {
Vladimir Marko438709f2017-02-23 18:56:13 +0000160 uint32_t count = compile_stats_[i];
161 if (count != 0) {
162 other_stats->RecordStat(static_cast<MethodCompilationStat>(i), count);
163 }
164 }
165 }
166
167 void Reset() {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000168 for (std::atomic<uint32_t>& stat : compile_stats_) {
169 stat = 0u;
Vladimir Marko438709f2017-02-23 18:56:13 +0000170 }
171 }
172
Calin Juravle48c2b032014-12-09 18:11:36 +0000173 private:
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000174 std::atomic<uint32_t> compile_stats_[static_cast<size_t>(MethodCompilationStat::kLastStat)];
Calin Juravle48c2b032014-12-09 18:11:36 +0000175
176 DISALLOW_COPY_AND_ASSIGN(OptimizingCompilerStats);
177};
178
Igor Murashkin1e065a52017-08-09 13:20:34 -0700179inline void MaybeRecordStat(OptimizingCompilerStats* compiler_stats,
180 MethodCompilationStat stat,
181 uint32_t count = 1) {
182 if (compiler_stats != nullptr) {
183 compiler_stats->RecordStat(stat, count);
184 }
185}
186
Calin Juravle48c2b032014-12-09 18:11:36 +0000187} // namespace art
188
189#endif // ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_