Lines Matching refs:instr

63   void VisitLoadMethodHandle(HLoadMethodHandle* instr) override;
64 void VisitLoadMethodType(HLoadMethodType* instr) override;
65 void VisitLoadString(HLoadString* instr) override;
66 void VisitLoadException(HLoadException* instr) override;
67 void VisitNewArray(HNewArray* instr) override;
68 void VisitParameterValue(HParameterValue* instr) override;
69 void VisitInstanceFieldGet(HInstanceFieldGet* instr) override;
70 void VisitStaticFieldGet(HStaticFieldGet* instr) override;
71 void VisitUnresolvedInstanceFieldGet(HUnresolvedInstanceFieldGet* instr) override;
72 void VisitUnresolvedStaticFieldGet(HUnresolvedStaticFieldGet* instr) override;
73 void VisitInvoke(HInvoke* instr) override;
74 void VisitArrayGet(HArrayGet* instr) override;
75 void VisitCheckCast(HCheckCast* instr) override;
76 void VisitBoundType(HBoundType* instr) override;
77 void VisitNullCheck(HNullCheck* instr) override;
84 void UpdateFieldAccessTypeInfo(HInstruction* instr, const FieldInfo& info);
85 void SetClassAsTypeInfo(HInstruction* instr, ObjPtr<mirror::Class> klass, bool is_exact)
89 static bool UpdateNullability(HInstruction* instr);
91 void UpdateArrayGet(HArrayGet* instr) REQUIRES_SHARED(Locks::mutator_lock_);
93 bool UpdateReferenceTypeInfo(HInstruction* instr);
94 void UpdateReferenceTypeInfo(HInstruction* instr,
134 HInstruction* instr = iti.Current(); in ValidateTypes() local
135 if (instr->GetType() == DataType::Type::kReference) { in ValidateTypes()
136 DCHECK(instr->GetReferenceTypeInfo().IsValid()) in ValidateTypes()
137 << "Invalid RTI for instruction: " << instr->DebugName(); in ValidateTypes()
138 if (instr->IsBoundType()) { in ValidateTypes()
139 DCHECK(instr->AsBoundType()->GetUpperBound().IsValid()); in ValidateTypes()
140 } else if (instr->IsLoadClass()) { in ValidateTypes()
141 HLoadClass* cls = instr->AsLoadClass(); in ValidateTypes()
144 } else if (instr->IsNullCheck()) { in ValidateTypes()
145 DCHECK(instr->GetReferenceTypeInfo().IsEqual(instr->InputAt(0)->GetReferenceTypeInfo())) in ValidateTypes()
146 << "NullCheck " << instr->GetReferenceTypeInfo() in ValidateTypes()
147 << "Input(0) " << instr->InputAt(0)->GetReferenceTypeInfo(); in ValidateTypes()
149 } else if (instr->IsInstanceOf()) { in ValidateTypes()
150 HInstanceOf* iof = instr->AsInstanceOf(); in ValidateTypes()
152 } else if (instr->IsCheckCast()) { in ValidateTypes()
153 HCheckCast* check = instr->AsCheckCast(); in ValidateTypes()
347 HInstruction* instr = it.Current(); in VisitBasicBlock() local
348 instr->Accept(this); in VisitBasicBlock()
508 void ReferenceTypePropagation::RTPVisitor::SetClassAsTypeInfo(HInstruction* instr, in SetClassAsTypeInfo() argument
511 if (instr->IsInvokeStaticOrDirect() && instr->AsInvokeStaticOrDirect()->IsStringInit()) { in SetClassAsTypeInfo()
514 HInvokeStaticOrDirect* invoke = instr->AsInvokeStaticOrDirect(); in SetClassAsTypeInfo()
534 instr->SetReferenceTypeInfo( in SetClassAsTypeInfo()
539 instr->SetReferenceTypeInfo(ReferenceTypeInfo::Create(handle, is_exact)); in SetClassAsTypeInfo()
541 instr->SetReferenceTypeInfo(GetGraph()->GetInexactObjectRti()); in SetClassAsTypeInfo()
545 void ReferenceTypePropagation::RTPVisitor::VisitDeoptimize(HDeoptimize* instr) { in VisitDeoptimize() argument
546 BoundTypeForClassCheck(instr); in VisitDeoptimize()
549 void ReferenceTypePropagation::RTPVisitor::UpdateReferenceTypeInfo(HInstruction* instr, in UpdateReferenceTypeInfo() argument
553 DCHECK_EQ(instr->GetType(), DataType::Type::kReference); in UpdateReferenceTypeInfo()
559 SetClassAsTypeInfo(instr, klass, is_exact); in UpdateReferenceTypeInfo()
562 void ReferenceTypePropagation::RTPVisitor::VisitNewInstance(HNewInstance* instr) { in VisitNewInstance() argument
564 SetClassAsTypeInfo(instr, instr->GetLoadClass()->GetClass().Get(), /* is_exact= */ true); in VisitNewInstance()
567 void ReferenceTypePropagation::RTPVisitor::VisitNewArray(HNewArray* instr) { in VisitNewArray() argument
569 SetClassAsTypeInfo(instr, instr->GetLoadClass()->GetClass().Get(), /* is_exact= */ true); in VisitNewArray()
572 void ReferenceTypePropagation::RTPVisitor::VisitParameterValue(HParameterValue* instr) { in VisitParameterValue() argument
574 if (instr->GetType() == DataType::Type::kReference && !instr->GetReferenceTypeInfo().IsValid()) { in VisitParameterValue()
575 UpdateReferenceTypeInfo(instr, in VisitParameterValue()
576 instr->GetTypeIndex(), in VisitParameterValue()
577 instr->GetDexFile(), in VisitParameterValue()
582 void ReferenceTypePropagation::RTPVisitor::UpdateFieldAccessTypeInfo(HInstruction* instr, in UpdateFieldAccessTypeInfo() argument
584 if (instr->GetType() != DataType::Type::kReference) { in UpdateFieldAccessTypeInfo()
596 SetClassAsTypeInfo(instr, klass, /* is_exact= */ false); in UpdateFieldAccessTypeInfo()
599 void ReferenceTypePropagation::RTPVisitor::VisitInstanceFieldGet(HInstanceFieldGet* instr) { in VisitInstanceFieldGet() argument
600 UpdateFieldAccessTypeInfo(instr, instr->GetFieldInfo()); in VisitInstanceFieldGet()
603 void ReferenceTypePropagation::RTPVisitor::VisitStaticFieldGet(HStaticFieldGet* instr) { in VisitStaticFieldGet() argument
604 UpdateFieldAccessTypeInfo(instr, instr->GetFieldInfo()); in VisitStaticFieldGet()
608 HUnresolvedInstanceFieldGet* instr) { in VisitUnresolvedInstanceFieldGet() argument
610 if (instr->GetFieldType() == DataType::Type::kReference) { in VisitUnresolvedInstanceFieldGet()
611 instr->SetReferenceTypeInfo(GetGraph()->GetInexactObjectRti()); in VisitUnresolvedInstanceFieldGet()
616 HUnresolvedStaticFieldGet* instr) { in VisitUnresolvedStaticFieldGet() argument
618 if (instr->GetFieldType() == DataType::Type::kReference) { in VisitUnresolvedStaticFieldGet()
619 instr->SetReferenceTypeInfo(GetGraph()->GetInexactObjectRti()); in VisitUnresolvedStaticFieldGet()
623 void ReferenceTypePropagation::RTPVisitor::VisitLoadClass(HLoadClass* instr) { in VisitLoadClass() argument
625 if (IsAdmissible(instr->GetClass().Get())) { in VisitLoadClass()
626 instr->SetValidLoadedClassRTI(); in VisitLoadClass()
628 instr->SetReferenceTypeInfo( in VisitLoadClass()
632 void ReferenceTypePropagation::RTPVisitor::VisitInstanceOf(HInstanceOf* instr) { in VisitInstanceOf() argument
634 if (IsAdmissible(instr->GetClass().Get())) { in VisitInstanceOf()
635 instr->SetValidTargetClassRTI(); in VisitInstanceOf()
639 void ReferenceTypePropagation::RTPVisitor::VisitClinitCheck(HClinitCheck* instr) { in VisitClinitCheck() argument
640 instr->SetReferenceTypeInfo(instr->InputAt(0)->GetReferenceTypeInfo()); in VisitClinitCheck()
643 void ReferenceTypePropagation::RTPVisitor::VisitLoadMethodHandle(HLoadMethodHandle* instr) { in VisitLoadMethodHandle() argument
644 instr->SetReferenceTypeInfo(ReferenceTypeInfo::Create( in VisitLoadMethodHandle()
648 void ReferenceTypePropagation::RTPVisitor::VisitLoadMethodType(HLoadMethodType* instr) { in VisitLoadMethodType() argument
649 instr->SetReferenceTypeInfo(ReferenceTypeInfo::Create( in VisitLoadMethodType()
653 void ReferenceTypePropagation::RTPVisitor::VisitLoadString(HLoadString* instr) { in VisitLoadString() argument
654 instr->SetReferenceTypeInfo( in VisitLoadString()
658 void ReferenceTypePropagation::RTPVisitor::VisitLoadException(HLoadException* instr) { in VisitLoadException() argument
659 DCHECK(instr->GetBlock()->IsCatchBlock()); in VisitLoadException()
660 TryCatchInformation* catch_info = instr->GetBlock()->GetTryCatchInformation(); in VisitLoadException()
663 UpdateReferenceTypeInfo(instr, in VisitLoadException()
668 instr->SetReferenceTypeInfo(ReferenceTypeInfo::Create( in VisitLoadException()
673 void ReferenceTypePropagation::RTPVisitor::VisitNullCheck(HNullCheck* instr) { in VisitNullCheck() argument
674 ReferenceTypeInfo parent_rti = instr->InputAt(0)->GetReferenceTypeInfo(); in VisitNullCheck()
676 instr->SetReferenceTypeInfo(parent_rti); in VisitNullCheck()
680 void ReferenceTypePropagation::RTPVisitor::VisitBoundType(HBoundType* instr) { in VisitBoundType() argument
681 ReferenceTypeInfo class_rti = instr->GetUpperBound(); in VisitBoundType()
685 HInstruction* obj = instr->InputAt(0); in VisitBoundType()
688 instr->SetReferenceTypeInfo(class_rti); in VisitBoundType()
692 instr->SetReferenceTypeInfo(obj_rti); in VisitBoundType()
698 instr->SetReferenceTypeInfo( in VisitBoundType()
705 instr->SetCanBeNull(obj->CanBeNull() && instr->GetUpperCanBeNull()); in VisitBoundType()
710 DCHECK(!instr->HasUses()); in VisitBoundType()
711 instr->GetBlock()->RemoveInstruction(instr); in VisitBoundType()
824 void ReferenceTypePropagation::RTPVisitor::UpdateArrayGet(HArrayGet* instr) { in UpdateArrayGet() argument
825 DCHECK_EQ(DataType::Type::kReference, instr->GetType()); in UpdateArrayGet()
827 ReferenceTypeInfo parent_rti = instr->InputAt(0)->GetReferenceTypeInfo(); in UpdateArrayGet()
837 instr->SetReferenceTypeInfo(ReferenceTypeInfo::Create(component_handle, is_exact)); in UpdateArrayGet()
840 instr->SetReferenceTypeInfo(GetGraph()->GetInexactObjectRti()); in UpdateArrayGet()
844 bool ReferenceTypePropagation::RTPVisitor::UpdateReferenceTypeInfo(HInstruction* instr) { in UpdateReferenceTypeInfo() argument
847 ReferenceTypeInfo previous_rti = instr->GetReferenceTypeInfo(); in UpdateReferenceTypeInfo()
848 if (instr->IsBoundType()) { in UpdateReferenceTypeInfo()
849 UpdateBoundType(instr->AsBoundType()); in UpdateReferenceTypeInfo()
850 } else if (instr->IsPhi()) { in UpdateReferenceTypeInfo()
851 UpdatePhi(instr->AsPhi()); in UpdateReferenceTypeInfo()
852 } else if (instr->IsNullCheck()) { in UpdateReferenceTypeInfo()
853 ReferenceTypeInfo parent_rti = instr->InputAt(0)->GetReferenceTypeInfo(); in UpdateReferenceTypeInfo()
855 instr->SetReferenceTypeInfo(parent_rti); in UpdateReferenceTypeInfo()
857 } else if (instr->IsArrayGet()) { in UpdateReferenceTypeInfo()
860 UpdateArrayGet(instr->AsArrayGet()); in UpdateReferenceTypeInfo()
865 return !previous_rti.IsEqual(instr->GetReferenceTypeInfo()); in UpdateReferenceTypeInfo()
868 void ReferenceTypePropagation::RTPVisitor::VisitInvoke(HInvoke* instr) { in VisitInvoke() argument
869 if (instr->GetType() != DataType::Type::kReference) { in VisitInvoke()
874 ArtMethod* method = instr->GetResolvedMethod(); in VisitInvoke()
876 SetClassAsTypeInfo(instr, klass, /* is_exact= */ false); in VisitInvoke()
879 void ReferenceTypePropagation::RTPVisitor::VisitArrayGet(HArrayGet* instr) { in VisitArrayGet() argument
880 if (instr->GetType() != DataType::Type::kReference) { in VisitArrayGet()
885 UpdateArrayGet(instr); in VisitArrayGet()
886 if (!instr->GetReferenceTypeInfo().IsValid()) { in VisitArrayGet()
887 worklist_.push_back(instr); in VisitArrayGet()
891 void ReferenceTypePropagation::RTPVisitor::UpdateBoundType(HBoundType* instr) { in UpdateBoundType() argument
892 ReferenceTypeInfo input_rti = instr->InputAt(0)->GetReferenceTypeInfo(); in UpdateBoundType()
897 ReferenceTypeInfo upper_bound_rti = instr->GetUpperBound(); in UpdateBoundType()
899 instr->SetReferenceTypeInfo(upper_bound_rti); in UpdateBoundType()
902 instr->SetReferenceTypeInfo(input_rti); in UpdateBoundType()
908 instr->SetReferenceTypeInfo( in UpdateBoundType()
915 void ReferenceTypePropagation::RTPVisitor::UpdatePhi(HPhi* instr) { in UpdatePhi() argument
916 DCHECK(instr->IsLive()); in UpdatePhi()
918 HInputsRef inputs = instr->GetInputs(); in UpdatePhi()
927 instr->SetReferenceTypeInfo(instr->GetBlock()->GetGraph()->GetInexactObjectRti()); in UpdatePhi()
931 ReferenceTypeInfo new_rti = instr->InputAt(first_input_index_not_null)->GetReferenceTypeInfo(); in UpdatePhi()
935 instr->SetReferenceTypeInfo(new_rti); in UpdatePhi()
954 instr->SetReferenceTypeInfo(new_rti); in UpdatePhi()
960 bool ReferenceTypePropagation::RTPVisitor::UpdateNullability(HInstruction* instr) { in UpdateNullability() argument
961 DCHECK((instr->IsPhi() && instr->AsPhi()->IsLive()) in UpdateNullability()
962 || instr->IsBoundType() in UpdateNullability()
963 || instr->IsNullCheck() in UpdateNullability()
964 || instr->IsArrayGet()); in UpdateNullability()
966 if (!instr->IsPhi() && !instr->IsBoundType()) { in UpdateNullability()
970 bool existing_can_be_null = instr->CanBeNull(); in UpdateNullability()
971 if (instr->IsPhi()) { in UpdateNullability()
972 HPhi* phi = instr->AsPhi(); in UpdateNullability()
981 } else if (instr->IsBoundType()) { in UpdateNullability()
982 HBoundType* bound_type = instr->AsBoundType(); in UpdateNullability()
983 bound_type->SetCanBeNull(instr->InputAt(0)->CanBeNull() && bound_type->GetUpperCanBeNull()); in UpdateNullability()
985 return existing_can_be_null != instr->CanBeNull(); in UpdateNullability()