| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/intermediate_language.h" | 5 #include "vm/intermediate_language.h" |
| 6 | 6 |
| 7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" |
| 8 #include "vm/dart_entry.h" | 8 #include "vm/dart_entry.h" |
| 9 #include "vm/flow_graph_allocator.h" | 9 #include "vm/flow_graph_allocator.h" |
| 10 #include "vm/flow_graph_builder.h" | 10 #include "vm/flow_graph_builder.h" |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 // Both names are private. Mangle test_name before comparison. | 264 // Both names are private. Mangle test_name before comparison. |
| 265 const String& test_name_symbol = String::Handle(Symbols::New(test_name)); | 265 const String& test_name_symbol = String::Handle(Symbols::New(test_name)); |
| 266 return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name); | 266 return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name); |
| 267 } | 267 } |
| 268 | 268 |
| 269 | 269 |
| 270 static bool IsRecognizedLibrary(const Library& library) { | 270 static bool IsRecognizedLibrary(const Library& library) { |
| 271 // List of libraries where methods can be recognized. | 271 // List of libraries where methods can be recognized. |
| 272 return (library.raw() == Library::CoreLibrary()) | 272 return (library.raw() == Library::CoreLibrary()) |
| 273 || (library.raw() == Library::MathLibrary()) | 273 || (library.raw() == Library::MathLibrary()) |
| 274 || (library.raw() == Library::TypedDataLibrary()) |
| 274 || (library.raw() == Library::ScalarlistLibrary()); | 275 || (library.raw() == Library::ScalarlistLibrary()); |
| 275 } | 276 } |
| 276 | 277 |
| 277 | 278 |
| 278 MethodRecognizer::Kind MethodRecognizer::RecognizeKind( | 279 MethodRecognizer::Kind MethodRecognizer::RecognizeKind( |
| 279 const Function& function) { | 280 const Function& function) { |
| 280 const Class& function_class = Class::Handle(function.Owner()); | 281 const Class& function_class = Class::Handle(function.Owner()); |
| 281 const Library& lib = Library::Handle(function_class.library()); | 282 const Library& lib = Library::Handle(function_class.library()); |
| 282 if (!IsRecognizedLibrary(lib)) { | 283 if (!IsRecognizedLibrary(lib)) { |
| 283 return kUnknown; | 284 return kUnknown; |
| (...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 Definition* Definition::Canonicalize(FlowGraphOptimizer* optimizer) { | 1106 Definition* Definition::Canonicalize(FlowGraphOptimizer* optimizer) { |
| 1106 return this; | 1107 return this; |
| 1107 } | 1108 } |
| 1108 | 1109 |
| 1109 | 1110 |
| 1110 bool LoadFieldInstr::IsImmutableLengthLoad() const { | 1111 bool LoadFieldInstr::IsImmutableLengthLoad() const { |
| 1111 switch (recognized_kind()) { | 1112 switch (recognized_kind()) { |
| 1112 case MethodRecognizer::kObjectArrayLength: | 1113 case MethodRecognizer::kObjectArrayLength: |
| 1113 case MethodRecognizer::kImmutableArrayLength: | 1114 case MethodRecognizer::kImmutableArrayLength: |
| 1114 case MethodRecognizer::kByteArrayBaseLength: | 1115 case MethodRecognizer::kByteArrayBaseLength: |
| 1116 case MethodRecognizer::kTypedDataLength: |
| 1115 case MethodRecognizer::kStringBaseLength: | 1117 case MethodRecognizer::kStringBaseLength: |
| 1116 return true; | 1118 return true; |
| 1117 default: | 1119 default: |
| 1118 return false; | 1120 return false; |
| 1119 } | 1121 } |
| 1120 } | 1122 } |
| 1121 | 1123 |
| 1122 | 1124 |
| 1123 MethodRecognizer::Kind LoadFieldInstr::RecognizedKindFromArrayCid( | 1125 MethodRecognizer::Kind LoadFieldInstr::RecognizedKindFromArrayCid( |
| 1124 intptr_t cid) { | 1126 intptr_t cid) { |
| 1127 if (RawObject::IsTypedDataClassId(cid) || |
| 1128 RawObject::IsExternalTypedDataClassId(cid)) { |
| 1129 return MethodRecognizer::kTypedDataLength; |
| 1130 } |
| 1125 switch (cid) { | 1131 switch (cid) { |
| 1126 case kArrayCid: | 1132 case kArrayCid: |
| 1127 return MethodRecognizer::kObjectArrayLength; | 1133 return MethodRecognizer::kObjectArrayLength; |
| 1128 case kImmutableArrayCid: | 1134 case kImmutableArrayCid: |
| 1129 return MethodRecognizer::kImmutableArrayLength; | 1135 return MethodRecognizer::kImmutableArrayLength; |
| 1130 case kGrowableObjectArrayCid: | 1136 case kGrowableObjectArrayCid: |
| 1131 return MethodRecognizer::kGrowableArrayLength; | 1137 return MethodRecognizer::kGrowableArrayLength; |
| 1132 case kInt8ArrayCid: | 1138 case kInt8ArrayCid: |
| 1133 case kUint8ArrayCid: | 1139 case kUint8ArrayCid: |
| 1134 case kUint8ClampedArrayCid: | 1140 case kUint8ClampedArrayCid: |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1917 | 1923 |
| 1918 void LoadFieldInstr::InferRange() { | 1924 void LoadFieldInstr::InferRange() { |
| 1919 if ((range_ == NULL) && | 1925 if ((range_ == NULL) && |
| 1920 ((recognized_kind() == MethodRecognizer::kObjectArrayLength) || | 1926 ((recognized_kind() == MethodRecognizer::kObjectArrayLength) || |
| 1921 (recognized_kind() == MethodRecognizer::kImmutableArrayLength))) { | 1927 (recognized_kind() == MethodRecognizer::kImmutableArrayLength))) { |
| 1922 range_ = new Range(RangeBoundary::FromConstant(0), | 1928 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1923 RangeBoundary::FromConstant(Array::kMaxElements)); | 1929 RangeBoundary::FromConstant(Array::kMaxElements)); |
| 1924 return; | 1930 return; |
| 1925 } | 1931 } |
| 1926 if ((range_ == NULL) && | 1932 if ((range_ == NULL) && |
| 1927 (recognized_kind() == MethodRecognizer::kByteArrayBaseLength)) { | 1933 (recognized_kind() == MethodRecognizer::kByteArrayBaseLength || |
| 1934 recognized_kind() == MethodRecognizer::kTypedDataLength)) { |
| 1928 range_ = new Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi()); | 1935 range_ = new Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi()); |
| 1929 return; | 1936 return; |
| 1930 } | 1937 } |
| 1931 if ((range_ == NULL) && | 1938 if ((range_ == NULL) && |
| 1932 (recognized_kind() == MethodRecognizer::kStringBaseLength)) { | 1939 (recognized_kind() == MethodRecognizer::kStringBaseLength)) { |
| 1933 range_ = new Range(RangeBoundary::FromConstant(0), | 1940 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1934 RangeBoundary::FromConstant(String::kMaxElements)); | 1941 RangeBoundary::FromConstant(String::kMaxElements)); |
| 1935 return; | 1942 return; |
| 1936 } | 1943 } |
| 1937 Definition::InferRange(); | 1944 Definition::InferRange(); |
| 1938 } | 1945 } |
| 1939 | 1946 |
| 1940 | 1947 |
| 1941 | 1948 |
| 1942 void LoadIndexedInstr::InferRange() { | 1949 void LoadIndexedInstr::InferRange() { |
| 1943 switch (class_id()) { | 1950 switch (class_id()) { |
| 1944 case kInt8ArrayCid: | 1951 case kInt8ArrayCid: |
| 1952 case kTypedDataInt8ArrayCid: |
| 1945 range_ = new Range(RangeBoundary::FromConstant(-128), | 1953 range_ = new Range(RangeBoundary::FromConstant(-128), |
| 1946 RangeBoundary::FromConstant(127)); | 1954 RangeBoundary::FromConstant(127)); |
| 1947 break; | 1955 break; |
| 1948 case kUint8ArrayCid: | 1956 case kUint8ArrayCid: |
| 1949 case kUint8ClampedArrayCid: | 1957 case kUint8ClampedArrayCid: |
| 1950 case kExternalUint8ArrayCid: | 1958 case kExternalUint8ArrayCid: |
| 1951 case kExternalUint8ClampedArrayCid: | 1959 case kExternalUint8ClampedArrayCid: |
| 1960 case kTypedDataUint8ArrayCid: |
| 1961 case kTypedDataUint8ClampedArrayCid: |
| 1962 case kExternalTypedDataUint8ArrayCid: |
| 1963 case kExternalTypedDataUint8ClampedArrayCid: |
| 1952 range_ = new Range(RangeBoundary::FromConstant(0), | 1964 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1953 RangeBoundary::FromConstant(255)); | 1965 RangeBoundary::FromConstant(255)); |
| 1954 break; | 1966 break; |
| 1955 case kInt16ArrayCid: | 1967 case kInt16ArrayCid: |
| 1968 case kTypedDataInt16ArrayCid: |
| 1956 range_ = new Range(RangeBoundary::FromConstant(-32768), | 1969 range_ = new Range(RangeBoundary::FromConstant(-32768), |
| 1957 RangeBoundary::FromConstant(32767)); | 1970 RangeBoundary::FromConstant(32767)); |
| 1958 break; | 1971 break; |
| 1959 case kUint16ArrayCid: | 1972 case kUint16ArrayCid: |
| 1973 case kTypedDataUint16ArrayCid: |
| 1960 range_ = new Range(RangeBoundary::FromConstant(0), | 1974 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1961 RangeBoundary::FromConstant(65535)); | 1975 RangeBoundary::FromConstant(65535)); |
| 1962 break; | 1976 break; |
| 1963 case kOneByteStringCid: | 1977 case kOneByteStringCid: |
| 1964 range_ = new Range(RangeBoundary::FromConstant(0), | 1978 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1965 RangeBoundary::FromConstant(0xFF)); | 1979 RangeBoundary::FromConstant(0xFF)); |
| 1966 break; | 1980 break; |
| 1967 case kTwoByteStringCid: | 1981 case kTwoByteStringCid: |
| 1968 range_ = new Range(RangeBoundary::FromConstant(0), | 1982 range_ = new Range(RangeBoundary::FromConstant(0), |
| 1969 RangeBoundary::FromConstant(0xFFFF)); | 1983 RangeBoundary::FromConstant(0xFFFF)); |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2183 do { | 2197 do { |
| 2184 if (DependOnSameSymbol(max, length)) return max.offset() < length.offset(); | 2198 if (DependOnSameSymbol(max, length)) return max.offset() < length.offset(); |
| 2185 } while (CanonicalizeMaxBoundary(&max) || CanonicalizeMinBoundary(&length)); | 2199 } while (CanonicalizeMaxBoundary(&max) || CanonicalizeMinBoundary(&length)); |
| 2186 | 2200 |
| 2187 // Failed to prove that maximum is bounded with array length. | 2201 // Failed to prove that maximum is bounded with array length. |
| 2188 return false; | 2202 return false; |
| 2189 } | 2203 } |
| 2190 | 2204 |
| 2191 | 2205 |
| 2192 intptr_t CheckArrayBoundInstr::LengthOffsetFor(intptr_t class_id) { | 2206 intptr_t CheckArrayBoundInstr::LengthOffsetFor(intptr_t class_id) { |
| 2207 if (RawObject::IsExternalTypedDataClassId(class_id)) { |
| 2208 return ExternalTypedData::length_offset(); |
| 2209 } |
| 2210 if (RawObject::IsTypedDataClassId(class_id)) { |
| 2211 return TypedData::length_offset(); |
| 2212 } |
| 2193 switch (class_id) { | 2213 switch (class_id) { |
| 2194 case kGrowableObjectArrayCid: | 2214 case kGrowableObjectArrayCid: |
| 2195 return GrowableObjectArray::length_offset(); | 2215 return GrowableObjectArray::length_offset(); |
| 2196 case kOneByteStringCid: | 2216 case kOneByteStringCid: |
| 2197 case kTwoByteStringCid: | 2217 case kTwoByteStringCid: |
| 2198 return String::length_offset(); | 2218 return String::length_offset(); |
| 2199 case kArrayCid: | 2219 case kArrayCid: |
| 2200 case kImmutableArrayCid: | 2220 case kImmutableArrayCid: |
| 2201 return Array::length_offset(); | 2221 return Array::length_offset(); |
| 2202 case kInt8ArrayCid: | 2222 case kInt8ArrayCid: |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2303 default: | 2323 default: |
| 2304 UNREACHABLE(); | 2324 UNREACHABLE(); |
| 2305 } | 2325 } |
| 2306 return kPowRuntimeEntry; | 2326 return kPowRuntimeEntry; |
| 2307 } | 2327 } |
| 2308 | 2328 |
| 2309 | 2329 |
| 2310 #undef __ | 2330 #undef __ |
| 2311 | 2331 |
| 2312 } // namespace dart | 2332 } // namespace dart |
| OLD | NEW |