Changeset 222675 in webkit for trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
- Timestamp:
- Sep 29, 2017, 6:16:52 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
r222658 r222675 1009 1009 // array-related - so if refine() turned this into a "Generic" ArrayPush then 1010 1010 // that would break things. 1011 node->setArrayMode( 1012 node->arrayMode().refine( 1013 m_graph, node, 1014 node->child1()->prediction() & SpecCell, 1015 SpecInt32Only, 1016 node->child2()->prediction())); 1017 blessArrayOperation(node->child1(), Edge(), node->child3()); 1018 fixEdge<KnownCellUse>(node->child1()); 1019 1020 switch (node->arrayMode().type()) { 1021 case Array::Int32: 1022 fixEdge<Int32Use>(node->child2()); 1023 break; 1024 case Array::Double: 1025 fixEdge<DoubleRepRealUse>(node->child2()); 1026 break; 1027 case Array::Contiguous: 1028 case Array::ArrayStorage: 1029 speculateForBarrier(node->child2()); 1030 break; 1031 default: 1032 break; 1011 Edge& storageEdge = m_graph.varArgChild(node, 0); 1012 Edge& arrayEdge = m_graph.varArgChild(node, 1); 1013 unsigned elementOffset = 2; 1014 unsigned elementCount = node->numChildren() - elementOffset; 1015 for (unsigned i = 0; i < elementCount; ++i) { 1016 Edge& element = m_graph.varArgChild(node, i + elementOffset); 1017 node->setArrayMode( 1018 node->arrayMode().refine( 1019 m_graph, node, 1020 arrayEdge->prediction() & SpecCell, 1021 SpecInt32Only, 1022 element->prediction())); 1023 } 1024 blessArrayOperation(arrayEdge, Edge(), storageEdge); 1025 fixEdge<KnownCellUse>(arrayEdge); 1026 1027 // Convert `array.push()` to GetArrayLength. 1028 if (!elementCount && node->arrayMode().supportsSelfLength()) { 1029 node->setOpAndDefaultFlags(GetArrayLength); 1030 node->child1() = arrayEdge; 1031 node->child2() = storageEdge; 1032 fixEdge<KnownCellUse>(node->child1()); 1033 break; 1034 } 1035 1036 // We do not want to perform osr exit and retry for ArrayPush. We insert Check with appropriate type, 1037 // and ArrayPush uses the edge as known typed edge. Therefore, ArrayPush do not need to perform type checks. 1038 for (unsigned i = 0; i < elementCount; ++i) { 1039 Edge& element = m_graph.varArgChild(node, i + elementOffset); 1040 switch (node->arrayMode().type()) { 1041 case Array::Int32: 1042 insertCheck<Int32Use>(element.node()); 1043 fixEdge<KnownInt32Use>(element); 1044 break; 1045 case Array::Double: 1046 insertCheck<DoubleRepRealUse>(element.node()); 1047 fixEdge<DoubleRepUse>(element); 1048 break; 1049 case Array::Contiguous: 1050 case Array::ArrayStorage: 1051 speculateForBarrier(element); 1052 break; 1053 default: 1054 break; 1055 } 1056 ASSERT(shouldNotHaveTypeCheck(element.useKind())); 1033 1057 } 1034 1058 break;
Note:
See TracChangeset
for help on using the changeset viewer.