blob: 6a69a336cac73492b665db29a494f9aa9f416158 [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
Andreas Gampe85f1c572018-11-21 13:52:48 -080025#include <android-base/logging.h>
26
David Sehrc431b9d2018-03-02 12:01:51 -080027#include "base/atomic.h"
28#include "base/globals.h"
Vladimir Markoe2727152019-10-10 10:46:42 +010029#include "base/macros.h"
Calin Juravle48c2b032014-12-09 18:11:36 +000030
Vladimir Markoe2727152019-10-10 10:46:42 +010031namespace art HIDDEN {
Calin Juravle48c2b032014-12-09 18:11:36 +000032
Vladimir Markocd09e1f2017-11-24 15:02:40 +000033enum class MethodCompilationStat {
34 kAttemptBytecodeCompilation = 0,
35 kAttemptIntrinsicCompilation,
36 kCompiledNativeStub,
37 kCompiledIntrinsic,
38 kCompiledBytecode,
Mingyao Yang063fc772016-08-02 11:02:54 -070039 kCHAInline,
Nicolas Geoffraye53798a2014-12-01 10:31:54 +000040 kInlinedInvoke,
Vladimir Markobe10e8e2016-01-22 12:09:44 +000041 kReplacedInvokeWithSimplePattern,
Calin Juravle702d2602015-04-30 19:28:21 +010042 kInstructionSimplifications,
Alexandre Rames44b9cf92015-08-19 15:39:06 +010043 kInstructionSimplificationsArch,
Calin Juravle175dc732015-08-25 15:42:32 +010044 kUnresolvedMethod,
Calin Juravlee460d1d2015-09-29 04:52:17 +010045 kUnresolvedField,
Calin Juravle07380a22015-09-17 14:15:12 +010046 kUnresolvedFieldNotAFastAccess,
Calin Juravlead543382015-11-19 17:26:29 +000047 kRemovedCheckedCast,
48 kRemovedDeadInstruction,
49 kRemovedNullCheck,
David Brazdil86ea7ee2016-02-16 09:26:07 +000050 kNotCompiledSkipped,
51 kNotCompiledInvalidBytecode,
David Brazdil4833f5a2015-12-16 10:37:39 +000052 kNotCompiledThrowCatchLoop,
David Brazdil15693bf2015-12-16 10:30:45 +000053 kNotCompiledAmbiguousArrayOp,
Calin Juravle48c2b032014-12-09 18:11:36 +000054 kNotCompiledHugeMethod,
55 kNotCompiledLargeMethodNoBranches,
Nicolas Geoffray2e335252015-06-18 11:11:27 +010056 kNotCompiledMalformedOpcode,
Calin Juravle48c2b032014-12-09 18:11:36 +000057 kNotCompiledNoCodegen,
Calin Juravle702d2602015-04-30 19:28:21 +010058 kNotCompiledPathological,
Nicolas Geoffray36540cb2015-03-23 14:45:53 +000059 kNotCompiledSpaceFilter,
Calin Juravle48c2b032014-12-09 18:11:36 +000060 kNotCompiledUnhandledInstruction,
Calin Juravle702d2602015-04-30 19:28:21 +010061 kNotCompiledUnsupportedIsa,
Calin Juravlead543382015-11-19 17:26:29 +000062 kNotCompiledVerificationError,
Calin Juravlef1c6d9e2015-04-13 18:42:21 +010063 kNotCompiledVerifyAtRuntime,
Nicolas Geoffray0846a8f2018-09-12 15:21:07 +010064 kNotCompiledIrreducibleLoopAndStringInit,
Nicolas Geoffray7cfc8f52019-08-07 10:41:09 +010065 kNotCompiledPhiEquivalentInOsr,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010066 kInlinedMonomorphicCall,
Nicolas Geoffraya42363f2015-12-17 14:57:09 +000067 kInlinedPolymorphicCall,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010068 kMonomorphicCall,
69 kPolymorphicCall,
70 kMegamorphicCall,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010071 kBooleanSimplified,
72 kIntrinsicRecognized,
73 kLoopInvariantMoved,
Aart Bik21b85922017-09-06 13:29:16 -070074 kLoopVectorized,
75 kLoopVectorizedIdiom,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010076 kSelectGenerated,
Calin Juravle69158982016-03-16 11:53:41 +000077 kRemovedInstanceOf,
78 kInlinedInvokeVirtualOrInterface,
Calin Juravle2ae48182016-03-16 14:05:09 +000079 kImplicitNullCheckGenerated,
80 kExplicitNullCheckGenerated,
Nicolas Geoffraydac9b192016-07-15 10:46:17 +010081 kSimplifyIf,
Aart Bika8b8e9b2018-01-09 11:01:02 -080082 kSimplifyThrowingInvoke,
Nicolas Geoffrayb813ca12017-02-16 22:08:29 +000083 kInstructionSunk,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000084 kNotInlinedUnresolvedEntrypoint,
85 kNotInlinedDexCache,
86 kNotInlinedStackMaps,
87 kNotInlinedEnvironmentBudget,
88 kNotInlinedInstructionBudget,
89 kNotInlinedLoopWithoutExit,
90 kNotInlinedIrreducibleLoop,
91 kNotInlinedAlwaysThrows,
92 kNotInlinedInfiniteLoop,
93 kNotInlinedTryCatch,
94 kNotInlinedRegisterAllocator,
95 kNotInlinedCannotBuild,
96 kNotInlinedNotVerified,
97 kNotInlinedCodeItem,
98 kNotInlinedWont,
99 kNotInlinedRecursiveBudget,
100 kNotInlinedProxy,
Igor Murashkin6ef45672017-08-08 13:59:55 -0700101 kConstructorFenceGeneratedNew,
102 kConstructorFenceGeneratedFinal,
103 kConstructorFenceRemovedLSE,
104 kConstructorFenceRemovedPFRA,
Igor Murashkindd018df2017-08-09 10:38:31 -0700105 kConstructorFenceRemovedCFRE,
Vladimir Marko175e7862018-03-27 09:03:13 +0000106 kBitstringTypeCheck,
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000107 kJitOutOfMemoryForCommit,
Calin Juravle48c2b032014-12-09 18:11:36 +0000108 kLastStat
109};
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000110std::ostream& operator<<(std::ostream& os, const MethodCompilationStat& rhs);
Calin Juravle48c2b032014-12-09 18:11:36 +0000111
112class OptimizingCompilerStats {
113 public:
Vladimir Markoff754d12017-02-24 15:01:41 +0000114 OptimizingCompilerStats() {
115 // The std::atomic<> default constructor leaves values uninitialized, so initialize them now.
116 Reset();
117 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000118
Vladimir Marko438709f2017-02-23 18:56:13 +0000119 void RecordStat(MethodCompilationStat stat, uint32_t count = 1) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000120 size_t stat_index = static_cast<size_t>(stat);
121 DCHECK_LT(stat_index, arraysize(compile_stats_));
122 compile_stats_[stat_index] += count;
123 }
124
125 uint32_t GetStat(MethodCompilationStat stat) const {
126 size_t stat_index = static_cast<size_t>(stat);
127 DCHECK_LT(stat_index, arraysize(compile_stats_));
128 return compile_stats_[stat_index];
Calin Juravle48c2b032014-12-09 18:11:36 +0000129 }
130
131 void Log() const {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000132 uint32_t compiled_intrinsics = GetStat(MethodCompilationStat::kCompiledIntrinsic);
133 uint32_t compiled_native_stubs = GetStat(MethodCompilationStat::kCompiledNativeStub);
134 uint32_t bytecode_attempts =
135 GetStat(MethodCompilationStat::kAttemptBytecodeCompilation);
136 if (compiled_intrinsics == 0u && compiled_native_stubs == 0u && bytecode_attempts == 0u) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000137 LOG(INFO) << "Did not compile any method.";
138 } else {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000139 uint32_t compiled_bytecode_methods =
140 GetStat(MethodCompilationStat::kCompiledBytecode);
141 // Successful intrinsic compilation preempts other compilation attempts but failed intrinsic
142 // compilation shall still count towards bytecode or native stub compilation attempts.
143 uint32_t num_compilation_attempts =
144 compiled_intrinsics + compiled_native_stubs + bytecode_attempts;
145 uint32_t num_successful_compilations =
146 compiled_intrinsics + compiled_native_stubs + compiled_bytecode_methods;
147 float compiled_percent = num_successful_compilations * 100.0f / num_compilation_attempts;
148 LOG(INFO) << "Attempted compilation of "
149 << num_compilation_attempts << " methods: " << std::fixed << std::setprecision(2)
150 << compiled_percent << "% (" << num_successful_compilations << ") compiled.";
Nicolas Geoffray12be74e2015-03-30 13:29:08 +0100151
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000152 for (size_t i = 0; i < arraysize(compile_stats_); ++i) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000153 if (compile_stats_[i] != 0) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000154 LOG(INFO) << "OptStat#" << static_cast<MethodCompilationStat>(i) << ": "
Andreas Gampeda9badb2015-06-05 20:22:12 -0700155 << compile_stats_[i];
Calin Juravle48c2b032014-12-09 18:11:36 +0000156 }
157 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000158 }
159 }
160
Vladimir Marko438709f2017-02-23 18:56:13 +0000161 void AddTo(OptimizingCompilerStats* other_stats) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000162 for (size_t i = 0; i != arraysize(compile_stats_); ++i) {
Vladimir Marko438709f2017-02-23 18:56:13 +0000163 uint32_t count = compile_stats_[i];
164 if (count != 0) {
165 other_stats->RecordStat(static_cast<MethodCompilationStat>(i), count);
166 }
167 }
168 }
169
170 void Reset() {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000171 for (std::atomic<uint32_t>& stat : compile_stats_) {
172 stat = 0u;
Vladimir Marko438709f2017-02-23 18:56:13 +0000173 }
174 }
175
Calin Juravle48c2b032014-12-09 18:11:36 +0000176 private:
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000177 std::atomic<uint32_t> compile_stats_[static_cast<size_t>(MethodCompilationStat::kLastStat)];
Calin Juravle48c2b032014-12-09 18:11:36 +0000178
179 DISALLOW_COPY_AND_ASSIGN(OptimizingCompilerStats);
180};
181
Igor Murashkin1e065a52017-08-09 13:20:34 -0700182inline void MaybeRecordStat(OptimizingCompilerStats* compiler_stats,
183 MethodCompilationStat stat,
184 uint32_t count = 1) {
185 if (compiler_stats != nullptr) {
186 compiler_stats->RecordStat(stat, count);
187 }
188}
189
Calin Juravle48c2b032014-12-09 18:11:36 +0000190} // namespace art
191
192#endif // ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_