diff options
Diffstat (limited to 'compiler/optimizing/inliner.cc')
| -rw-r--r-- | compiler/optimizing/inliner.cc | 20 | 
1 files changed, 13 insertions, 7 deletions
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index 293282edbb..2e79df1b84 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -356,12 +356,12 @@ bool HInliner::TryInlineMonomorphicCall(HInvoke* invoke_instruction,        compare, invoke_instruction->GetDexPc());    // TODO: Extend reference type propagation to understand the guard.    if (cursor != nullptr) { -    bb_cursor->InsertInstructionAfter(load_class, cursor); +    bb_cursor->InsertInstructionAfter(field_get, cursor);    } else { -    bb_cursor->InsertInstructionBefore(load_class, bb_cursor->GetFirstInstruction()); +    bb_cursor->InsertInstructionBefore(field_get, bb_cursor->GetFirstInstruction());    } -  bb_cursor->InsertInstructionAfter(field_get, load_class); -  bb_cursor->InsertInstructionAfter(compare, field_get); +  bb_cursor->InsertInstructionAfter(load_class, field_get); +  bb_cursor->InsertInstructionAfter(compare, load_class);    bb_cursor->InsertInstructionAfter(deoptimize, compare);    deoptimize->CopyEnvironmentFrom(invoke_instruction->GetEnvironment()); @@ -419,7 +419,10 @@ bool HInliner::TryInline(HInvoke* invoke_instruction, ArtMethod* method, bool do    size_t inline_max_code_units = compiler_driver_->GetCompilerOptions().GetInlineMaxCodeUnits();    if (code_item->insns_size_in_code_units_ > inline_max_code_units) {      VLOG(compiler) << "Method " << PrettyMethod(method) -                   << " is too big to inline"; +                   << " is too big to inline: " +                   << code_item->insns_size_in_code_units_ +                   << " > " +                   << inline_max_code_units;      return false;    } @@ -639,9 +642,12 @@ bool HInliner::TryBuildAndInline(ArtMethod* resolved_method,    for (; !it.Done(); it.Advance()) {      HBasicBlock* block = it.Current(); -    if (block->IsLoopHeader()) { + +    if (block->IsLoopHeader() && block->GetLoopInformation()->IsIrreducible()) { +      // Don't inline methods with irreducible loops, they could prevent some +      // optimizations to run.        VLOG(compiler) << "Method " << PrettyMethod(method_index, callee_dex_file) -                     << " could not be inlined because it contains a loop"; +                     << " could not be inlined because it contains an irreducible loop";        return false;      }  |