diff options
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/inliner.cc | 5 | ||||
| -rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 13 |
2 files changed, 8 insertions, 10 deletions
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index 836bcfa4c1..ff4b9a765c 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -795,6 +795,11 @@ bool HInliner::TryBuildAndInline(HInvoke* invoke_instruction, return false; } + if (!method->IsCompilable()) { + VLOG(compiler) << "Method " << PrettyMethod(method) + << " has soft failures un-handled by the compiler, so it cannot be inlined"; + } + if (!method->GetDeclaringClass()->IsVerified()) { uint16_t class_def_idx = method->GetDeclaringClass()->GetDexClassDefIndex(); if (Runtime::Current()->UseJit() || diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index 3670ce2253..37197af460 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -769,15 +769,6 @@ CodeGenerator* OptimizingCompiler::TryCompile(ArenaAllocator* arena, return codegen.release(); } -static bool CanHandleVerificationFailure(const VerifiedMethod* verified_method) { - // For access errors the compiler will use the unresolved helpers (e.g. HInvokeUnresolved). - uint32_t unresolved_mask = verifier::VerifyError::VERIFY_ERROR_NO_CLASS - | verifier::VerifyError::VERIFY_ERROR_ACCESS_CLASS - | verifier::VerifyError::VERIFY_ERROR_ACCESS_FIELD - | verifier::VerifyError::VERIFY_ERROR_ACCESS_METHOD; - return (verified_method->GetEncounteredVerificationFailures() & (~unresolved_mask)) == 0; -} - CompiledMethod* OptimizingCompiler::Compile(const DexFile::CodeItem* code_item, uint32_t access_flags, InvokeType invoke_type, @@ -792,7 +783,8 @@ CompiledMethod* OptimizingCompiler::Compile(const DexFile::CodeItem* code_item, const VerifiedMethod* verified_method = compiler_driver->GetVerifiedMethod(&dex_file, method_idx); DCHECK(!verified_method->HasRuntimeThrow()); if (compiler_driver->IsMethodVerifiedWithoutFailures(method_idx, class_def_idx, dex_file) - || CanHandleVerificationFailure(verified_method)) { + || verifier::MethodVerifier::CanCompilerHandleVerificationFailure( + verified_method->GetEncounteredVerificationFailures())) { ArenaAllocator arena(Runtime::Current()->GetArenaPool()); CodeVectorAllocator code_allocator(&arena); std::unique_ptr<CodeGenerator> codegen( @@ -865,6 +857,7 @@ bool OptimizingCompiler::JitCompile(Thread* self, Handle<mirror::ClassLoader> class_loader(hs.NewHandle( method->GetDeclaringClass()->GetClassLoader())); Handle<mirror::DexCache> dex_cache(hs.NewHandle(method->GetDexCache())); + DCHECK(method->IsCompilable()); jobject jclass_loader = class_loader.ToJObject(); const DexFile* dex_file = method->GetDexFile(); |