summaryrefslogtreecommitdiff
path: root/compiler/driver/compiler_driver.cc
diff options
context:
space:
mode:
author Andreas Gampe <agampe@google.com> 2018-04-23 09:59:25 -0700
committer Andreas Gampe <agampe@google.com> 2018-04-24 14:54:32 -0700
commitbb30d5d917a47d352c209473b3faf332736fa6ae (patch)
treeb22e5a8c8c6d6e6aa8581da9eef39b7d8a064153 /compiler/driver/compiler_driver.cc
parentb8f199705ebd673563fac5cd416a44794d07f692 (diff)
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
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r--compiler/driver/compiler_driver.cc6
1 files changed, 6 insertions, 0 deletions
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());
}