Changeset 196726 in webkit for trunk/Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp
- Timestamp:
- Feb 17, 2016, 3:35:11 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp
r195585 r196726 1204 1204 // call executeNode() before we optimize. 1205 1205 switch (node->op()) { 1206 case ArithAbs: { 1207 if (node->child1().useKind() != Int32Use) 1208 break; 1209 1210 auto iter = m_relationships.find(node->child1().node()); 1211 if (iter == m_relationships.end()) 1212 break; 1213 1214 int minValue = std::numeric_limits<int>::min(); 1215 int maxValue = std::numeric_limits<int>::max(); 1216 for (Relationship relationship : iter->value) { 1217 minValue = std::max(minValue, relationship.minValueOfLeft()); 1218 maxValue = std::min(maxValue, relationship.maxValueOfLeft()); 1219 } 1220 1221 executeNode(block->at(nodeIndex)); 1222 1223 if (minValue >= 0) { 1224 node->convertToIdentityOn(node->child1().node()); 1225 changed = true; 1226 break; 1227 } 1228 if (maxValue <= 0) { 1229 node->convertToArithNegate(); 1230 if (minValue > std::numeric_limits<int>::min()) 1231 node->setArithMode(Arith::Unchecked); 1232 changed = true; 1233 break; 1234 } 1235 if (minValue > std::numeric_limits<int>::min()) { 1236 node->setArithMode(Arith::Unchecked); 1237 changed = true; 1238 break; 1239 } 1240 1241 break; 1242 } 1206 1243 case ArithAdd: { 1207 1244 if (!node->isBinaryUseKind(Int32Use)) … … 1308 1345 setRelationship(Relationship::safeCreate(node->child1().node(), node->child2().node(), Relationship::LessThan)); 1309 1346 setRelationship(Relationship::safeCreate(node->child1().node(), m_zero, Relationship::GreaterThan, -1)); 1347 break; 1348 } 1349 1350 case ArithAbs: { 1351 if (node->child1().useKind() != Int32Use) 1352 break; 1353 setRelationship(Relationship(node, m_zero, Relationship::GreaterThan, -1)); 1310 1354 break; 1311 1355 }
Note:
See TracChangeset
for help on using the changeset viewer.