2859 {
2861
2865 if (StaticCallInstr* call = orig_instance->AsStaticCall()) {
2866
2867
2868
2869 if (
call->is_known_list_constructor() &&
2871 return call->ArgumentAt(1);
2872 }
else if (
call->function().recognized_kind() ==
2873 MethodRecognizer::kByteDataFactory) {
2874
2875
2876 return call->ArgumentAt(1);
2878
2879
2880
2881
2882
2883
2884
2885
2886 return call->ArgumentAt(3);
2887 }
2888 } else if (LoadFieldInstr* load_array = orig_instance->AsLoadField()) {
2889
2890
2891 const Slot&
slot = load_array->slot();
2894 return flow_graph->GetConstant(
2896 }
2897 }
2898 }
2899 }
2900
2901 switch (
slot().kind()) {
2902 case Slot::Kind::kArray_length:
2903 if (CreateArrayInstr* create_array = orig_instance->AsCreateArray()) {
2904 return create_array->num_elements()->definition();
2905 }
2906 break;
2907 case Slot::Kind::kTypedDataBase_length:
2908 if (AllocateTypedDataInstr* alloc_typed_data =
2909 orig_instance->AsAllocateTypedData()) {
2910 return alloc_typed_data->num_elements()->definition();
2911 }
2912 break;
2913 case Slot::Kind::kTypedDataView_typed_data:
2914
2915
2917 if (StaticCallInstr* call = orig_instance->AsStaticCall()) {
2920 return call->ArgumentAt(1);
2921 }
2922 }
2923 break;
2924 case Slot::Kind::kTypedDataView_offset_in_bytes:
2925
2926
2928 if (StaticCallInstr* call = orig_instance->AsStaticCall()) {
2930 return call->ArgumentAt(2);
2931 }
else if (
call->function().recognized_kind() ==
2932 MethodRecognizer::kByteDataFactory) {
2933
2934
2935 return flow_graph->GetConstant(Object::smi_zero());
2936 }
2937 }
2938 break;
2939 case Slot::Kind::kRecord_shape:
2941 if (auto* alloc_rec = orig_instance->AsAllocateRecord()) {
2942 return flow_graph->GetConstant(
Smi::Handle(alloc_rec->shape().AsSmi()));
2943 } else if (auto* alloc_rec = orig_instance->AsAllocateSmallRecord()) {
2944 return flow_graph->GetConstant(
Smi::Handle(alloc_rec->shape().AsSmi()));
2945 } else {
2947 if (
type->IsRecordType()) {
2948 return flow_graph->GetConstant(
2949 Smi::Handle(RecordType::Cast(*type).shape().AsSmi()));
2950 }
2951 }
2952 break;
2955 if (StaticCallInstr* call = orig_instance->AsStaticCall()) {
2956 if (
call->is_known_list_constructor()) {
2957 return call->ArgumentAt(0);
2960 return flow_graph->constant_null();
2961 }
2962 switch (
call->function().recognized_kind()) {
2963 case MethodRecognizer::kByteDataFactory:
2964 case MethodRecognizer::kLinkedHashBase_getData:
2965 case MethodRecognizer::kImmutableLinkedHashBase_getData:
2966 return flow_graph->constant_null();
2967 default:
2968 break;
2969 }
2970 } else if (CreateArrayInstr* create_array =
2971 orig_instance->AsCreateArray()) {
2972 return create_array->type_arguments()->definition();
2973 } else if (LoadFieldInstr* load_array = orig_instance->AsLoadField()) {
2974 const Slot&
slot = load_array->slot();
2977
2978
2980 if (field.static_type_exactness_state().IsTriviallyExact()) {
2983 .GetInstanceTypeArguments(flow_graph->thread())));
2984 }
2985 break;
2986 }
2987
2988 case Slot::Kind::kLinkedHashBase_data:
2989 return flow_graph->constant_null();
2990
2991 default:
2992 break;
2993 }
2994 }
2995 break;
2996 case Slot::Kind::kPointerBase_data:
3000
3003 }
3004 }
3005 break;
3006 default:
3007 break;
3008 }
3009
3010
3011 if (
instance()->BindsToConstant()) {
3015 return flow_graph->GetConstant(
result);
3016 }
3017 }
3018 }
3019
3021 StoreFieldInstr* initializing_store = nullptr;
3022 for (
auto use :
instance()->definition()->input_uses()) {
3023 if (
auto store = use->instruction()->AsStoreField()) {
3024 if ((use->use_index() == StoreFieldInstr::kInstancePos) &&
3026 if (initializing_store == nullptr) {
3027 initializing_store =
store;
3028 } else {
3029 initializing_store = nullptr;
3030 break;
3031 }
3032 }
3033 }
3034 }
3035
3036
3037
3038 if (initializing_store != nullptr &&
3039 initializing_store->is_initialization()) {
3040 ASSERT(IsDominatedBy(initializing_store));
3041 return initializing_store->value()->definition();
3042 }
3043 }
3044
3045 return this;
3046}
const AbstractType * ToAbstractType()
Definition * OriginalDefinition()
intptr_t guarded_list_length() const
bool IsImmutableLengthLoad() const
void set_loads_inner_pointer(InnerPointerAccess value)
bool IsImmutableLoad() const
static bool IsUnmodifiableTypedDataViewFactory(const Function &function)
bool Evaluate(const Object &instance_value, Object *result)
static bool IsFixedLengthArrayCid(intptr_t cid)
static bool IsTypedDataViewFactory(const Function &function)
static SmiPtr New(intptr_t value)
Definition * definition() const
bool IsExternalTypedDataClassId(intptr_t index)