Changeset 239951 in webkit
- Timestamp:
- Jan 14, 2019 2:31:06 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r239940 r239951 1 2019-01-14 Yusuke Suzuki <yusukesuzuki@slowstart.org> 2 3 [JSC] Do not use asArrayModes() with Structures because it discards TypedArray information 4 https://bugs.webkit.org/show_bug.cgi?id=193372 5 6 Reviewed by Saam Barati. 7 8 * stress/typed-array-array-modes-profile.js: Added. 9 (foo): 10 1 11 2019-01-14 Mark Lam <mark.lam@apple.com> 2 12 -
trunk/Source/JavaScriptCore/ChangeLog
r239947 r239951 1 2019-01-14 Yusuke Suzuki <yusukesuzuki@slowstart.org> 2 3 [JSC] Do not use asArrayModes() with Structures because it discards TypedArray information 4 https://bugs.webkit.org/show_bug.cgi?id=193372 5 6 Reviewed by Saam Barati. 7 8 When RegisteredStructureSet is filtered with AbstractValue, we use structure, SpeculationType, and ArrayModes. 9 However, we use asArrayModes() function with IndexingMode to compute the ArrayModes in AbstractValue. This is 10 wrong since this discards TypedArray ArrayModes. As a result, if RegisteredStructureSet with TypedArrays is 11 filtered with ArrayModes of AbstractValue populated from TypedArrays, we filter all the structures out since 12 AbstractValue's ArrayModes become NonArray, which is wrong with the TypedArrays' ArrayModes. This leads to 13 incorrect FTL code generation with MultiGetByOffset etc. nodes because, 14 15 1. AI think that this MultiGetByOffset never succeeds since all the values of RegisteredStructureSet are filtered out by the AbstractValue. 16 2. AI says the state of MultiGetByOffset is invalid since AI think it never succeeds. 17 3. So subsequent code becomes FTL crash code since AI think the execution should do OSR exit. 18 4. Then, FTL emits the code for MultiGetByOffset, and emits crash after that. 19 5. But in reality, the incoming value can match to the one of the RegisteredStructureSet value since (1)'s structures are incorrectly filtered by the incorrect ArrayModes. 20 6. Then, the execution goes on, and falls into the FTL crash. 21 22 This patch fixes the incorrect ArrayModes calculation by the following changes 23 24 1. Rename asArrayModes to asArrayModesIgnoringTypedArrays. 25 2. Fix incorrect asArrayModesIgnoringTypedArrays use in our code. Use arrayModesFromStructure instead. 26 3. Fix OSR exit code which stores incorrect ArrayModes to the profiles. 27 28 * bytecode/ArrayProfile.cpp: 29 (JSC::dumpArrayModes): 30 (JSC::ArrayProfile::computeUpdatedPrediction): 31 * bytecode/ArrayProfile.h: 32 (JSC::asArrayModesIgnoringTypedArrays): 33 (JSC::arrayModesFromStructure): 34 (JSC::arrayModesIncludeIgnoringTypedArrays): 35 (JSC::shouldUseSlowPutArrayStorage): 36 (JSC::shouldUseFastArrayStorage): 37 (JSC::shouldUseContiguous): 38 (JSC::shouldUseDouble): 39 (JSC::shouldUseInt32): 40 (JSC::asArrayModes): Deleted. 41 (JSC::arrayModeFromStructure): Deleted. 42 (JSC::arrayModesInclude): Deleted. 43 * dfg/DFGAbstractValue.cpp: 44 (JSC::DFG::AbstractValue::observeTransitions): 45 (JSC::DFG::AbstractValue::set): 46 (JSC::DFG::AbstractValue::mergeOSREntryValue): 47 (JSC::DFG::AbstractValue::contains const): 48 * dfg/DFGAbstractValue.h: 49 (JSC::DFG::AbstractValue::observeTransition): 50 (JSC::DFG::AbstractValue::validate const): 51 (JSC::DFG::AbstractValue::observeIndexingTypeTransition): 52 * dfg/DFGArrayMode.cpp: 53 (JSC::DFG::ArrayMode::fromObserved): 54 (JSC::DFG::ArrayMode::alreadyChecked const): 55 * dfg/DFGArrayMode.h: 56 (JSC::DFG::ArrayMode::structureWouldPassArrayModeFiltering): 57 (JSC::DFG::ArrayMode::arrayModesThatPassFiltering const): 58 (JSC::DFG::ArrayMode::arrayModesWithIndexingShape const): 59 * dfg/DFGOSRExit.cpp: 60 (JSC::DFG::OSRExit::executeOSRExit): 61 (JSC::DFG::OSRExit::compileExit): 62 * dfg/DFGRegisteredStructureSet.cpp: 63 (JSC::DFG::RegisteredStructureSet::filterArrayModes): 64 (JSC::DFG::RegisteredStructureSet::arrayModesFromStructures const): 65 * ftl/FTLOSRExitCompiler.cpp: 66 (JSC::FTL::compileStub): 67 * jit/JITInlines.h: 68 (JSC::JIT::chooseArrayMode): 69 (JSC::arrayProfileSaw): Deleted. 70 * runtime/JSType.h: 71 (JSC::isTypedArrayType): 72 1 73 2019-01-14 Mark Lam <mark.lam@apple.com> 2 74 -
trunk/Source/JavaScriptCore/bytecode/ArrayProfile.cpp
r235827 r239951 38 38 #endif 39 39 40 // Keep in sync with the order of TypedArrayType. 41 const ArrayModes typedArrayModes[NumberOfTypedArrayTypesExcludingDataView] = { 42 Int8ArrayMode, 43 Uint8ArrayMode, 44 Uint8ClampedArrayMode, 45 Int16ArrayMode, 46 Uint16ArrayMode, 47 Int32ArrayMode, 48 Uint32ArrayMode, 49 Float32ArrayMode, 50 Float64ArrayMode, 51 }; 52 40 53 void dumpArrayModes(PrintStream& out, ArrayModes arrayModes) 41 54 { … … 51 64 52 65 CommaPrinter comma("|"); 53 if (arrayModes & asArrayModes (NonArray))66 if (arrayModes & asArrayModesIgnoringTypedArrays(NonArray)) 54 67 out.print(comma, "NonArray"); 55 if (arrayModes & asArrayModes (NonArrayWithInt32))68 if (arrayModes & asArrayModesIgnoringTypedArrays(NonArrayWithInt32)) 56 69 out.print(comma, "NonArrayWithInt32"); 57 if (arrayModes & asArrayModes (NonArrayWithDouble))70 if (arrayModes & asArrayModesIgnoringTypedArrays(NonArrayWithDouble)) 58 71 out.print(comma, "NonArrayWithDouble"); 59 if (arrayModes & asArrayModes (NonArrayWithContiguous))72 if (arrayModes & asArrayModesIgnoringTypedArrays(NonArrayWithContiguous)) 60 73 out.print(comma, "NonArrayWithContiguous"); 61 if (arrayModes & asArrayModes (NonArrayWithArrayStorage))74 if (arrayModes & asArrayModesIgnoringTypedArrays(NonArrayWithArrayStorage)) 62 75 out.print(comma, "NonArrayWithArrayStorage"); 63 if (arrayModes & asArrayModes (NonArrayWithSlowPutArrayStorage))76 if (arrayModes & asArrayModesIgnoringTypedArrays(NonArrayWithSlowPutArrayStorage)) 64 77 out.print(comma, "NonArrayWithSlowPutArrayStorage"); 65 if (arrayModes & asArrayModes (ArrayClass))78 if (arrayModes & asArrayModesIgnoringTypedArrays(ArrayClass)) 66 79 out.print(comma, "ArrayClass"); 67 if (arrayModes & asArrayModes (ArrayWithUndecided))80 if (arrayModes & asArrayModesIgnoringTypedArrays(ArrayWithUndecided)) 68 81 out.print(comma, "ArrayWithUndecided"); 69 if (arrayModes & asArrayModes (ArrayWithInt32))82 if (arrayModes & asArrayModesIgnoringTypedArrays(ArrayWithInt32)) 70 83 out.print(comma, "ArrayWithInt32"); 71 if (arrayModes & asArrayModes (ArrayWithDouble))84 if (arrayModes & asArrayModesIgnoringTypedArrays(ArrayWithDouble)) 72 85 out.print(comma, "ArrayWithDouble"); 73 if (arrayModes & asArrayModes (ArrayWithContiguous))86 if (arrayModes & asArrayModesIgnoringTypedArrays(ArrayWithContiguous)) 74 87 out.print(comma, "ArrayWithContiguous"); 75 if (arrayModes & asArrayModes (ArrayWithArrayStorage))88 if (arrayModes & asArrayModesIgnoringTypedArrays(ArrayWithArrayStorage)) 76 89 out.print(comma, "ArrayWithArrayStorage"); 77 if (arrayModes & asArrayModes (ArrayWithSlowPutArrayStorage))90 if (arrayModes & asArrayModesIgnoringTypedArrays(ArrayWithSlowPutArrayStorage)) 78 91 out.print(comma, "ArrayWithSlowPutArrayStorage"); 79 if (arrayModes & asArrayModes (CopyOnWriteArrayWithInt32))92 if (arrayModes & asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithInt32)) 80 93 out.print(comma, "CopyOnWriteArrayWithInt32"); 81 if (arrayModes & asArrayModes (CopyOnWriteArrayWithDouble))94 if (arrayModes & asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithDouble)) 82 95 out.print(comma, "CopyOnWriteArrayWithDouble"); 83 if (arrayModes & asArrayModes (CopyOnWriteArrayWithContiguous))96 if (arrayModes & asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithContiguous)) 84 97 out.print(comma, "CopyOnWriteArrayWithContiguous"); 85 98 … … 116 129 void ArrayProfile::computeUpdatedPrediction(const ConcurrentJSLocker&, CodeBlock* codeBlock, Structure* lastSeenStructure) 117 130 { 118 m_observedArrayModes |= arrayMode FromStructure(lastSeenStructure);131 m_observedArrayModes |= arrayModesFromStructure(lastSeenStructure); 119 132 120 133 if (!m_didPerformFirstRunPruning 121 134 && hasTwoOrMoreBitsSet(m_observedArrayModes)) { 122 m_observedArrayModes = arrayMode FromStructure(lastSeenStructure);135 m_observedArrayModes = arrayModesFromStructure(lastSeenStructure); 123 136 m_didPerformFirstRunPruning = true; 124 137 } -
trunk/Source/JavaScriptCore/bytecode/ArrayProfile.h
r237547 r239951 59 59 const ArrayModes Float64ArrayMode = 1 << 29; 60 60 61 constexpr ArrayModes asArrayModes(IndexingType indexingMode) 61 extern const ArrayModes typedArrayModes[NumberOfTypedArrayTypesExcludingDataView]; 62 63 constexpr ArrayModes asArrayModesIgnoringTypedArrays(IndexingType indexingMode) 62 64 { 63 65 return static_cast<unsigned>(1) << static_cast<unsigned>(indexingMode); … … 77 79 78 80 #define ALL_NON_ARRAY_ARRAY_MODES \ 79 (asArrayModes (NonArray) \80 | asArrayModes (NonArrayWithInt32) \81 | asArrayModes (NonArrayWithDouble) \82 | asArrayModes (NonArrayWithContiguous) \83 | asArrayModes (NonArrayWithArrayStorage) \84 | asArrayModes (NonArrayWithSlowPutArrayStorage) \81 (asArrayModesIgnoringTypedArrays(NonArray) \ 82 | asArrayModesIgnoringTypedArrays(NonArrayWithInt32) \ 83 | asArrayModesIgnoringTypedArrays(NonArrayWithDouble) \ 84 | asArrayModesIgnoringTypedArrays(NonArrayWithContiguous) \ 85 | asArrayModesIgnoringTypedArrays(NonArrayWithArrayStorage) \ 86 | asArrayModesIgnoringTypedArrays(NonArrayWithSlowPutArrayStorage) \ 85 87 | ALL_TYPED_ARRAY_MODES) 86 88 … … 91 93 92 94 #define ALL_WRITABLE_ARRAY_ARRAY_MODES \ 93 (asArrayModes (ArrayClass) \94 | asArrayModes (ArrayWithUndecided) \95 | asArrayModes (ArrayWithInt32) \96 | asArrayModes (ArrayWithDouble) \97 | asArrayModes (ArrayWithContiguous) \98 | asArrayModes (ArrayWithArrayStorage) \99 | asArrayModes (ArrayWithSlowPutArrayStorage))95 (asArrayModesIgnoringTypedArrays(ArrayClass) \ 96 | asArrayModesIgnoringTypedArrays(ArrayWithUndecided) \ 97 | asArrayModesIgnoringTypedArrays(ArrayWithInt32) \ 98 | asArrayModesIgnoringTypedArrays(ArrayWithDouble) \ 99 | asArrayModesIgnoringTypedArrays(ArrayWithContiguous) \ 100 | asArrayModesIgnoringTypedArrays(ArrayWithArrayStorage) \ 101 | asArrayModesIgnoringTypedArrays(ArrayWithSlowPutArrayStorage)) 100 102 101 103 #define ALL_ARRAY_ARRAY_MODES \ … … 105 107 #define ALL_ARRAY_MODES (ALL_NON_ARRAY_ARRAY_MODES | ALL_ARRAY_ARRAY_MODES) 106 108 107 inline ArrayModes arrayModeFromStructure(Structure* structure) 108 { 109 switch (structure->classInfo()->typedArrayStorageType) { 110 case TypeInt8: 111 return Int8ArrayMode; 112 case TypeUint8: 113 return Uint8ArrayMode; 114 case TypeUint8Clamped: 115 return Uint8ClampedArrayMode; 116 case TypeInt16: 117 return Int16ArrayMode; 118 case TypeUint16: 119 return Uint16ArrayMode; 120 case TypeInt32: 121 return Int32ArrayMode; 122 case TypeUint32: 123 return Uint32ArrayMode; 124 case TypeFloat32: 125 return Float32ArrayMode; 126 case TypeFloat64: 127 return Float64ArrayMode; 128 case TypeDataView: 129 case NotTypedArray: 130 break; 131 } 132 133 return asArrayModes(structure->indexingMode()); 109 inline ArrayModes arrayModesFromStructure(Structure* structure) 110 { 111 JSType type = structure->typeInfo().type(); 112 if (isTypedArrayType(type)) 113 return typedArrayModes[type - FirstTypedArrayType]; 114 return asArrayModesIgnoringTypedArrays(structure->indexingMode()); 134 115 } 135 116 … … 157 138 } 158 139 159 inline bool arrayModesInclude (ArrayModes arrayModes, IndexingType shape)160 { 161 ArrayModes modes = asArrayModes (NonArray | shape) | asArrayModes(ArrayClass | shape);140 inline bool arrayModesIncludeIgnoringTypedArrays(ArrayModes arrayModes, IndexingType shape) 141 { 142 ArrayModes modes = asArrayModesIgnoringTypedArrays(NonArray | shape) | asArrayModesIgnoringTypedArrays(ArrayClass | shape); 162 143 if (hasInt32(shape) || hasDouble(shape) || hasContiguous(shape)) 163 modes |= asArrayModes (ArrayClass | shape | CopyOnWrite);144 modes |= asArrayModesIgnoringTypedArrays(ArrayClass | shape | CopyOnWrite); 164 145 return !!(arrayModes & modes); 165 146 } … … 167 148 inline bool shouldUseSlowPutArrayStorage(ArrayModes arrayModes) 168 149 { 169 return arrayModesInclude (arrayModes, SlowPutArrayStorageShape);150 return arrayModesIncludeIgnoringTypedArrays(arrayModes, SlowPutArrayStorageShape); 170 151 } 171 152 172 153 inline bool shouldUseFastArrayStorage(ArrayModes arrayModes) 173 154 { 174 return arrayModesInclude (arrayModes, ArrayStorageShape);155 return arrayModesIncludeIgnoringTypedArrays(arrayModes, ArrayStorageShape); 175 156 } 176 157 177 158 inline bool shouldUseContiguous(ArrayModes arrayModes) 178 159 { 179 return arrayModesInclude (arrayModes, ContiguousShape);160 return arrayModesIncludeIgnoringTypedArrays(arrayModes, ContiguousShape); 180 161 } 181 162 182 163 inline bool shouldUseDouble(ArrayModes arrayModes) 183 164 { 184 return arrayModesInclude (arrayModes, DoubleShape);165 return arrayModesIncludeIgnoringTypedArrays(arrayModes, DoubleShape); 185 166 } 186 167 187 168 inline bool shouldUseInt32(ArrayModes arrayModes) 188 169 { 189 return arrayModesInclude (arrayModes, Int32Shape);170 return arrayModesIncludeIgnoringTypedArrays(arrayModes, Int32Shape); 190 171 } 191 172 -
trunk/Source/JavaScriptCore/dfg/DFGAbstractValue.cpp
r237325 r239951 41 41 ArrayModes newModes = 0; 42 42 for (unsigned i = vector.size(); i--;) { 43 if (m_arrayModes & a sArrayModes(vector[i].previous->indexingType()))44 newModes |= a sArrayModes(vector[i].next->indexingType());43 if (m_arrayModes & arrayModesFromStructure(vector[i].previous.get())) 44 newModes |= arrayModesFromStructure(vector[i].next.get()); 45 45 } 46 46 m_arrayModes |= newModes; … … 61 61 m_structure.clobber(); 62 62 } else 63 m_arrayModes = a sArrayModes(structure->indexingMode());63 m_arrayModes = arrayModesFromStructure(structure); 64 64 } else { 65 65 m_structure.makeTop(); … … 88 88 89 89 m_structure = structure; 90 m_arrayModes = a sArrayModes(structure->indexingMode());90 m_arrayModes = arrayModesFromStructure(structure.get()); 91 91 m_type = speculationFromStructure(structure.get()); 92 92 m_value = JSValue(); … … 229 229 if (frozenValue->pointsToHeap()) { 230 230 m_structure = graph.registerStructure(frozenValue->structure()); 231 m_arrayModes = a sArrayModes(frozenValue->structure()->indexingMode());231 m_arrayModes = arrayModesFromStructure(frozenValue->structure()); 232 232 } else { 233 233 m_structure.clear(); … … 241 241 if (!!value && value.isCell()) { 242 242 RegisteredStructure structure = graph.registerStructure(value.asCell()->structure(graph.m_vm)); 243 mergeArrayModes(m_arrayModes, a sArrayModes(structure->indexingMode()));243 mergeArrayModes(m_arrayModes, arrayModesFromStructure(structure.get())); 244 244 m_structure.merge(RegisteredStructureSet(structure)); 245 245 } … … 366 366 { 367 367 return couldBeType(speculationFromStructure(structure.get())) 368 && (m_arrayModes & arrayMode FromStructure(structure.get()))368 && (m_arrayModes & arrayModesFromStructure(structure.get())) 369 369 && m_structure.contains(structure); 370 370 } -
trunk/Source/JavaScriptCore/dfg/DFGAbstractValue.h
r237325 r239951 138 138 if (m_type & SpecCell) { 139 139 m_structure.observeTransition(from, to); 140 observeIndexingTypeTransition( from->indexingType(), to->indexingType());140 observeIndexingTypeTransition(arrayModesFromStructure(from.get()), arrayModesFromStructure(to.get())); 141 141 } 142 142 checkConsistency(); … … 398 398 Structure* structure = value.asCell()->structure(); 399 399 return m_structure.contains(structure) 400 && (m_arrayModes & a sArrayModes(structure->indexingMode()));400 && (m_arrayModes & arrayModesFromStructure(structure)); 401 401 } 402 402 … … 493 493 } 494 494 495 void observeIndexingTypeTransition( IndexingType from, IndexingTypeto)496 { 497 if (m_arrayModes & asArrayModes(from))498 m_arrayModes |= asArrayModes(to);495 void observeIndexingTypeTransition(ArrayModes from, ArrayModes to) 496 { 497 if (m_arrayModes & from) 498 m_arrayModes |= to; 499 499 } 500 500 -
trunk/Source/JavaScriptCore/dfg/DFGArrayMode.cpp
r234184 r239951 48 48 Array::Conversion converts; 49 49 50 RELEASE_ASSERT((observed & (asArrayModes (toIndexingShape(type)) | asArrayModes(toIndexingShape(type) | ArrayClass) | asArrayModes(toIndexingShape(type) | ArrayClass | CopyOnWrite))) == observed);51 52 if (observed & asArrayModes (toIndexingShape(type))) {53 if ((observed & asArrayModes (toIndexingShape(type))) == observed)50 RELEASE_ASSERT((observed & (asArrayModesIgnoringTypedArrays(toIndexingShape(type)) | asArrayModesIgnoringTypedArrays(toIndexingShape(type) | ArrayClass) | asArrayModesIgnoringTypedArrays(toIndexingShape(type) | ArrayClass | CopyOnWrite))) == observed); 51 52 if (observed & asArrayModesIgnoringTypedArrays(toIndexingShape(type))) { 53 if ((observed & asArrayModesIgnoringTypedArrays(toIndexingShape(type))) == observed) 54 54 isArray = nonArray; 55 55 else … … 58 58 isArray = Array::Array; 59 59 60 if (action == Array::Write && (observed & asArrayModes (toIndexingShape(type) | ArrayClass | CopyOnWrite)))60 if (action == Array::Write && (observed & asArrayModesIgnoringTypedArrays(toIndexingShape(type) | ArrayClass | CopyOnWrite))) 61 61 converts = Array::Convert; 62 62 else … … 70 70 case 0: 71 71 return ArrayMode(Array::Unprofiled); 72 case asArrayModes (NonArray):72 case asArrayModesIgnoringTypedArrays(NonArray): 73 73 if (action == Array::Write && !profile->mayInterceptIndexedAccesses(locker)) 74 74 return ArrayMode(Array::SelectUsingArguments, nonArray, Array::OutOfBounds, Array::Convert, action); 75 75 return ArrayMode(Array::SelectUsingPredictions, nonArray, action).withSpeculationFromProfile(locker, profile, makeSafe); 76 76 77 case asArrayModes (ArrayWithUndecided):77 case asArrayModesIgnoringTypedArrays(ArrayWithUndecided): 78 78 if (action == Array::Write) 79 79 return ArrayMode(Array::SelectUsingArguments, Array::Array, Array::OutOfBounds, Array::Convert, action); 80 80 return ArrayMode(Array::Undecided, Array::Array, Array::OutOfBounds, Array::AsIs, action).withProfile(locker, profile, makeSafe); 81 81 82 case asArrayModes (NonArray) | asArrayModes(ArrayWithUndecided):82 case asArrayModesIgnoringTypedArrays(NonArray) | asArrayModesIgnoringTypedArrays(ArrayWithUndecided): 83 83 if (action == Array::Write && !profile->mayInterceptIndexedAccesses(locker)) 84 84 return ArrayMode(Array::SelectUsingArguments, Array::PossiblyArray, Array::OutOfBounds, Array::Convert, action); 85 85 return ArrayMode(Array::SelectUsingPredictions, action).withSpeculationFromProfile(locker, profile, makeSafe); 86 86 87 case asArrayModes (NonArrayWithInt32):88 case asArrayModes (ArrayWithInt32):89 case asArrayModes (CopyOnWriteArrayWithInt32):90 case asArrayModes (NonArrayWithInt32) | asArrayModes(ArrayWithInt32):91 case asArrayModes (NonArrayWithInt32) | asArrayModes(CopyOnWriteArrayWithInt32):92 case asArrayModes (ArrayWithInt32) | asArrayModes(CopyOnWriteArrayWithInt32):93 case asArrayModes (NonArrayWithInt32) | asArrayModes(ArrayWithInt32) | asArrayModes(CopyOnWriteArrayWithInt32):87 case asArrayModesIgnoringTypedArrays(NonArrayWithInt32): 88 case asArrayModesIgnoringTypedArrays(ArrayWithInt32): 89 case asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithInt32): 90 case asArrayModesIgnoringTypedArrays(NonArrayWithInt32) | asArrayModesIgnoringTypedArrays(ArrayWithInt32): 91 case asArrayModesIgnoringTypedArrays(NonArrayWithInt32) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithInt32): 92 case asArrayModesIgnoringTypedArrays(ArrayWithInt32) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithInt32): 93 case asArrayModesIgnoringTypedArrays(NonArrayWithInt32) | asArrayModesIgnoringTypedArrays(ArrayWithInt32) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithInt32): 94 94 return handleContiguousModes(Array::Int32, observed); 95 95 96 case asArrayModes (NonArrayWithDouble):97 case asArrayModes (ArrayWithDouble):98 case asArrayModes (CopyOnWriteArrayWithDouble):99 case asArrayModes (NonArrayWithDouble) | asArrayModes(ArrayWithDouble):100 case asArrayModes (NonArrayWithDouble) | asArrayModes(CopyOnWriteArrayWithDouble):101 case asArrayModes (ArrayWithDouble) | asArrayModes(CopyOnWriteArrayWithDouble):102 case asArrayModes (NonArrayWithDouble) | asArrayModes(ArrayWithDouble) | asArrayModes(CopyOnWriteArrayWithDouble):96 case asArrayModesIgnoringTypedArrays(NonArrayWithDouble): 97 case asArrayModesIgnoringTypedArrays(ArrayWithDouble): 98 case asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithDouble): 99 case asArrayModesIgnoringTypedArrays(NonArrayWithDouble) | asArrayModesIgnoringTypedArrays(ArrayWithDouble): 100 case asArrayModesIgnoringTypedArrays(NonArrayWithDouble) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithDouble): 101 case asArrayModesIgnoringTypedArrays(ArrayWithDouble) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithDouble): 102 case asArrayModesIgnoringTypedArrays(NonArrayWithDouble) | asArrayModesIgnoringTypedArrays(ArrayWithDouble) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithDouble): 103 103 return handleContiguousModes(Array::Double, observed); 104 104 105 case asArrayModes (NonArrayWithContiguous):106 case asArrayModes (ArrayWithContiguous):107 case asArrayModes (CopyOnWriteArrayWithContiguous):108 case asArrayModes (NonArrayWithContiguous) | asArrayModes(ArrayWithContiguous):109 case asArrayModes (NonArrayWithContiguous) | asArrayModes(CopyOnWriteArrayWithContiguous):110 case asArrayModes (ArrayWithContiguous) | asArrayModes(CopyOnWriteArrayWithContiguous):111 case asArrayModes (NonArrayWithContiguous) | asArrayModes(ArrayWithContiguous) | asArrayModes(CopyOnWriteArrayWithContiguous):105 case asArrayModesIgnoringTypedArrays(NonArrayWithContiguous): 106 case asArrayModesIgnoringTypedArrays(ArrayWithContiguous): 107 case asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithContiguous): 108 case asArrayModesIgnoringTypedArrays(NonArrayWithContiguous) | asArrayModesIgnoringTypedArrays(ArrayWithContiguous): 109 case asArrayModesIgnoringTypedArrays(NonArrayWithContiguous) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithContiguous): 110 case asArrayModesIgnoringTypedArrays(ArrayWithContiguous) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithContiguous): 111 case asArrayModesIgnoringTypedArrays(NonArrayWithContiguous) | asArrayModesIgnoringTypedArrays(ArrayWithContiguous) | asArrayModesIgnoringTypedArrays(CopyOnWriteArrayWithContiguous): 112 112 return handleContiguousModes(Array::Contiguous, observed); 113 113 114 case asArrayModes (NonArrayWithArrayStorage):114 case asArrayModesIgnoringTypedArrays(NonArrayWithArrayStorage): 115 115 return ArrayMode(Array::ArrayStorage, nonArray, Array::AsIs, action).withProfile(locker, profile, makeSafe); 116 case asArrayModes (NonArrayWithSlowPutArrayStorage):117 case asArrayModes (NonArrayWithArrayStorage) | asArrayModes(NonArrayWithSlowPutArrayStorage):116 case asArrayModesIgnoringTypedArrays(NonArrayWithSlowPutArrayStorage): 117 case asArrayModesIgnoringTypedArrays(NonArrayWithArrayStorage) | asArrayModesIgnoringTypedArrays(NonArrayWithSlowPutArrayStorage): 118 118 return ArrayMode(Array::SlowPutArrayStorage, nonArray, Array::AsIs, action).withProfile(locker, profile, makeSafe); 119 case asArrayModes (ArrayWithArrayStorage):119 case asArrayModesIgnoringTypedArrays(ArrayWithArrayStorage): 120 120 return ArrayMode(Array::ArrayStorage, Array::Array, Array::AsIs, action).withProfile(locker, profile, makeSafe); 121 case asArrayModes (ArrayWithSlowPutArrayStorage):122 case asArrayModes (ArrayWithArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage):121 case asArrayModesIgnoringTypedArrays(ArrayWithSlowPutArrayStorage): 122 case asArrayModesIgnoringTypedArrays(ArrayWithArrayStorage) | asArrayModesIgnoringTypedArrays(ArrayWithSlowPutArrayStorage): 123 123 return ArrayMode(Array::SlowPutArrayStorage, Array::Array, Array::AsIs, action).withProfile(locker, profile, makeSafe); 124 case asArrayModes (NonArrayWithArrayStorage) | asArrayModes(ArrayWithArrayStorage):124 case asArrayModesIgnoringTypedArrays(NonArrayWithArrayStorage) | asArrayModesIgnoringTypedArrays(ArrayWithArrayStorage): 125 125 return ArrayMode(Array::ArrayStorage, Array::PossiblyArray, Array::AsIs, action).withProfile(locker, profile, makeSafe); 126 case asArrayModes (NonArrayWithSlowPutArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage):127 case asArrayModes (NonArrayWithArrayStorage) | asArrayModes(ArrayWithArrayStorage) | asArrayModes(NonArrayWithSlowPutArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage):126 case asArrayModesIgnoringTypedArrays(NonArrayWithSlowPutArrayStorage) | asArrayModesIgnoringTypedArrays(ArrayWithSlowPutArrayStorage): 127 case asArrayModesIgnoringTypedArrays(NonArrayWithArrayStorage) | asArrayModesIgnoringTypedArrays(ArrayWithArrayStorage) | asArrayModesIgnoringTypedArrays(NonArrayWithSlowPutArrayStorage) | asArrayModesIgnoringTypedArrays(ArrayWithSlowPutArrayStorage): 128 128 return ArrayMode(Array::SlowPutArrayStorage, Array::PossiblyArray, Array::AsIs, action).withProfile(locker, profile, makeSafe); 129 129 case Int8ArrayMode: … … 151 151 return ArrayMode(Array::Generic, nonArray, Array::AsIs, action).withProfile(locker, profile, makeSafe); 152 152 153 if ((observed & asArrayModes (NonArray)) && profile->mayInterceptIndexedAccesses(locker))153 if ((observed & asArrayModesIgnoringTypedArrays(NonArray)) && profile->mayInterceptIndexedAccesses(locker)) 154 154 return ArrayMode(Array::SelectUsingPredictions).withSpeculationFromProfile(locker, profile, makeSafe); 155 155 … … 439 439 440 440 case Array::Array: { 441 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModes (shape | IsArray)))441 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModesIgnoringTypedArrays(shape | IsArray))) 442 442 return true; 443 443 if (value.m_structure.isTop()) … … 456 456 457 457 default: { 458 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModes (shape) | asArrayModes(shape | IsArray)))458 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModesIgnoringTypedArrays(shape) | asArrayModesIgnoringTypedArrays(shape | IsArray))) 459 459 return true; 460 460 if (value.m_structure.isTop()) … … 506 506 507 507 case Array::Array: { 508 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModes (ArrayWithArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage)))508 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModesIgnoringTypedArrays(ArrayWithArrayStorage) | asArrayModesIgnoringTypedArrays(ArrayWithSlowPutArrayStorage))) 509 509 return true; 510 510 if (value.m_structure.isTop()) … … 521 521 522 522 default: { 523 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModes (NonArrayWithArrayStorage) | asArrayModes(ArrayWithArrayStorage) | asArrayModes(NonArrayWithSlowPutArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage)))523 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModesIgnoringTypedArrays(NonArrayWithArrayStorage) | asArrayModesIgnoringTypedArrays(ArrayWithArrayStorage) | asArrayModesIgnoringTypedArrays(NonArrayWithSlowPutArrayStorage) | asArrayModesIgnoringTypedArrays(ArrayWithSlowPutArrayStorage))) 524 524 return true; 525 525 if (value.m_structure.isTop()) -
trunk/Source/JavaScriptCore/dfg/DFGArrayMode.h
r234184 r239951 421 421 bool structureWouldPassArrayModeFiltering(Structure* structure) 422 422 { 423 return arrayModesAlreadyChecked(arrayMode FromStructure(structure), arrayModesThatPassFiltering());423 return arrayModesAlreadyChecked(arrayModesFromStructure(structure), arrayModesThatPassFiltering()); 424 424 } 425 425 … … 446 446 case Array::ScopedArguments: 447 447 return arrayModesWithIndexingShapes(ArrayStorageShape, NonArray); 448 default: 449 return asArrayModes(NonArray); 448 case Array::Int8Array: 449 return Int8ArrayMode; 450 case Array::Int16Array: 451 return Int16ArrayMode; 452 case Array::Int32Array: 453 return Int32ArrayMode; 454 case Array::Uint8Array: 455 return Uint8ArrayMode; 456 case Array::Uint8ClampedArray: 457 return Uint8ClampedArrayMode; 458 case Array::Uint16Array: 459 return Uint16ArrayMode; 460 case Array::Uint32Array: 461 return Uint32ArrayMode; 462 case Array::Float32Array: 463 return Float32ArrayMode; 464 case Array::Float64Array: 465 return Float64ArrayMode; 466 case Array::AnyTypedArray: 467 return ALL_TYPED_ARRAY_MODES; 468 default: 469 return asArrayModesIgnoringTypedArrays(NonArray); 450 470 } 451 471 … … 498 518 case Array::NonArray: 499 519 case Array::OriginalNonArray: 500 return asArrayModes (shape);520 return asArrayModesIgnoringTypedArrays(shape); 501 521 case Array::OriginalCopyOnWriteArray: 502 522 ASSERT(hasInt32(shape) || hasDouble(shape) || hasContiguous(shape)); 503 return asArrayModes (shape | IsArray) | asArrayModes(shape | IsArray | CopyOnWrite);523 return asArrayModesIgnoringTypedArrays(shape | IsArray) | asArrayModesIgnoringTypedArrays(shape | IsArray | CopyOnWrite); 504 524 case Array::Array: 505 525 if (hasInt32(shape) || hasDouble(shape) || hasContiguous(shape)) 506 return asArrayModes (shape | IsArray) | asArrayModes(shape | IsArray | CopyOnWrite);526 return asArrayModesIgnoringTypedArrays(shape | IsArray) | asArrayModesIgnoringTypedArrays(shape | IsArray | CopyOnWrite); 507 527 FALLTHROUGH; 508 528 case Array::OriginalArray: 509 return asArrayModes (shape | IsArray);529 return asArrayModesIgnoringTypedArrays(shape | IsArray); 510 530 case Array::PossiblyArray: 511 531 if (hasInt32(shape) || hasDouble(shape) || hasContiguous(shape)) 512 return asArrayModes (shape) | asArrayModes(shape | IsArray) | asArrayModes(shape | IsArray | CopyOnWrite);513 return asArrayModes (shape) | asArrayModes(shape | IsArray);532 return asArrayModesIgnoringTypedArrays(shape) | asArrayModesIgnoringTypedArrays(shape | IsArray) | asArrayModesIgnoringTypedArrays(shape | IsArray | CopyOnWrite); 533 return asArrayModesIgnoringTypedArrays(shape) | asArrayModesIgnoringTypedArrays(shape | IsArray); 514 534 default: 515 535 // This is only necessary for C++ compilers that don't understand enums. -
trunk/Source/JavaScriptCore/dfg/DFGOSRExit.cpp
r239867 r239951 508 508 Structure* structure = profiledValue.asCell()->structure(vm); 509 509 arrayProfile->observeStructure(structure); 510 arrayProfile->observeArrayMode(a sArrayModes(structure->indexingMode()));510 arrayProfile->observeArrayMode(arrayModesFromStructure(structure)); 511 511 } 512 512 if (extraInitializationLevel <= ExtraInitializationLevel::ArrayProfileUpdate) … … 1186 1186 jit.load32(AssemblyHelpers::Address(value, JSCell::structureIDOffset()), scratch1); 1187 1187 jit.store32(scratch1, arrayProfile->addressOfLastSeenStructureID()); 1188 1189 jit.load8(AssemblyHelpers::Address(value, JSCell::typeInfoTypeOffset()), scratch2); 1190 jit.sub32(AssemblyHelpers::TrustedImm32(FirstTypedArrayType), scratch2); 1191 auto notTypedArray = jit.branch32(MacroAssembler::AboveOrEqual, scratch2, AssemblyHelpers::TrustedImm32(NumberOfTypedArrayTypesExcludingDataView)); 1192 jit.move(AssemblyHelpers::TrustedImmPtr(typedArrayModes), scratch1); 1193 jit.load32(AssemblyHelpers::BaseIndex(scratch1, scratch2, AssemblyHelpers::TimesFour), scratch2); 1194 auto storeArrayModes = jit.jump(); 1195 1196 notTypedArray.link(&jit); 1188 1197 #if USE(JSVALUE64) 1189 1198 jit.load8(AssemblyHelpers::Address(value, JSCell::indexingTypeAndMiscOffset()), scratch1); … … 1194 1203 jit.move(AssemblyHelpers::TrustedImm32(1), scratch2); 1195 1204 jit.lshift32(scratch1, scratch2); 1205 storeArrayModes.link(&jit); 1196 1206 jit.or32(scratch2, AssemblyHelpers::AbsoluteAddress(arrayProfile->addressOfArrayModes())); 1197 1207 -
trunk/Source/JavaScriptCore/dfg/DFGRegisteredStructureSet.cpp
r237325 r239951 54 54 genericFilter( 55 55 [&] (RegisteredStructure structure) -> bool { 56 return arrayModes & arrayMode FromStructure(structure.get());56 return arrayModes & arrayModesFromStructure(structure.get()); 57 57 }); 58 58 } … … 80 80 forEach( 81 81 [&] (RegisteredStructure structure) { 82 mergeArrayModes(result, a sArrayModes(structure->indexingMode()));82 mergeArrayModes(result, arrayModesFromStructure(structure.get())); 83 83 }); 84 84 return result; -
trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp
r234331 r239951 278 278 jit.load32(MacroAssembler::Address(GPRInfo::regT0, JSCell::structureIDOffset()), GPRInfo::regT1); 279 279 jit.store32(GPRInfo::regT1, arrayProfile->addressOfLastSeenStructureID()); 280 281 jit.load8(MacroAssembler::Address(GPRInfo::regT0, JSCell::typeInfoTypeOffset()), GPRInfo::regT2); 282 jit.sub32(MacroAssembler::TrustedImm32(FirstTypedArrayType), GPRInfo::regT2); 283 auto notTypedArray = jit.branch32(MacroAssembler::AboveOrEqual, GPRInfo::regT2, MacroAssembler::TrustedImm32(NumberOfTypedArrayTypesExcludingDataView)); 284 jit.move(MacroAssembler::TrustedImmPtr(typedArrayModes), GPRInfo::regT1); 285 jit.load32(MacroAssembler::BaseIndex(GPRInfo::regT1, GPRInfo::regT2, MacroAssembler::TimesFour), GPRInfo::regT2); 286 auto storeArrayModes = jit.jump(); 287 288 notTypedArray.link(&jit); 280 289 jit.load8(MacroAssembler::Address(GPRInfo::regT0, JSCell::indexingTypeAndMiscOffset()), GPRInfo::regT1); 281 290 jit.and32(MacroAssembler::TrustedImm32(IndexingModeMask), GPRInfo::regT1); 282 291 jit.move(MacroAssembler::TrustedImm32(1), GPRInfo::regT2); 283 292 jit.lshift32(GPRInfo::regT1, GPRInfo::regT2); 293 storeArrayModes.link(&jit); 284 294 jit.or32(GPRInfo::regT2, MacroAssembler::AbsoluteAddress(arrayProfile->addressOfArrayModes())); 285 295 } -
trunk/Source/JavaScriptCore/jit/JITInlines.h
r239626 r239951 365 365 } 366 366 367 static inline bool arrayProfileSaw(ArrayModes arrayModes, IndexingType capability)368 {369 return arrayModesInclude(arrayModes, capability);370 }371 372 367 inline JITArrayMode JIT::chooseArrayMode(ArrayProfile* profile) 373 368 { 369 auto arrayProfileSaw = [] (ArrayModes arrayModes, IndexingType capability) { 370 return arrayModesIncludeIgnoringTypedArrays(arrayModes, capability); 371 }; 372 374 373 ConcurrentJSLocker locker(m_codeBlock->m_lock); 375 374 profile->computeUpdatedPrediction(locker, m_codeBlock); -
trunk/Source/JavaScriptCore/runtime/JSType.h
r237547 r239951 118 118 }; 119 119 120 static const uint32_t FirstTypedArrayType = Int8ArrayType;121 static const uint32_t LastTypedArrayType = DataViewType;120 static constexpr uint32_t FirstTypedArrayType = Int8ArrayType; 121 static constexpr uint32_t LastTypedArrayType = DataViewType; 122 122 123 123 // LastObjectType should be MaxJSType (not LastJSCObjectType) since embedders can add their extended object types after the enums listed in JSType. 124 static const uint32_t FirstObjectType = ObjectType;125 static const uint32_t LastObjectType = MaxJSType;124 static constexpr uint32_t FirstObjectType = ObjectType; 125 static constexpr uint32_t LastObjectType = MaxJSType; 126 126 127 127 static constexpr uint32_t NumberOfTypedArrayTypes = LastTypedArrayType - FirstTypedArrayType + 1; … … 130 130 static_assert(sizeof(JSType) == sizeof(uint8_t), "sizeof(JSType) is one byte."); 131 131 static_assert(LastJSCObjectType < 128, "The highest bit is reserved for embedder's extension."); 132 133 inline constexpr bool isTypedArrayType(JSType type) 134 { 135 return (static_cast<uint32_t>(type) - FirstTypedArrayType) < NumberOfTypedArrayTypesExcludingDataView; 136 } 132 137 133 138 } // namespace JSC
Note: See TracChangeset
for help on using the changeset viewer.