From 718e8319c728e9ee2ec15b1d56ca96baa4393028 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Mon, 22 Jan 2018 16:32:29 +0000 Subject: ART: Use the bitstring type check for AOT app compilation. For boot image target classes that have their bitstring already assigned in the boot image. The size of the services.odex for aosp_taimen-userdebug: - before: - arm64: 20988640 - after: - arm64: 20968016 (-20KiB, -0.1%) (There is no arm version, only arm64.) Test: New test case in 552-checker-sharpening. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: Pixel 2 XL boots. Test: testrunner.py --target --optimizing Bug: 64692057 Change-Id: I9585efca8ba0df15400e7536e5e2cc76aca13e8d --- compiler/driver/compiler_driver.cc | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'compiler/driver/compiler_driver.cc') diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 70cbb01569..273bd50b9e 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -872,6 +872,14 @@ void CompilerDriver::PreCompile(jobject class_loader, TimingLogger* timings) { CheckThreadPools(); + if (kUseBitstringTypeCheck && + !compiler_options_->IsBootImage() && + compiler_options_->IsAotCompilationEnabled()) { + RecordBootImageClassesWithAssignedBitstring(); + VLOG(compiler) << "RecordBootImageClassesWithAssignedBitstring: " + << GetMemoryUsageString(false); + } + LoadImageClasses(timings); VLOG(compiler) << "LoadImageClasses: " << GetMemoryUsageString(false); @@ -940,6 +948,43 @@ void CompilerDriver::PreCompile(jobject class_loader, } } +void CompilerDriver::RecordBootImageClassesWithAssignedBitstring() { + if (boot_image_classes_with_assigned_bitstring_ != nullptr) { + return; // Already recorded. (Happens because of class unloading between dex files.) + } + + class Visitor : public ClassVisitor { + public: + explicit Visitor(std::unordered_set* recorded_classes) + : recorded_classes_(recorded_classes) {} + + bool operator()(ObjPtr klass) OVERRIDE + REQUIRES(Locks::subtype_check_lock_) REQUIRES_SHARED(Locks::mutator_lock_) { + DCHECK(klass != nullptr); + SubtypeCheckInfo::State state = SubtypeCheck>::GetState(klass); + if (state == SubtypeCheckInfo::kAssigned) { + recorded_classes_->insert(klass.Ptr()); + } + return true; + } + + private: + std::unordered_set* const recorded_classes_; + }; + + boot_image_classes_with_assigned_bitstring_.reset(new std::unordered_set()); + Visitor visitor(boot_image_classes_with_assigned_bitstring_.get()); + ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); + ScopedObjectAccess soa(Thread::Current()); + MutexLock subtype_check_lock(soa.Self(), *Locks::subtype_check_lock_); + class_linker->VisitClasses(&visitor); +} + +bool CompilerDriver::IsBootImageClassWithAssignedBitstring(ObjPtr klass) { + DCHECK(boot_image_classes_with_assigned_bitstring_ != nullptr); + return boot_image_classes_with_assigned_bitstring_->count(klass.Ptr()) != 0u; +} + bool CompilerDriver::IsImageClass(const char* descriptor) const { if (image_classes_ != nullptr) { // If we have a set of image classes, use those. -- cgit v1.2.3-59-g8ed1b