Lines Matching refs:invoke_instruction

467 ArtMethod* HInliner::FindActualCallTarget(HInvoke* invoke_instruction, bool* cha_devirtualize) {  in FindActualCallTarget()  argument
468 ArtMethod* resolved_method = invoke_instruction->GetResolvedMethod(); in FindActualCallTarget()
472 if (invoke_instruction->IsInvokeStaticOrDirect()) { in FindActualCallTarget()
476 actual_method = FindVirtualOrInterfaceTarget(invoke_instruction, resolved_method); in FindActualCallTarget()
491 bool HInliner::TryInline(HInvoke* invoke_instruction) { in TryInline() argument
496 if (invoke_instruction->IsInvokeUnresolved()) { in TryInline()
499 } else if (invoke_instruction->IsInvokePolymorphic()) { in TryInline()
502 } else if (invoke_instruction->IsInvokeCustom()) { in TryInline()
508 uint32_t method_index = invoke_instruction->GetDexMethodIndex(); in TryInline()
512 ArtMethod* resolved_method = invoke_instruction->GetResolvedMethod(); in TryInline()
514 DCHECK(invoke_instruction->IsInvokeStaticOrDirect()); in TryInline()
515 DCHECK(invoke_instruction->AsInvokeStaticOrDirect()->IsStringInit()); in TryInline()
521 ArtMethod* actual_method = FindActualCallTarget(invoke_instruction, &cha_devirtualize); in TryInline()
525 DCHECK(!invoke_instruction->IsInvokeStaticOrDirect()); in TryInline()
527 return TryInlineFromInlineCache(caller_dex_file, invoke_instruction, resolved_method); in TryInline()
531 bool result = TryInlineAndReplace(invoke_instruction, in TryInline()
538 if (!invoke_instruction->IsInvokeStaticOrDirect()) { in TryInline()
552 invoke_instruction->SetAlwaysThrows(true); in TryInline()
605 HInvoke* invoke_instruction, in TryInlineFromInlineCache() argument
618 ? GetInlineCacheAOT(caller_dex_file, invoke_instruction, &hs, &inline_cache) in TryInlineFromInlineCache()
619 : GetInlineCacheJIT(invoke_instruction, &hs, &inline_cache); in TryInlineFromInlineCache()
625 << caller_dex_file.PrettyMethod(invoke_instruction->GetDexMethodIndex()); in TryInlineFromInlineCache()
632 << caller_dex_file.PrettyMethod(invoke_instruction->GetDexMethodIndex()) in TryInlineFromInlineCache()
640 return TryInlinePolymorphicCall(invoke_instruction, resolved_method, inline_cache); in TryInlineFromInlineCache()
642 return TryInlineMonomorphicCall(invoke_instruction, resolved_method, inline_cache); in TryInlineFromInlineCache()
648 return TryInlinePolymorphicCall(invoke_instruction, resolved_method, inline_cache); in TryInlineFromInlineCache()
654 << caller_dex_file.PrettyMethod(invoke_instruction->GetDexMethodIndex()) in TryInlineFromInlineCache()
663 << caller_dex_file.PrettyMethod(invoke_instruction->GetDexMethodIndex()) in TryInlineFromInlineCache()
672 HInvoke* invoke_instruction, in GetInlineCacheJIT() argument
694 *profiling_info->GetInlineCache(invoke_instruction->GetDexPc()), in GetInlineCacheJIT()
702 HInvoke* invoke_instruction, in GetInlineCacheAOT() argument
723 return ExtractClassesFromOfflineProfile(invoke_instruction, in GetInlineCacheAOT()
730 const HInvoke* invoke_instruction, in ExtractClassesFromOfflineProfile() argument
734 const auto it = offline_profile.inline_caches->find(invoke_instruction->GetDexPc()); in ExtractClassesFromOfflineProfile()
793 invoke_instruction->GetDexMethodIndex()) << " : " in ExtractClassesFromOfflineProfile()
824 HInstruction* invoke_instruction, in ResolveMethodFromInlineCache() argument
838 if (invoke_instruction->IsInvokeInterface()) { in ResolveMethodFromInlineCache()
841 DCHECK(invoke_instruction->IsInvokeVirtual()); in ResolveMethodFromInlineCache()
848 bool HInliner::TryInlineMonomorphicCall(HInvoke* invoke_instruction, in TryInlineMonomorphicCall() argument
851 DCHECK(invoke_instruction->IsInvokeVirtual() || invoke_instruction->IsInvokeInterface()) in TryInlineMonomorphicCall()
852 << invoke_instruction->DebugName(); in TryInlineMonomorphicCall()
869 monomorphic_type, resolved_method, invoke_instruction, pointer_size); in TryInlineMonomorphicCall()
878 HInstruction* receiver = invoke_instruction->InputAt(0); in TryInlineMonomorphicCall()
879 HInstruction* cursor = invoke_instruction->GetPrevious(); in TryInlineMonomorphicCall()
880 HBasicBlock* bb_cursor = invoke_instruction->GetBlock(); in TryInlineMonomorphicCall()
881 if (!TryInlineAndReplace(invoke_instruction, in TryInlineMonomorphicCall()
895 invoke_instruction, in TryInlineMonomorphicCall()
910 void HInliner::AddCHAGuard(HInstruction* invoke_instruction, in AddCHAGuard() argument
930 deopt_flag->AddInput(invoke_instruction->InputAt(0)); in AddCHAGuard()
932 deopt->CopyEnvironmentFrom(invoke_instruction->GetEnvironment()); in AddCHAGuard()
941 HInstruction* invoke_instruction, in AddTypeGuard() argument
945 class_linker, receiver, invoke_instruction->GetDexPc()); in AddTypeGuard()
972 invoke_instruction->GetDexPc(), in AddTypeGuard()
986 load_class->CopyEnvironmentFrom(invoke_instruction->GetEnvironment()); in AddTypeGuard()
999 invoke_instruction->GetDexPc()); in AddTypeGuard()
1001 deoptimize->CopyEnvironmentFrom(invoke_instruction->GetEnvironment()); in AddTypeGuard()
1002 DCHECK_EQ(invoke_instruction->InputAt(0), receiver); in AddTypeGuard()
1009 bool HInliner::TryInlinePolymorphicCall(HInvoke* invoke_instruction, in TryInlinePolymorphicCall() argument
1012 DCHECK(invoke_instruction->IsInvokeVirtual() || invoke_instruction->IsInvokeInterface()) in TryInlinePolymorphicCall()
1013 << invoke_instruction->DebugName(); in TryInlinePolymorphicCall()
1015 if (TryInlinePolymorphicCallToSameTarget(invoke_instruction, resolved_method, classes)) { in TryInlinePolymorphicCall()
1032 handle, resolved_method, invoke_instruction, pointer_size); in TryInlinePolymorphicCall()
1041 HInstruction* receiver = invoke_instruction->InputAt(0); in TryInlinePolymorphicCall()
1042 HInstruction* cursor = invoke_instruction->GetPrevious(); in TryInlinePolymorphicCall()
1043 HBasicBlock* bb_cursor = invoke_instruction->GetBlock(); in TryInlinePolymorphicCall()
1049 !TryBuildAndInline(invoke_instruction, in TryInlinePolymorphicCall()
1072 invoke_instruction, in TryInlinePolymorphicCall()
1076 invoke_instruction->ReplaceWith(return_replacement); in TryInlinePolymorphicCall()
1078 invoke_instruction->GetBlock()->RemoveInstruction(invoke_instruction); in TryInlinePolymorphicCall()
1083 CreateDiamondPatternForPolymorphicInline(compare, return_replacement, invoke_instruction); in TryInlinePolymorphicCall()
1109 HInstruction* invoke_instruction) { in CreateDiamondPatternForPolymorphicInline() argument
1110 uint32_t dex_pc = invoke_instruction->GetDexPc(); in CreateDiamondPatternForPolymorphicInline()
1112 HBasicBlock* original_invoke_block = invoke_instruction->GetBlock(); in CreateDiamondPatternForPolymorphicInline()
1123 HBasicBlock* end_then = invoke_instruction->GetBlock(); in CreateDiamondPatternForPolymorphicInline()
1124 HBasicBlock* otherwise = end_then->SplitBeforeForInlining(invoke_instruction); in CreateDiamondPatternForPolymorphicInline()
1125 HBasicBlock* merge = otherwise->SplitAfterForInlining(invoke_instruction); in CreateDiamondPatternForPolymorphicInline()
1131 allocator, kNoRegNumber, 0, HPhi::ToPhiType(invoke_instruction->GetType()), dex_pc); in CreateDiamondPatternForPolymorphicInline()
1133 invoke_instruction->ReplaceWith(phi); in CreateDiamondPatternForPolymorphicInline()
1135 phi->AddInput(invoke_instruction); in CreateDiamondPatternForPolymorphicInline()
1184 HInvoke* invoke_instruction, in TryInlinePolymorphicCallToSameTarget() argument
1197 size_t method_index = invoke_instruction->IsInvokeVirtual() in TryInlinePolymorphicCallToSameTarget()
1198 ? invoke_instruction->AsInvokeVirtual()->GetVTableIndex() in TryInlinePolymorphicCallToSameTarget()
1199 : invoke_instruction->AsInvokeInterface()->GetImtIndex(); in TryInlinePolymorphicCallToSameTarget()
1208 if (invoke_instruction->IsInvokeInterface()) { in TryInlinePolymorphicCallToSameTarget()
1217 DCHECK(invoke_instruction->IsInvokeVirtual()); in TryInlinePolymorphicCallToSameTarget()
1229 HInstruction* receiver = invoke_instruction->InputAt(0); in TryInlinePolymorphicCallToSameTarget()
1230 HInstruction* cursor = invoke_instruction->GetPrevious(); in TryInlinePolymorphicCallToSameTarget()
1231 HBasicBlock* bb_cursor = invoke_instruction->GetBlock(); in TryInlinePolymorphicCallToSameTarget()
1234 if (!TryBuildAndInline(invoke_instruction, in TryInlinePolymorphicCallToSameTarget()
1243 class_linker, receiver, invoke_instruction->GetDexPc()); in TryInlinePolymorphicCallToSameTarget()
1251 invoke_instruction->IsInvokeVirtual() ? HClassTableGet::TableKind::kVTable in TryInlinePolymorphicCallToSameTarget()
1254 invoke_instruction->GetDexPc()); in TryInlinePolymorphicCallToSameTarget()
1259 reinterpret_cast<intptr_t>(actual_method), invoke_instruction->GetDexPc()); in TryInlinePolymorphicCallToSameTarget()
1262 reinterpret_cast<intptr_t>(actual_method), invoke_instruction->GetDexPc()); in TryInlinePolymorphicCallToSameTarget()
1275 CreateDiamondPatternForPolymorphicInline(compare, return_replacement, invoke_instruction); in TryInlinePolymorphicCallToSameTarget()
1282 invoke_instruction->GetDexPc()); in TryInlinePolymorphicCallToSameTarget()
1284 deoptimize->CopyEnvironmentFrom(invoke_instruction->GetEnvironment()); in TryInlinePolymorphicCallToSameTarget()
1286 invoke_instruction->ReplaceWith(return_replacement); in TryInlinePolymorphicCallToSameTarget()
1289 invoke_instruction->GetBlock()->RemoveInstruction(invoke_instruction); in TryInlinePolymorphicCallToSameTarget()
1306 bool HInliner::TryInlineAndReplace(HInvoke* invoke_instruction, in TryInlineAndReplace() argument
1311 DCHECK(!invoke_instruction->IsIntrinsic()); in TryInlineAndReplace()
1313 uint32_t dex_pc = invoke_instruction->GetDexPc(); in TryInlineAndReplace()
1314 HInstruction* cursor = invoke_instruction->GetPrevious(); in TryInlineAndReplace()
1315 HBasicBlock* bb_cursor = invoke_instruction->GetBlock(); in TryInlineAndReplace()
1320 if (invoke_instruction->GetResolvedMethod() != method && method->IsIntrinsic()) { in TryInlineAndReplace()
1322 if (invoke_instruction->IsInvokeInterface()) { in TryInlineAndReplace()
1327 invoke_instruction->GetNumberOfArguments(), in TryInlineAndReplace()
1328 invoke_instruction->GetType(), in TryInlineAndReplace()
1329 invoke_instruction->GetDexPc(), in TryInlineAndReplace()
1330 invoke_instruction->GetDexMethodIndex(), // Use interface method's dex method index. in TryInlineAndReplace()
1334 HInputsRef inputs = invoke_instruction->GetInputs(); in TryInlineAndReplace()
1338 invoke_instruction->GetBlock()->InsertInstructionBefore(new_invoke, invoke_instruction); in TryInlineAndReplace()
1339 new_invoke->CopyEnvironmentFrom(invoke_instruction->GetEnvironment()); in TryInlineAndReplace()
1340 if (invoke_instruction->GetType() == DataType::Type::kReference) { in TryInlineAndReplace()
1341 new_invoke->SetReferenceTypeInfo(invoke_instruction->GetReferenceTypeInfo()); in TryInlineAndReplace()
1347 invoke_instruction->SetResolvedMethod(method); in TryInlineAndReplace()
1349 } else if (!TryBuildAndInline(invoke_instruction, method, receiver_type, &return_replacement)) { in TryInlineAndReplace()
1350 if (invoke_instruction->IsInvokeInterface()) { in TryInlineAndReplace()
1370 method, caller_dex_file, invoke_instruction->GetDexMethodIndex()); in TryInlineAndReplace()
1376 invoke_instruction->GetNumberOfArguments(), in TryInlineAndReplace()
1377 invoke_instruction->GetType(), in TryInlineAndReplace()
1378 invoke_instruction->GetDexPc(), in TryInlineAndReplace()
1382 HInputsRef inputs = invoke_instruction->GetInputs(); in TryInlineAndReplace()
1386 invoke_instruction->GetBlock()->InsertInstructionBefore(new_invoke, invoke_instruction); in TryInlineAndReplace()
1387 new_invoke->CopyEnvironmentFrom(invoke_instruction->GetEnvironment()); in TryInlineAndReplace()
1388 if (invoke_instruction->GetType() == DataType::Type::kReference) { in TryInlineAndReplace()
1389 new_invoke->SetReferenceTypeInfo(invoke_instruction->GetReferenceTypeInfo()); in TryInlineAndReplace()
1405 AddCHAGuard(invoke_instruction, dex_pc, cursor, bb_cursor); in TryInlineAndReplace()
1408 invoke_instruction->ReplaceWith(return_replacement); in TryInlineAndReplace()
1411 invoke_instruction->GetBlock()->RemoveInstruction(invoke_instruction); in TryInlineAndReplace()
1414 if (do_rtp && ReturnTypeMoreSpecific(invoke_instruction, return_replacement)) { in TryInlineAndReplace()
1479 bool HInliner::IsInliningSupported(const HInvoke* invoke_instruction, in IsInliningSupported() argument
1495 if (invoke_instruction->IsInvokeStaticOrDirect() && in IsInliningSupported()
1496 invoke_instruction->AsInvokeStaticOrDirect()->IsStaticWithImplicitClinitCheck()) { in IsInliningSupported()
1534 bool HInliner::TryBuildAndInline(HInvoke* invoke_instruction, in TryBuildAndInline() argument
1543 if (TryPatternSubstitution(invoke_instruction, method, return_replacement)) { in TryBuildAndInline()
1563 if (!IsInliningSupported(invoke_instruction, method, accessor)) { in TryBuildAndInline()
1572 invoke_instruction, method, receiver_type, return_replacement)) { in TryBuildAndInline()
1581 static HInstruction* GetInvokeInputForArgVRegIndex(HInvoke* invoke_instruction, in GetInvokeInputForArgVRegIndex() argument
1586 DCHECK_LT(input_index, invoke_instruction->GetNumberOfArguments()); in GetInvokeInputForArgVRegIndex()
1587 if (DataType::Is64BitType(invoke_instruction->InputAt(input_index)->GetType())) { in GetInvokeInputForArgVRegIndex()
1592 DCHECK_LT(input_index, invoke_instruction->GetNumberOfArguments()); in GetInvokeInputForArgVRegIndex()
1593 return invoke_instruction->InputAt(input_index); in GetInvokeInputForArgVRegIndex()
1597 bool HInliner::TryPatternSubstitution(HInvoke* invoke_instruction, in TryPatternSubstitution() argument
1607 DCHECK_EQ(invoke_instruction->GetType(), DataType::Type::kVoid); in TryPatternSubstitution()
1611 *return_replacement = GetInvokeInputForArgVRegIndex(invoke_instruction, in TryPatternSubstitution()
1628 HInstruction* obj = GetInvokeInputForArgVRegIndex(invoke_instruction, data.object_arg); in TryPatternSubstitution()
1632 invoke_instruction->GetBlock()->InsertInstructionBefore(iget, invoke_instruction); in TryPatternSubstitution()
1642 HInstruction* obj = GetInvokeInputForArgVRegIndex(invoke_instruction, data.object_arg); in TryPatternSubstitution()
1643 HInstruction* value = GetInvokeInputForArgVRegIndex(invoke_instruction, data.src_arg); in TryPatternSubstitution()
1647 invoke_instruction->GetBlock()->InsertInstructionBefore(iput, invoke_instruction); in TryPatternSubstitution()
1650 *return_replacement = GetInvokeInputForArgVRegIndex(invoke_instruction, return_arg); in TryPatternSubstitution()
1678 HInstruction* obj = GetInvokeInputForArgVRegIndex(invoke_instruction, in TryPatternSubstitution()
1682 HInstruction* value = GetInvokeInputForArgVRegIndex(invoke_instruction, iput_args[i]); in TryPatternSubstitution()
1688 invoke_instruction->GetBlock()->InsertInstructionBefore(iput, invoke_instruction); in TryPatternSubstitution()
1702 invoke_instruction->GetBlock()->InsertInstructionBefore(constructor_fence, in TryPatternSubstitution()
1703 invoke_instruction); in TryPatternSubstitution()
1802 HInvoke* invoke_instruction, in SubstituteArguments() argument
1813 HInstruction* argument = invoke_instruction->InputAt(parameter_index); in SubstituteArguments()
1841 if (run_rtp || ArgumentTypesMoreSpecific(invoke_instruction, resolved_method)) { in SubstituteArguments()
1990 bool HInliner::TryBuildAndInlineHelper(HInvoke* invoke_instruction, in TryBuildAndInlineHelper() argument
2022 InvokeType invoke_type = invoke_instruction->GetInvokeType(); in TryBuildAndInlineHelper()
2080 SubstituteArguments(callee_graph, invoke_instruction, receiver_type, dex_compilation_unit); in TryBuildAndInlineHelper()
2085 if (!CanInlineBody(callee_graph, invoke_instruction->GetBlock(), &number_of_instructions)) { in TryBuildAndInlineHelper()
2095 *return_replacement = callee_graph->InlineInto(graph_, invoke_instruction); in TryBuildAndInlineHelper()
2197 bool HInliner::ArgumentTypesMoreSpecific(HInvoke* invoke_instruction, ArtMethod* resolved_method) { in ArgumentTypesMoreSpecific() argument
2203 invoke_instruction->InputAt(0u))) { in ArgumentTypesMoreSpecific()
2217 HInstruction* input = invoke_instruction->InputAt(input_idx); in ArgumentTypesMoreSpecific()
2230 bool HInliner::ReturnTypeMoreSpecific(HInvoke* invoke_instruction, in ReturnTypeMoreSpecific() argument
2236 ReferenceTypeInfo invoke_rti = invoke_instruction->GetReferenceTypeInfo(); in ReturnTypeMoreSpecific()