diff options
author | 2024-01-29 14:24:31 +0000 | |
---|---|---|
committer | 2024-01-30 17:22:07 +0000 | |
commit | 33e9f1a70d5f58639b524f40bf39a8e233c04ba8 (patch) | |
tree | f78d2949cac297400c0854ef57a4190f77d28e1b /compiler/optimizing/profiling_info_builder.cc | |
parent | 516020a3fbfe3db43f7faf0ac3daf5a45dbeeb6b (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.cc | 59 |
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 |