Changeset 144973 in webkit for trunk/Source/JavaScriptCore/dfg/DFGCSEPhase.cpp
- Timestamp:
- Mar 6, 2013, 1:23:39 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGCSEPhase.cpp
r144939 r144973 36 36 namespace JSC { namespace DFG { 37 37 38 enum CSEMode { NormalCSE, StoreElimination }; 39 40 template<CSEMode cseMode> 38 41 class CSEPhase : public Phase { 39 42 public: 40 43 CSEPhase(Graph& graph) 41 : Phase(graph, "common subexpressionelimination")44 : Phase(graph, cseMode == NormalCSE ? "common subexpression elimination" : "store elimination") 42 45 { 43 46 } … … 45 48 bool run() 46 49 { 50 ASSERT((cseMode == NormalCSE) == (m_graph.m_fixpointState == FixpointNotConverged)); 51 ASSERT(m_graph.m_fixpointState != BeforeFixpoint); 52 47 53 m_changed = false; 48 54 … … 1012 1018 void performNodeCSE(Node* node) 1013 1019 { 1014 m_graph.performSubstitution(node); 1020 if (cseMode == NormalCSE) 1021 m_graph.performSubstitution(node); 1015 1022 1016 1023 if (node->op() == SetLocal) … … 1033 1040 1034 1041 case Identity: 1042 if (cseMode == StoreElimination) 1043 break; 1035 1044 setReplacement(node->child1().node()); 1036 1045 break; … … 1070 1079 case CompareEqConstant: 1071 1080 case ValueToInt32: 1081 if (cseMode == StoreElimination) 1082 break; 1072 1083 setReplacement(pureCSE(node)); 1073 1084 break; … … 1075 1086 case Int32ToDouble: 1076 1087 case ForwardInt32ToDouble: 1088 if (cseMode == StoreElimination) 1089 break; 1077 1090 setReplacement(int32ToDoubleCSE(node)); 1078 1091 break; 1079 1092 1080 1093 case GetCallee: 1094 if (cseMode == StoreElimination) 1095 break; 1081 1096 setReplacement(getCalleeLoadElimination(node->codeOrigin.inlineCallFrame)); 1082 1097 break; 1083 1098 1084 1099 case GetLocal: { 1100 if (cseMode == StoreElimination) 1101 break; 1085 1102 VariableAccessData* variableAccessData = node->variableAccessData(); 1086 1103 if (!variableAccessData->isCaptured()) … … 1109 1126 1110 1127 case GetLocalUnlinked: { 1128 if (cseMode == StoreElimination) 1129 break; 1111 1130 Node* relevantLocalOpIgnored; 1112 1131 setReplacement(getLocalLoadElimination(node->unlinkedLocal(), relevantLocalOpIgnored, true)); … … 1123 1142 // FIXME: We should be able to remove SetLocals that can exit; we just need 1124 1143 // to replace them with appropriate type checks. 1125 if ( m_graph.m_fixpointState == FixpointNotConverged) {1144 if (cseMode == NormalCSE) { 1126 1145 // Need to be conservative at this time; if the SetLocal has any chance of performing 1127 1146 // any speculations then we cannot do anything. … … 1160 1179 1161 1180 case JSConstant: 1181 if (cseMode == StoreElimination) 1182 break; 1162 1183 // This is strange, but necessary. Some phases will convert nodes to constants, 1163 1184 // which may result in duplicated constants. We use CSE to clean this up. … … 1166 1187 1167 1188 case WeakJSConstant: 1189 if (cseMode == StoreElimination) 1190 break; 1168 1191 // FIXME: have CSE for weak constants against strong constants and vice-versa. 1169 1192 setReplacement(weakConstantCSE(node)); … … 1171 1194 1172 1195 case GetArrayLength: 1196 if (cseMode == StoreElimination) 1197 break; 1173 1198 setReplacement(getArrayLengthElimination(node->child1().node())); 1174 1199 break; 1175 1200 1176 1201 case GetMyScope: 1202 if (cseMode == StoreElimination) 1203 break; 1177 1204 setReplacement(getMyScopeLoadElimination(node->codeOrigin.inlineCallFrame)); 1178 1205 break; … … 1186 1213 case CompareGreaterEq: 1187 1214 case CompareEq: { 1215 if (cseMode == StoreElimination) 1216 break; 1188 1217 if (m_graph.isPredictedNumerical(node)) { 1189 1218 Node* replacement = pureCSE(node); … … 1197 1226 // optimize them provided that some subtle conditions are met. 1198 1227 case GetGlobalVar: 1228 if (cseMode == StoreElimination) 1229 break; 1199 1230 setReplacement(globalVarLoadElimination(node->registerPointer())); 1200 1231 break; 1201 1232 1202 1233 case GetScopedVar: { 1234 if (cseMode == StoreElimination) 1235 break; 1203 1236 setReplacement(scopedVarLoadElimination(node->child1().node(), node->varNumber())); 1204 1237 break; … … 1206 1239 1207 1240 case GlobalVarWatchpoint: 1241 if (cseMode == StoreElimination) 1242 break; 1208 1243 if (globalVarWatchpointElimination(node->registerPointer())) 1209 1244 eliminate(); … … 1212 1247 case PutGlobalVar: 1213 1248 case PutGlobalVarCheck: 1214 if ( m_graph.m_fixpointState == FixpointNotConverged)1249 if (cseMode == NormalCSE) 1215 1250 break; 1216 1251 eliminate(globalVarStoreElimination(node->registerPointer())); … … 1218 1253 1219 1254 case PutScopedVar: { 1220 if ( m_graph.m_fixpointState == FixpointNotConverged)1255 if (cseMode == NormalCSE) 1221 1256 break; 1222 1257 eliminate(scopedVarStoreElimination(node->child1().node(), node->child2().node(), node->varNumber())); … … 1225 1260 1226 1261 case GetByVal: 1262 if (cseMode == StoreElimination) 1263 break; 1227 1264 if (m_graph.byValIsPure(node)) 1228 1265 setReplacement(getByValLoadElimination(node->child1().node(), node->child2().node())); … … 1230 1267 1231 1268 case PutByVal: { 1269 if (cseMode == StoreElimination) 1270 break; 1232 1271 Edge child1 = m_graph.varArgChild(node, 0); 1233 1272 Edge child2 = m_graph.varArgChild(node, 1); … … 1243 1282 case CheckStructure: 1244 1283 case ForwardCheckStructure: 1284 if (cseMode == StoreElimination) 1285 break; 1245 1286 if (checkStructureElimination(node->structureSet(), node->child1().node())) 1246 1287 eliminate(); … … 1249 1290 case StructureTransitionWatchpoint: 1250 1291 case ForwardStructureTransitionWatchpoint: 1292 if (cseMode == StoreElimination) 1293 break; 1251 1294 if (structureTransitionWatchpointElimination(node->structure(), node->child1().node())) 1252 1295 eliminate(); … … 1254 1297 1255 1298 case PutStructure: 1256 if ( m_graph.m_fixpointState == FixpointNotConverged)1299 if (cseMode == NormalCSE) 1257 1300 break; 1258 1301 eliminate(putStructureStoreElimination(node->child1().node()), PhantomPutStructure); … … 1260 1303 1261 1304 case CheckFunction: 1305 if (cseMode == StoreElimination) 1306 break; 1262 1307 if (checkFunctionElimination(node->function(), node->child1().node())) 1263 1308 eliminate(); … … 1265 1310 1266 1311 case CheckExecutable: 1312 if (cseMode == StoreElimination) 1313 break; 1267 1314 if (checkExecutableElimination(node->executable(), node->child1().node())) 1268 1315 eliminate(); … … 1270 1317 1271 1318 case CheckArray: 1319 if (cseMode == StoreElimination) 1320 break; 1272 1321 if (checkArrayElimination(node->child1().node(), node->arrayMode())) 1273 1322 eliminate(); … … 1275 1324 1276 1325 case GetIndexedPropertyStorage: { 1326 if (cseMode == StoreElimination) 1327 break; 1277 1328 setReplacement(getIndexedPropertyStorageLoadElimination(node->child1().node(), node->arrayMode())); 1278 1329 break; … … 1280 1331 1281 1332 case GetButterfly: 1333 if (cseMode == StoreElimination) 1334 break; 1282 1335 setReplacement(getPropertyStorageLoadElimination(node->child1().node())); 1283 1336 break; 1284 1337 1285 1338 case GetByOffset: 1339 if (cseMode == StoreElimination) 1340 break; 1286 1341 setReplacement(getByOffsetLoadElimination(m_graph.m_storageAccessData[node->storageAccessDataIndex()].identifierNumber, node->child1().node())); 1287 1342 break; 1288 1343 1289 1344 case PutByOffset: 1290 if ( m_graph.m_fixpointState == FixpointNotConverged)1345 if (cseMode == NormalCSE) 1291 1346 break; 1292 1347 eliminate(putByOffsetStoreElimination(m_graph.m_storageAccessData[node->storageAccessDataIndex()].identifierNumber, node->child1().node())); … … 1351 1406 performNodeCSE(m_currentNode); 1352 1407 } 1408 1409 if (!ASSERT_DISABLED && cseMode == StoreElimination) { 1410 // Nobody should have replacements set. 1411 for (unsigned i = 0; i < block->size(); ++i) 1412 ASSERT(!block->at(i)->replacement); 1413 } 1353 1414 } 1354 1415 … … 1363 1424 { 1364 1425 SamplingRegion samplingRegion("DFG CSE Phase"); 1365 return runPhase<CSEPhase >(graph);1426 return runPhase<CSEPhase<NormalCSE> >(graph); 1366 1427 } 1367 1428 1429 bool performStoreElimination(Graph& graph) 1430 { 1431 SamplingRegion samplingRegion("DFG Store Elimination Phase"); 1432 return runPhase<CSEPhase<StoreElimination> >(graph); 1433 } 1434 1368 1435 } } // namespace JSC::DFG 1369 1436
Note:
See TracChangeset
for help on using the changeset viewer.