Remove unintended soft failure downgrade.

When the supertype is not verified, we don't need to downgrade
the verification failure kind to soft failure. We can keep the
current failure kind and mark that the class will be verified
at runtime: this will allow doing fast verification (ie, with
type checks only), and supertype verification at runtime.

Test: test.py
Bug: 2831304
Change-Id: I58d1af1e60246550a72b577fa6f33af9ff8e8c89
diff --git a/dex2oat/driver/compiler_driver.cc b/dex2oat/driver/compiler_driver.cc
index 6939b0c..d69afcb 100644
--- a/dex2oat/driver/compiler_driver.cc
+++ b/dex2oat/driver/compiler_driver.cc
@@ -1911,8 +1911,11 @@
         } else if (klass->IsVerifiedNeedsAccessChecks()) {
           DCHECK_EQ(failure_kind, verifier::FailureKind::kAccessChecksFailure);
         } else if (klass->ShouldVerifyAtRuntime()) {
-          DCHECK(failure_kind == verifier::FailureKind::kSoftFailure ||
-                 failure_kind == verifier::FailureKind::kTypeChecksFailure);
+          DCHECK_NE(failure_kind, verifier::FailureKind::kHardFailure);
+          // This could either be due to:
+          // - kTypeChecksFailure, or
+          // - kSoftFailure, or
+          // - the superclass or interfaces not being verified.
         } else {
           DCHECK_EQ(failure_kind, verifier::FailureKind::kHardFailure);
         }
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 5410bb0..d2f14e4 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -223,7 +223,7 @@
     REQUIRES_SHARED(Locks::mutator_lock_) {
   Runtime* runtime = Runtime::Current();
   ClassLinker* class_linker = runtime->GetClassLinker();
-  if (failure_kind == verifier::FailureKind::kNoFailure) {
+  if (klass->IsVerified() && (failure_kind == verifier::FailureKind::kNoFailure)) {
     klass->SetSkipAccessChecksFlagOnAllMethods(pointer_size);
   }
 
@@ -4720,7 +4720,6 @@
       // Regardless of our own verification result, we need to verify the class
       // at runtime if the super class is not verified. This is required in case
       // we generate an app/boot image.
-      verifier_failure = verifier::FailureKind::kSoftFailure;
       mirror::Class::SetStatus(klass, ClassStatus::kRetryVerificationAtRuntime, self);
     } else if (verifier_failure == verifier::FailureKind::kNoFailure) {
       mirror::Class::SetStatus(klass, ClassStatus::kVerified, self);