summaryrefslogtreecommitdiff
path: root/compiler/optimizing/profiling_info_builder.cc
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2024-01-29 14:24:31 +0000
committer Nicolas Geoffray <ngeoffray@google.com> 2024-01-30 17:22:07 +0000
commit33e9f1a70d5f58639b524f40bf39a8e233c04ba8 (patch)
treef78d2949cac297400c0854ef57a4190f77d28e1b /compiler/optimizing/profiling_info_builder.cc
parent516020a3fbfe3db43f7faf0ac3daf5a45dbeeb6b (diff)
Reland^2 "Run optimizations with baseline compilation."
This reverts commit 3dccb13f4e92db37a13359e126c5ddc12cb674b5. Also includes the fix for incrementing hotness that got reverted: aosp/2906378 Bug: 313040662 Reduces jank on compose view scrolling for 4 iterations: - For Go Mokey: - Before: ~698 frames drawn / ~13.87% janky frames - After: ~937 frames drawn / ~5.52% janky frames - For Pixel 8 pro: - Before: ~2440 frames drawn / ~0.90% janky frames - After: ~2450 frames drawn / ~0.55% janky frames Reason for revert: Reduce inlining threshold for baseline. Change-Id: Iee5cd4c3ceb7715caf9299b56551aae6f0259769
Diffstat (limited to 'compiler/optimizing/profiling_info_builder.cc')
-rw-r--r--compiler/optimizing/profiling_info_builder.cc59
1 files changed, 54 insertions, 5 deletions
diff --git a/compiler/optimizing/profiling_info_builder.cc b/compiler/optimizing/profiling_info_builder.cc
index 7888753830..19795f5466 100644
--- a/compiler/optimizing/profiling_info_builder.cc
+++ b/compiler/optimizing/profiling_info_builder.cc
@@ -20,6 +20,7 @@
#include "code_generator.h"
#include "driver/compiler_options.h"
#include "dex/code_item_accessors-inl.h"
+#include "inliner.h"
#include "jit/profiling_info.h"
#include "optimizing_compiler_stats.h"
#include "scoped_thread_state_change-inl.h"
@@ -42,10 +43,53 @@ void ProfilingInfoBuilder::Run() {
ProfilingInfo::Create(soa.Self(), GetGraph()->GetArtMethod(), inline_caches_));
}
+
+uint32_t ProfilingInfoBuilder::EncodeInlinedDexPc(const HInliner* inliner,
+ const CompilerOptions& compiler_options,
+ HInvoke* invoke) {
+ DCHECK(inliner->GetCallerEnvironment() != nullptr);
+ DCHECK(inliner->GetParent() != nullptr);
+ std::vector<uint32_t> temp_vector;
+ temp_vector.push_back(invoke->GetDexPc());
+ while (inliner->GetCallerEnvironment() != nullptr) {
+ temp_vector.push_back(inliner->GetCallerEnvironment()->GetDexPc());
+ inliner = inliner->GetParent();
+ }
+
+ DCHECK_EQ(inliner->GetOutermostGraph(), inliner->GetGraph());
+ return InlineCache::EncodeDexPc(
+ inliner->GetOutermostGraph()->GetArtMethod(),
+ temp_vector,
+ compiler_options.GetInlineMaxCodeUnits());
+}
+
+static uint32_t EncodeDexPc(HInvoke* invoke, const CompilerOptions& compiler_options) {
+ std::vector<uint32_t> dex_pcs;
+ ArtMethod* outer_method = nullptr;
+ for (HEnvironment* environment = invoke->GetEnvironment();
+ environment != nullptr;
+ environment = environment->GetParent()) {
+ outer_method = environment->GetMethod();
+ dex_pcs.push_back(environment->GetDexPc());
+ }
+
+ ScopedObjectAccess soa(Thread::Current());
+ return InlineCache::EncodeDexPc(
+ outer_method,
+ dex_pcs,
+ compiler_options.GetInlineMaxCodeUnits());
+}
+
void ProfilingInfoBuilder::HandleInvoke(HInvoke* invoke) {
- DCHECK(!invoke->GetEnvironment()->IsFromInlinedInvoke());
if (IsInlineCacheUseful(invoke, codegen_)) {
- inline_caches_.push_back(invoke->GetDexPc());
+ uint32_t dex_pc = EncodeDexPc(invoke, compiler_options_);
+ if (dex_pc != kNoDexPc) {
+ inline_caches_.push_back(dex_pc);
+ } else {
+ ScopedObjectAccess soa(Thread::Current());
+ LOG(WARNING) << "Could not encode dex pc for "
+ << invoke->GetResolvedMethod()->PrettyMethod();
+ }
}
}
@@ -81,10 +125,15 @@ bool ProfilingInfoBuilder::IsInlineCacheUseful(HInvoke* invoke, CodeGenerator* c
return true;
}
-InlineCache* ProfilingInfoBuilder::GetInlineCache(ProfilingInfo* info, HInvoke* instruction) {
- DCHECK(!instruction->GetEnvironment()->IsFromInlinedInvoke());
+InlineCache* ProfilingInfoBuilder::GetInlineCache(ProfilingInfo* info,
+ const CompilerOptions& compiler_options,
+ HInvoke* instruction) {
ScopedObjectAccess soa(Thread::Current());
- return info->GetInlineCache(instruction->GetDexPc());
+ uint32_t dex_pc = EncodeDexPc(instruction, compiler_options);
+ if (dex_pc == kNoDexPc) {
+ return nullptr;
+ }
+ return info->GetInlineCache(dex_pc);
}
} // namespace art