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;