blob: 58d65bb97dbe6179e08a4ec17334f121e27b0d40 [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,
84 kNotInlinedDexCache,
85 kNotInlinedStackMaps,
86 kNotInlinedEnvironmentBudget,
87 kNotInlinedInstructionBudget,
88 kNotInlinedLoopWithoutExit,
89 kNotInlinedIrreducibleLoop,
90 kNotInlinedAlwaysThrows,
91 kNotInlinedInfiniteLoop,
92 kNotInlinedTryCatch,
93 kNotInlinedRegisterAllocator,
94 kNotInlinedCannotBuild,
95 kNotInlinedNotVerified,
96 kNotInlinedCodeItem,
97 kNotInlinedWont,
98 kNotInlinedRecursiveBudget,
99 kNotInlinedProxy,
Mathieu Chartier8284e9a2020-05-15 17:14:33 -0700100 kNotInlinedUnresolved,
101 kNotInlinedPolymorphic,
102 kNotInlinedCustom,
103 kTryInline,
Igor Murashkin6ef45672017-08-08 13:59:55 -0700104 kConstructorFenceGeneratedNew,
105 kConstructorFenceGeneratedFinal,
106 kConstructorFenceRemovedLSE,
107 kConstructorFenceRemovedPFRA,
Igor Murashkindd018df2017-08-09 10:38:31 -0700108 kConstructorFenceRemovedCFRE,
Vladimir Marko175e7862018-03-27 09:03:13 +0000109 kBitstringTypeCheck,
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000110 kJitOutOfMemoryForCommit,
Alex Light86fe9b82020-11-16 16:54:01 +0000111 kFullLSEAllocationRemoved,
112 kFullLSEPossible,
113 kNonPartialLoadRemoved,
114 kPartialLSEPossible,
115 kPartialStoreRemoved,
Alex Light3a73ffb2021-01-25 14:11:05 +0000116 kPartialAllocationMoved,
117 kPredicatedLoadAdded,
118 kPredicatedStoreAdded,
Nicolas Geoffraye1e0e0f2021-04-29 08:57:13 +0000119 kDevirtualized,
Calin Juravle48c2b032014-12-09 18:11:36 +0000120 kLastStat
121};
Vladimir Marko9974e3c2020-06-10 16:27:06 +0100122std::ostream& operator<<(std::ostream& os, MethodCompilationStat rhs);
Calin Juravle48c2b032014-12-09 18:11:36 +0000123
124class OptimizingCompilerStats {
125 public:
Vladimir Markoff754d12017-02-24 15:01:41 +0000126 OptimizingCompilerStats() {
127 // The std::atomic<> default constructor leaves values uninitialized, so initialize them now.
128 Reset();
129 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000130
Vladimir Marko438709f2017-02-23 18:56:13 +0000131 void RecordStat(MethodCompilationStat stat, uint32_t count = 1) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000132 size_t stat_index = static_cast<size_t>(stat);
133 DCHECK_LT(stat_index, arraysize(compile_stats_));
134 compile_stats_[stat_index] += count;
135 }
136
137 uint32_t GetStat(MethodCompilationStat stat) const {
138 size_t stat_index = static_cast<size_t>(stat);
139 DCHECK_LT(stat_index, arraysize(compile_stats_));
140 return compile_stats_[stat_index];
Calin Juravle48c2b032014-12-09 18:11:36 +0000141 }
142
143 void Log() const {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000144 uint32_t compiled_intrinsics = GetStat(MethodCompilationStat::kCompiledIntrinsic);
145 uint32_t compiled_native_stubs = GetStat(MethodCompilationStat::kCompiledNativeStub);
146 uint32_t bytecode_attempts =
147 GetStat(MethodCompilationStat::kAttemptBytecodeCompilation);
148 if (compiled_intrinsics == 0u && compiled_native_stubs == 0u && bytecode_attempts == 0u) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000149 LOG(INFO) << "Did not compile any method.";
150 } else {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000151 uint32_t compiled_bytecode_methods =
152 GetStat(MethodCompilationStat::kCompiledBytecode);
153 // Successful intrinsic compilation preempts other compilation attempts but failed intrinsic
154 // compilation shall still count towards bytecode or native stub compilation attempts.
155 uint32_t num_compilation_attempts =
156 compiled_intrinsics + compiled_native_stubs + bytecode_attempts;
157 uint32_t num_successful_compilations =
158 compiled_intrinsics + compiled_native_stubs + compiled_bytecode_methods;
159 float compiled_percent = num_successful_compilations * 100.0f / num_compilation_attempts;
160 LOG(INFO) << "Attempted compilation of "
161 << num_compilation_attempts << " methods: " << std::fixed << std::setprecision(2)
162 << compiled_percent << "% (" << num_successful_compilations << ") compiled.";
Nicolas Geoffray12be74e2015-03-30 13:29:08 +0100163
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000164 for (size_t i = 0; i < arraysize(compile_stats_); ++i) {
Calin Juravle48c2b032014-12-09 18:11:36 +0000165 if (compile_stats_[i] != 0) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000166 LOG(INFO) << "OptStat#" << static_cast<MethodCompilationStat>(i) << ": "
Andreas Gampeda9badb2015-06-05 20:22:12 -0700167 << compile_stats_[i];
Calin Juravle48c2b032014-12-09 18:11:36 +0000168 }
169 }
Calin Juravle48c2b032014-12-09 18:11:36 +0000170 }
171 }
172
Vladimir Marko438709f2017-02-23 18:56:13 +0000173 void AddTo(OptimizingCompilerStats* other_stats) {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000174 for (size_t i = 0; i != arraysize(compile_stats_); ++i) {
Vladimir Marko438709f2017-02-23 18:56:13 +0000175 uint32_t count = compile_stats_[i];
176 if (count != 0) {
177 other_stats->RecordStat(static_cast<MethodCompilationStat>(i), count);
178 }
179 }
180 }
181
182 void Reset() {
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000183 for (std::atomic<uint32_t>& stat : compile_stats_) {
184 stat = 0u;
Vladimir Marko438709f2017-02-23 18:56:13 +0000185 }
186 }
187
Calin Juravle48c2b032014-12-09 18:11:36 +0000188 private:
Vladimir Markocd09e1f2017-11-24 15:02:40 +0000189 std::atomic<uint32_t> compile_stats_[static_cast<size_t>(MethodCompilationStat::kLastStat)];
Calin Juravle48c2b032014-12-09 18:11:36 +0000190
191 DISALLOW_COPY_AND_ASSIGN(OptimizingCompilerStats);
192};
193
Igor Murashkin1e065a52017-08-09 13:20:34 -0700194inline void MaybeRecordStat(OptimizingCompilerStats* compiler_stats,
195 MethodCompilationStat stat,
196 uint32_t count = 1) {
197 if (compiler_stats != nullptr) {
198 compiler_stats->RecordStat(stat, count);
199 }
200}
201
Calin Juravle48c2b032014-12-09 18:11:36 +0000202} // namespace art
203
204#endif // ART_COMPILER_OPTIMIZING_OPTIMIZING_COMPILER_STATS_H_