From bb30d5d917a47d352c209473b3faf332736fa6ae Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Mon, 23 Apr 2018 09:59:25 -0700 Subject: ART: Skip duplicate classes during compilation If a class doesn't resolve to the current dex file, processing can be skipped. It must have been handled before. For a large test app, compiling with -j1, compile phase only: Before After Quicken 14.270 13.541 Speed 156.621 153.591 Bug: 78201536 Test: m test-art-host Change-Id: Ia5df3f7f6da2be114a5e9051c18d5716a5f48515 --- compiler/driver/compiler_driver.cc | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'compiler/driver/compiler_driver.cc') diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 41b7e7be47..723c619b3e 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -2160,6 +2160,9 @@ class VerifyClassVisitor : public CompilationVisitor { DCHECK(failure_kind == verifier::FailureKind::kNoFailure) << failure_kind; failure_kind = verifier::FailureKind::kSoftFailure; } + } else if (&klass->GetDexFile() != &dex_file) { + // Skip a duplicate class (as the resolved class is from another, earlier dex file). + return; // Do not update state. } else if (!SkipClass(jclass_loader, dex_file, klass.Get())) { CHECK(klass->IsResolved()) << klass->PrettyClass(); failure_kind = class_linker->VerifyClass(soa.Self(), klass, log_level_); @@ -2804,6 +2807,9 @@ static void CompileDexFile(CompilerDriver* driver, dex_cache = hs.NewHandle(class_linker->FindDexCache(soa.Self(), dex_file)); } else if (SkipClass(jclass_loader, dex_file, klass.Get())) { return; + } else if (&klass->GetDexFile() != &dex_file) { + // Skip a duplicate class (as the resolved class is from another, earlier dex file). + return; // Do not update state. } else { dex_cache = hs.NewHandle(klass->GetDexCache()); } -- cgit v1.2.3-59-g8ed1b