diff options
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/builder.cc | 14 | ||||
| -rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 12 | ||||
| -rw-r--r-- | compiler/optimizing/inliner.cc | 4 | ||||
| -rw-r--r-- | compiler/optimizing/instruction_simplifier.cc | 6 | ||||
| -rw-r--r-- | compiler/optimizing/intrinsics_arm.cc | 7 | ||||
| -rw-r--r-- | compiler/optimizing/optimizing_compiler.cc | 14 | ||||
| -rw-r--r-- | compiler/optimizing/reference_type_propagation.cc | 15 |
7 files changed, 42 insertions, 30 deletions
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 7b42db8a7f..23ab94e5fe 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -902,7 +902,7 @@ HClinitCheck* HGraphBuilder::ProcessClinitCheckForInvoke( StackHandleScope<4> hs(soa.Self()); Handle<mirror::DexCache> dex_cache(hs.NewHandle( dex_compilation_unit_->GetClassLinker()->FindDexCache( - *dex_compilation_unit_->GetDexFile()))); + soa.Self(), *dex_compilation_unit_->GetDexFile()))); Handle<mirror::ClassLoader> class_loader(hs.NewHandle( soa.Decode<mirror::ClassLoader*>(dex_compilation_unit_->GetClassLoader()))); ArtMethod* resolved_method = compiler_driver_->ResolveMethod( @@ -912,7 +912,7 @@ HClinitCheck* HGraphBuilder::ProcessClinitCheckForInvoke( const DexFile& outer_dex_file = *outer_compilation_unit_->GetDexFile(); Handle<mirror::DexCache> outer_dex_cache(hs.NewHandle( - outer_compilation_unit_->GetClassLinker()->FindDexCache(outer_dex_file))); + outer_compilation_unit_->GetClassLinker()->FindDexCache(soa.Self(), outer_dex_file))); Handle<mirror::Class> outer_class(hs.NewHandle(GetOutermostCompilingClass())); // The index at which the method's class is stored in the DexCache's type array. @@ -1228,7 +1228,7 @@ static mirror::Class* GetClassFrom(CompilerDriver* driver, Handle<mirror::ClassLoader> class_loader(hs.NewHandle( soa.Decode<mirror::ClassLoader*>(compilation_unit.GetClassLoader()))); Handle<mirror::DexCache> dex_cache(hs.NewHandle( - compilation_unit.GetClassLinker()->FindDexCache(dex_file))); + compilation_unit.GetClassLinker()->FindDexCache(soa.Self(), dex_file))); return driver->ResolveCompilingMethodsClass(soa, dex_cache, class_loader, &compilation_unit); } @@ -1245,7 +1245,8 @@ bool HGraphBuilder::IsOutermostCompilingClass(uint16_t type_index) const { ScopedObjectAccess soa(Thread::Current()); StackHandleScope<4> hs(soa.Self()); Handle<mirror::DexCache> dex_cache(hs.NewHandle( - dex_compilation_unit_->GetClassLinker()->FindDexCache(*dex_compilation_unit_->GetDexFile()))); + dex_compilation_unit_->GetClassLinker()->FindDexCache( + soa.Self(), *dex_compilation_unit_->GetDexFile()))); Handle<mirror::ClassLoader> class_loader(hs.NewHandle( soa.Decode<mirror::ClassLoader*>(dex_compilation_unit_->GetClassLoader()))); Handle<mirror::Class> cls(hs.NewHandle(compiler_driver_->ResolveClass( @@ -1264,7 +1265,8 @@ bool HGraphBuilder::BuildStaticFieldAccess(const Instruction& instruction, ScopedObjectAccess soa(Thread::Current()); StackHandleScope<4> hs(soa.Self()); Handle<mirror::DexCache> dex_cache(hs.NewHandle( - dex_compilation_unit_->GetClassLinker()->FindDexCache(*dex_compilation_unit_->GetDexFile()))); + dex_compilation_unit_->GetClassLinker()->FindDexCache( + soa.Self(), *dex_compilation_unit_->GetDexFile()))); Handle<mirror::ClassLoader> class_loader(hs.NewHandle( soa.Decode<mirror::ClassLoader*>(dex_compilation_unit_->GetClassLoader()))); ArtField* resolved_field = compiler_driver_->ResolveField( @@ -1277,7 +1279,7 @@ bool HGraphBuilder::BuildStaticFieldAccess(const Instruction& instruction, const DexFile& outer_dex_file = *outer_compilation_unit_->GetDexFile(); Handle<mirror::DexCache> outer_dex_cache(hs.NewHandle( - outer_compilation_unit_->GetClassLinker()->FindDexCache(outer_dex_file))); + outer_compilation_unit_->GetClassLinker()->FindDexCache(soa.Self(), outer_dex_file))); Handle<mirror::Class> outer_class(hs.NewHandle(GetOutermostCompilingClass())); // The index at which the field's class is stored in the DexCache's type array. diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 62026f31ab..9de9abffd8 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -2731,11 +2731,9 @@ void InstructionCodeGeneratorARM::VisitRem(HRem* rem) { Register temp = locations->GetTemp(0).AsRegister<Register>(); // temp = reg1 / reg2 (integer division) - // temp = temp * reg2 - // dest = reg1 - temp + // dest = reg1 - temp * reg2 __ sdiv(temp, reg1, reg2); - __ mul(temp, temp, reg2); - __ sub(out.AsRegister<Register>(), reg1, ShifterOperand(temp)); + __ mls(out.AsRegister<Register>(), temp, reg2, reg1); } else { InvokeRuntimeCallingConvention calling_convention; DCHECK_EQ(calling_convention.GetRegisterAt(0), first.AsRegister<Register>()); @@ -2905,7 +2903,7 @@ void InstructionCodeGeneratorARM::HandleShift(HBinaryOperation* op) { // If the shift is > 32 bits, override the high part __ subs(temp, o_l, ShifterOperand(kArmBitsPerWord)); __ it(PL); - __ Lsl(o_h, low, temp, false, PL); + __ Lsl(o_h, low, temp, PL); // Shift the low part __ Lsl(o_l, low, o_l); } else if (op->IsShr()) { @@ -2919,7 +2917,7 @@ void InstructionCodeGeneratorARM::HandleShift(HBinaryOperation* op) { // If the shift is > 32 bits, override the low part __ subs(temp, o_h, ShifterOperand(kArmBitsPerWord)); __ it(PL); - __ Asr(o_l, high, temp, false, PL); + __ Asr(o_l, high, temp, PL); // Shift the high part __ Asr(o_h, high, o_h); } else { @@ -2931,7 +2929,7 @@ void InstructionCodeGeneratorARM::HandleShift(HBinaryOperation* op) { __ orr(o_l, o_l, ShifterOperand(temp)); __ subs(temp, o_h, ShifterOperand(kArmBitsPerWord)); __ it(PL); - __ Lsr(o_l, high, temp, false, PL); + __ Lsr(o_l, high, temp, PL); __ Lsr(o_h, high, o_h); } break; diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index ff90f32754..112d42e904 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -182,10 +182,10 @@ bool HInliner::TryInline(HInvoke* invoke_instruction) { ArtMethod* resolved_method; if (invoke_instruction->IsInvokeStaticOrDirect()) { MethodReference ref = invoke_instruction->AsInvokeStaticOrDirect()->GetTargetMethod(); - resolved_method = class_linker->FindDexCache(*ref.dex_file)->GetResolvedMethod( + resolved_method = class_linker->FindDexCache(soa.Self(), *ref.dex_file)->GetResolvedMethod( ref.dex_method_index, class_linker->GetImagePointerSize()); } else { - resolved_method = class_linker->FindDexCache(caller_dex_file)->GetResolvedMethod( + resolved_method = class_linker->FindDexCache(soa.Self(), caller_dex_file)->GetResolvedMethod( method_index, class_linker->GetImagePointerSize()); } diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index df6e550b4a..0ac26de674 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -132,6 +132,12 @@ bool InstructionSimplifierVisitor::TryMoveNegOnInputsAfterBinop(HBinaryOperation // with // ADD tmp, a, b // NEG dst, tmp + // Note that we cannot optimize `(-a) + (-b)` to `-(a + b)` for floating-point. + // When `a` is `-0.0` and `b` is `0.0`, the former expression yields `0.0`, + // while the later yields `-0.0`. + if (!Primitive::IsIntegralType(binop->GetType())) { + return false; + } binop->ReplaceInput(left_neg->GetInput(), 0); binop->ReplaceInput(right_neg->GetInput(), 1); left_neg->GetBlock()->RemoveInstruction(left_neg); diff --git a/compiler/optimizing/intrinsics_arm.cc b/compiler/optimizing/intrinsics_arm.cc index c84d071786..69a3e627c9 100644 --- a/compiler/optimizing/intrinsics_arm.cc +++ b/compiler/optimizing/intrinsics_arm.cc @@ -989,10 +989,7 @@ void IntrinsicCodeGeneratorARM::VisitStringEquals(HInvoke* invoke) { DCHECK_ALIGNED(value_offset, 4); static_assert(IsAligned<4>(kObjectAlignment), "String of odd length is not zero padded"); - // temp cannot overflow because we cannot allocate a String object with size 4GiB or greater. - __ add(temp, temp, ShifterOperand(temp)); __ LoadImmediate(temp1, value_offset); - __ add(temp, temp, ShifterOperand(value_offset)); // Loop to compare strings 2 characters at a time starting at the front of the string. // Ok to do this because strings with an odd length are zero-padded. @@ -1002,8 +999,8 @@ void IntrinsicCodeGeneratorARM::VisitStringEquals(HInvoke* invoke) { __ cmp(out, ShifterOperand(temp2)); __ b(&return_false, NE); __ add(temp1, temp1, ShifterOperand(sizeof(uint32_t))); - __ cmp(temp1, ShifterOperand(temp)); - __ b(&loop, LO); + __ subs(temp, temp, ShifterOperand(sizeof(uint32_t) / sizeof(uint16_t))); + __ b(&loop, GT); // Return true and exit the function. // If loop does not result in returning false, we return true. diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index f6bbace664..6f251e8e6c 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -540,11 +540,14 @@ CompiledMethod* OptimizingCompiler::CompileOptimized(HGraph* graph, CompilerDriver* compiler_driver, const DexCompilationUnit& dex_compilation_unit, PassObserver* pass_observer) const { - StackHandleScopeCollection handles(Thread::Current()); + ScopedObjectAccess soa(Thread::Current()); + StackHandleScopeCollection handles(soa.Self()); + soa.Self()->TransitionFromRunnableToSuspended(kNative); RunOptimizations(graph, compiler_driver, compilation_stats_.get(), dex_compilation_unit, pass_observer, &handles); if (graph->HasTryCatch()) { + soa.Self()->TransitionFromSuspendedToRunnable(); return nullptr; } @@ -582,6 +585,8 @@ CompiledMethod* OptimizingCompiler::CompileOptimized(HGraph* graph, ArrayRef<const uint8_t>(*codegen->GetAssembler()->cfi().data()), ArrayRef<const LinkerPatch>(linker_patches)); pass_observer->DumpDisassembly(); + + soa.Self()->TransitionFromSuspendedToRunnable(); return compiled_method; } @@ -709,7 +714,8 @@ CompiledMethod* OptimizingCompiler::TryCompile(const DexFile::CodeItem* code_ite ScopedObjectAccess soa(Thread::Current()); StackHandleScope<4> hs(soa.Self()); ClassLinker* class_linker = dex_compilation_unit.GetClassLinker(); - Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(dex_file))); + Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache( + soa.Self(), dex_file))); Handle<mirror::ClassLoader> loader(hs.NewHandle( soa.Decode<mirror::ClassLoader*>(class_loader))); ArtMethod* art_method = compiler_driver->ResolveMethod( @@ -795,8 +801,8 @@ CompiledMethod* OptimizingCompiler::Compile(const DexFile::CodeItem* code_item, const DexFile& dex_file) const { CompilerDriver* compiler_driver = GetCompilerDriver(); CompiledMethod* method = nullptr; - if (compiler_driver->IsMethodVerifiedWithoutFailures(method_idx, class_def_idx, dex_file) && - !compiler_driver->GetVerifiedMethod(&dex_file, method_idx)->HasRuntimeThrow()) { + DCHECK(!compiler_driver->GetVerifiedMethod(&dex_file, method_idx)->HasRuntimeThrow()); + if (compiler_driver->IsMethodVerifiedWithoutFailures(method_idx, class_def_idx, dex_file)) { method = TryCompile(code_item, access_flags, invoke_type, class_def_idx, method_idx, jclass_loader, dex_file); } else { diff --git a/compiler/optimizing/reference_type_propagation.cc b/compiler/optimizing/reference_type_propagation.cc index 824f28eb7c..516638b33c 100644 --- a/compiler/optimizing/reference_type_propagation.cc +++ b/compiler/optimizing/reference_type_propagation.cc @@ -79,6 +79,8 @@ ReferenceTypePropagation::ReferenceTypePropagation(HGraph* graph, : HOptimization(graph, name), handles_(handles), worklist_(graph->GetArena(), kDefaultWorklistSize) { + // Mutator lock is required for NewHandle, but annotalysis ignores constructors. + ScopedObjectAccess soa(Thread::Current()); ClassLinker* linker = Runtime::Current()->GetClassLinker(); object_class_handle_ = handles_->NewHandle(linker->GetClassRoot(ClassLinker::kJavaLangObject)); string_class_handle_ = handles_->NewHandle(linker->GetClassRoot(ClassLinker::kJavaLangString)); @@ -87,7 +89,6 @@ ReferenceTypePropagation::ReferenceTypePropagation(HGraph* graph, handles_->NewHandle(linker->GetClassRoot(ClassLinker::kJavaLangThrowable)); if (kIsDebugBuild) { - ScopedObjectAccess soa(Thread::Current()); DCHECK(ReferenceTypeInfo::IsValidHandle(object_class_handle_)); DCHECK(ReferenceTypeInfo::IsValidHandle(class_class_handle_)); DCHECK(ReferenceTypeInfo::IsValidHandle(string_class_handle_)); @@ -362,7 +363,8 @@ void RTPVisitor::SetClassAsTypeInfo(HInstruction* instr, if (kIsDebugBuild) { ScopedObjectAccess soa(Thread::Current()); ClassLinker* cl = Runtime::Current()->GetClassLinker(); - mirror::DexCache* dex_cache = cl->FindDexCache(instr->AsInvoke()->GetDexFile(), false); + mirror::DexCache* dex_cache = cl->FindDexCache( + soa.Self(), instr->AsInvoke()->GetDexFile(), false); ArtMethod* method = dex_cache->GetResolvedMethod( instr->AsInvoke()->GetDexMethodIndex(), cl->GetImagePointerSize()); DCHECK(method != nullptr); @@ -393,7 +395,8 @@ void RTPVisitor::UpdateReferenceTypeInfo(HInstruction* instr, DCHECK_EQ(instr->GetType(), Primitive::kPrimNot); ScopedObjectAccess soa(Thread::Current()); - mirror::DexCache* dex_cache = Runtime::Current()->GetClassLinker()->FindDexCache(dex_file); + mirror::DexCache* dex_cache = Runtime::Current()->GetClassLinker()->FindDexCache( + soa.Self(), dex_file, false); // Get type from dex cache assuming it was populated by the verifier. SetClassAsTypeInfo(instr, dex_cache->GetResolvedType(type_idx), is_exact); } @@ -431,7 +434,7 @@ void RTPVisitor::UpdateFieldAccessTypeInfo(HInstruction* instr, ScopedObjectAccess soa(Thread::Current()); ClassLinker* cl = Runtime::Current()->GetClassLinker(); - mirror::DexCache* dex_cache = cl->FindDexCache(info.GetDexFile()); + mirror::DexCache* dex_cache = cl->FindDexCache(soa.Self(), info.GetDexFile(), false); ArtField* field = cl->GetResolvedField(info.GetFieldIndex(), dex_cache); // TODO: There are certain cases where we can't resolve the field. // b/21914925 is open to keep track of a repro case for this issue. @@ -450,7 +453,7 @@ void RTPVisitor::VisitStaticFieldGet(HStaticFieldGet* instr) { void RTPVisitor::VisitLoadClass(HLoadClass* instr) { ScopedObjectAccess soa(Thread::Current()); mirror::DexCache* dex_cache = - Runtime::Current()->GetClassLinker()->FindDexCache(instr->GetDexFile()); + Runtime::Current()->GetClassLinker()->FindDexCache(soa.Self(), instr->GetDexFile(), false); // Get type from dex cache assuming it was populated by the verifier. mirror::Class* resolved_class = dex_cache->GetResolvedType(instr->GetTypeIndex()); // TODO: investigating why we are still getting unresolved classes: b/22821472. @@ -633,7 +636,7 @@ void RTPVisitor::VisitInvoke(HInvoke* instr) { ScopedObjectAccess soa(Thread::Current()); ClassLinker* cl = Runtime::Current()->GetClassLinker(); - mirror::DexCache* dex_cache = cl->FindDexCache(instr->GetDexFile()); + mirror::DexCache* dex_cache = cl->FindDexCache(soa.Self(), instr->GetDexFile()); ArtMethod* method = dex_cache->GetResolvedMethod( instr->GetDexMethodIndex(), cl->GetImagePointerSize()); mirror::Class* klass = (method == nullptr) ? nullptr : method->GetReturnType(false); |