From 22752770e5e7dd9fb30bb35373b61e76b40ae5c3 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Thu, 18 Oct 2018 14:18:59 -0700 Subject: Resolve const-string of clinit Resolve the const strings of the clinit for classes that are loaded in the profile. For Maps, the number of strings is ~4400. This would take ~100k RAM if each string is around 20 characters. Note that these strings are mostly already loaded during startup, so there might not be a net RAM usage increase. Test: test-art-host Bug: 117621117 Change-Id: I632a91633c1b3757523ef6e655f192305554499b --- compiler/driver/compiler_driver.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'compiler/driver/compiler_driver.cc') diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 89ac308fed..7690e233a7 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -715,6 +715,7 @@ void CompilerDriver::ResolveConstStrings(const std::vector& dex_ StackHandleScope<1> hs(soa.Self()); ClassLinker* const class_linker = Runtime::Current()->GetClassLinker(); MutableHandle dex_cache(hs.NewHandle(nullptr)); + size_t num_instructions = 0u; for (const DexFile* dex_file : dex_files) { dex_cache.Assign(class_linker->FindDexCache(soa.Self(), *dex_file)); @@ -726,10 +727,20 @@ void CompilerDriver::ResolveConstStrings(const std::vector& dex_ // FIXME: Make sure that inlining honors this. b/26687569 continue; } + + const bool is_startup_class = + profile_compilation_info_ != nullptr && + profile_compilation_info_->ContainsClass(*dex_file, accessor.GetClassIdx()); + for (const ClassAccessor::Method& method : accessor.GetMethods()) { + const bool is_clinit = (method.GetAccessFlags() & kAccConstructor) != 0 && + (method.GetAccessFlags() & kAccStatic) != 0; + const bool is_startup_clinit = is_startup_class && is_clinit; + if (only_startup_strings && profile_compilation_info_ != nullptr && - !profile_compilation_info_->GetMethodHotness(method.GetReference()).IsStartup()) { + (!profile_compilation_info_->GetMethodHotness(method.GetReference()).IsStartup() && + !is_startup_clinit)) { continue; } @@ -746,6 +757,7 @@ void CompilerDriver::ResolveConstStrings(const std::vector& dex_ : inst->VRegB_31c()); ObjPtr string = class_linker->ResolveString(string_index, dex_cache); CHECK(string != nullptr) << "Could not allocate a string when forcing determinism"; + ++num_instructions; break; } @@ -756,6 +768,7 @@ void CompilerDriver::ResolveConstStrings(const std::vector& dex_ } } } + VLOG(compiler) << "Resolved " << num_instructions << " const string instructions"; } // Initialize type check bit strings for check-cast and instance-of in the code. Done to have -- cgit v1.2.3-59-g8ed1b