blob: d458e426088d48330618b8bd53d6edabeba67ac2 [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"
Calin Juravle48c2b032014-12-09 18:11:36 +000029
Vladimir Marko0a516052019-10-14 13:00:44 +000030namespace art {
Calin Juravle48c2b032014-12-09 18:11:36 +000031
Vladimir Markocd09e1f2017-11-24 15:02:40 +000032enum class MethodCompilationStat {
33 kAttemptBytecodeCompilation = 0,
34 kAttemptIntrinsicCompilation,
35 kCompiledNativeStub,
36 kCompiledIntrinsic,
37 kCompiledBytecode,
Mingyao Yang063fc772016-08-02 11:02:54 -070038 kCHAInline,
Nicolas Geoffraye53798a2014-12-01 10:31:54 +000039 kInlinedInvoke,
Santiago Aboy Solanes15580482021-10-12 13:11:29 +010040 kInlinedLastInvoke,
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,
Nicolas Geoffray0846a8f2018-09-12 15:21:07 +010062 kNotCompiledIrreducibleLoopAndStringInit,
Nicolas Geoffray7cfc8f52019-08-07 10:41:09 +010063 kNotCompiledPhiEquivalentInOsr,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010064 kInlinedMonomorphicCall,
Nicolas Geoffraya42363f2015-12-17 14:57:09 +000065 kInlinedPolymorphicCall,
Nicolas Geoffray73be1e82015-09-17 15:22:56 +010066 kMonomorphicCall,
67 kPolymorphicCall,
68 kMegamorphicCall,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010069 kBooleanSimplified,
70 kIntrinsicRecognized,
71 kLoopInvariantMoved,
Aart Bik21b85922017-09-06 13:29:16 -070072 kLoopVectorized,
73 kLoopVectorizedIdiom,
Jean-Philippe Halimi38e9e802016-02-18 16:42:03 +010074 kSelectGenerated,
Calin Juravle69158982016-03-16 11:53:41 +000075 kRemovedInstanceOf,
76 kInlinedInvokeVirtualOrInterface,
Santiago Aboy Solanes15580482021-10-12 13:11:29 +010077 kInlinedLastInvokeVirtualOrInterface,
Calin Juravle2ae48182016-03-16 14:05:09 +000078 kImplicitNullCheckGenerated,
79 kExplicitNullCheckGenerated,
Nicolas Geoffraydac9b192016-07-15 10:46:17 +010080 kSimplifyIf,
Aart Bika8b8e9b2018-01-09 11:01:02 -080081 kSimplifyThrowingInvoke,
Nicolas Geoffrayb813ca12017-02-16 22:08:29 +000082 kInstructionSunk,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000083 kNotInlinedUnresolvedEntrypoint,
Santiago Aboy Solanese43aa3f2021-11-01 09:02:09 +000084 kNotInlinedBss,
Santiago Aboy Solanesfa73acc2021-11-12 14:23:27 +000085 kNotInlinedDexCacheInaccessibleToCaller,
86 kNotInlinedDexCacheClinitCheck,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000087 kNotInlinedStackMaps,
88 kNotInlinedEnvironmentBudget,
89 kNotInlinedInstructionBudget,
90 kNotInlinedLoopWithoutExit,
91 kNotInlinedIrreducibleLoop,
92 kNotInlinedAlwaysThrows,
93 kNotInlinedInfiniteLoop,
Santiago Aboy Solanesfa73acc2021-11-12 14:23:27 +000094 kNotInlinedTryCatchCaller,
95 kNotInlinedTryCatchCallee,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000096 kNotInlinedRegisterAllocator,
97 kNotInlinedCannotBuild,
Santiago Aboy Solanesfa73acc2021-11-12 14:23:27 +000098 kNotInlinedNotCompilable,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +000099 kNotInlinedNotVerified,
100 kNotInlinedCodeItem,
101 kNotInlinedWont,
102 kNotInlinedRecursiveBudget,
Santiago Aboy Solanes4f5b7cb2022-02-10 10:25:15 +0000103 kNotInlinedPolymorphicRecursiveBudget,
Nicolas Geoffrayf6d46682017-02-28 17:41:45 +0000104 kNotInlinedProxy,
Mathieu Chartier8284e9a2020-05-15 17:14:33 -0700105 kNotInlinedUnresolved,
106 kNotInlinedPolymorphic,
107 kNotInlinedCustom,
108 kTryInline,
Igor Murashkin6ef45672017-08-08 13:59:55 -0700109 kConstructorFenceGeneratedNew,
110 kConstructorFenceGeneratedFinal,
111 kConstructorFenceRemovedLSE,
112 kConstructorFenceRemovedPFRA,
Igor Murashkindd018df2017-08-09 10:38:31 -0700113 kConstructorFenceRemovedCFRE,
Vladimir Marko175e7862018-03-27 09:03:13 +0000114 kBitstringTypeCheck,
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000115 kJitOutOfMemoryForCommit,
Alex Light86fe9b82020-11-16 16:54:01 +0000116 kFullLSEAllocationRemoved,
117 kFullLSEPossible,
118 kNonPartialLoadRemoved,
119 kPartialLSEPossible,
120 kPartialStoreRemoved,
Alex Light3a73ffb2021-01-25 14:11:05 +0000121 kPartialAllocationMoved,
122 kPredicatedLoadAdded,
123 kPredicatedStoreAdded,
Nicolas Geoffraye1e0e0f2021-04-29 08:57:13 +0000124 kDevirtualized,
Calin Juravle48c2b032014-12-09 18:11:36 +0000125 kLastStat
126};
Vladimir Marko9974e3c2020-06-10 16:27:06 +0100127std::ostream& operator<<(std::ostream& os, MethodCompilationStat rhs);
Calin Juravle48c2b032014-12-09 18:11:36 +0000128
129class OptimizingCompilerStats {
130 public:
Vladimir Markoff754d12017-02-24 15:01:41 +0000131 OptimizingCompilerStats() {
132 // The std::atomic<> default constructor leaves values uninitialized, so initialize them now.
133 Reset();
134 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000135
Vladimir Marko438709f2017-02-23 18:56:13 +0000136 void RecordStat(MethodCompilationStat stat, uint32_t count = 1) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000137 size_t stat_index = static_cast<size_t>(stat);
138 DCHECK_LT(stat_index, arraysize(compile_stats_));
139 compile_stats_[stat_index] += count;
140 }
141
142 uint32_t GetStat(MethodCompilationStat stat) const {
143 size_t stat_index = static_cast<size_t>(stat);
144 DCHECK_LT(stat_index, arraysize(compile_stats_));
145 return compile_stats_[stat_index];
Calin Juravle48c2b032014-12-09 18:11:36 +0000146 }
147
148 void Log() const {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000149 uint32_t compiled_intrinsics = GetStat(MethodCompilationStat::kCompiledIntrinsic);
150 uint32_t compiled_native_stubs = GetStat(MethodCompilationStat::kCompiledNativeStub);
151 uint32_t bytecode_attempts =
152 GetStat(MethodCompilationStat::kAttemptBytecodeCompilation);
153 if (compiled_intrinsics == 0u && compiled_native_stubs == 0u && bytecode_attempts == 0u) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000154 LOG(INFO) << "Did not compile any method.";
155 } else {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000156 uint32_t compiled_bytecode_methods =
157 GetStat(MethodCompilationStat::kCompiledBytecode);
158 // Successful intrinsic compilation preempts other compilation attempts but failed intrinsic
159 // compilation shall still count towards bytecode or native stub compilation attempts.
160 uint32_t num_compilation_attempts =
161 compiled_intrinsics + compiled_native_stubs + bytecode_attempts;
162 uint32_t num_successful_compilations =
163 compiled_intrinsics + compiled_native_stubs + compiled_bytecode_methods;
164 float compiled_percent = num_successful_compilations * 100.0f / num_compilation_attempts;
165 LOG(INFO) << "Attempted compilation of "
166 << num_compilation_attempts << " methods: " << std::fixed << std::setprecision(2)
167 << compiled_percent << "% (" << num_successful_compilations << ") compiled.";
Nicolas Geoffray12be74e2015-03-30 13:29:08 +0100168
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000169 for (size_t i = 0; i < arraysize(compile_stats_); ++i) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000170 if (compile_stats_[i] != 0) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000171 LOG(INFO) << "OptStat#" << static_cast<MethodCompilationStat>(i) << ": "
Andreas Gampeda9badb2015-06-05 20:22:12 -0700172 << compile_stats_[i];
Calin Juravle48c2b032014-12-09 18:11:36 +0000173 }
174 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000175 }
176 }
177
Vladimir Marko438709f2017-02-23 18:56:13 +0000178 void AddTo(OptimizingCompilerStats* other_stats) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000179 for (size_t i = 0; i != arraysize(compile_stats_); ++i) {
Vladimir Marko438709f2017-02-23 18:56:13 +0000180 uint32_t count = compile_stats_[i];
181 if (count != 0) {
182 other_stats->RecordStat(static_cast<MethodCompilationStat>(i), count);
183 }
184 }
185 }
186
187 void Reset() {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000188 for (std::atomic<uint32_t>& stat : compile_stats_) {
189 stat = 0u;
Vladimir Marko438709f2017-02-23 18:56:13 +0000190 }
191 }
192
Calin Juravle48c2b032014-12-09 18:11:36 +0000193 private:
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000194 std::atomic<uint32_t> compile_stats_[static_cast<size_t>(MethodCompilationStat::kLastStat)];
Calin Juravle48c2b032014-12-09 18:11:36 +0000195
196 DISALLOW_COPY_AND_ASSIGN(OptimizingCompilerStats);
197};
198
Igor Murashkin1e065a52017-08-09 13:20:34 -0700199inline void MaybeRecordStat(OptimizingCompilerStats* compiler_stats,
200 MethodCompilationStat stat,
201 uint32_t count = 1) {
202 if (compiler_stats != nullptr) {
203 compiler_stats->RecordStat(stat, count);
204 }
205}
206
Calin Juravle48c2b032014-12-09 18:11:36 +0000207} // namespace art
208
209#endif // ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_