Support inlining methods that may have soft verifier failures.

Test: 536-checker-needs-access-check
Test: 675-checker-unverified-method
Bug: 28313047
Change-Id: Ie532014a658935a20dbd0b6acebfda07c28c4af4
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc
index 1d9520d..664126a 100644
--- a/compiler/optimizing/inliner.cc
+++ b/compiler/optimizing/inliner.cc
@@ -46,6 +46,7 @@
 #include "ssa_builder.h"
 #include "ssa_phi_elimination.h"
 #include "thread.h"
+#include "verifier/verifier_compiler_binding.h"
 
 namespace art {
 
@@ -389,11 +390,21 @@
       return true;
     }
     uint16_t class_def_idx = method->GetDeclaringClass()->GetDexClassDefIndex();
+
+    const VerifiedMethod* verified_method =
+        compiler_options.GetVerifiedMethod(method->GetDexFile(), method->GetDexMethodIndex());
+    if (verified_method != nullptr && verified_method->HasRuntimeThrow()) {
+      // Compiler doesn't handle dead code as nicely as verifier.
+      return true;
+    }
     if (!compiler_options.IsMethodVerifiedWithoutFailures(method->GetDexMethodIndex(),
                                                           class_def_idx,
                                                           *method->GetDexFile())) {
-      // Method has soft or hard failures, don't analyze.
-      return true;
+      if (verified_method == nullptr ||
+          !verifier::CanCompilerHandleVerificationFailure(
+              verified_method->GetEncounteredVerificationFailures())) {
+       return true;
+      }
     }
   }
   return false;