OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 interface OptimizationPhase { | 5 interface OptimizationPhase { |
6 String get name(); | 6 String get name(); |
7 void visitGraph(HGraph graph); | 7 void visitGraph(HGraph graph); |
8 } | 8 } |
9 | 9 |
10 class SsaOptimizerTask extends CompilerTask { | 10 class SsaOptimizerTask extends CompilerTask { |
(...skipping 1259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1270 void visitGraph(HGraph visitee) { | 1270 void visitGraph(HGraph visitee) { |
1271 graph = visitee; | 1271 graph = visitee; |
1272 if (compiler.phase == Compiler.PHASE_RECOMPILING) { | 1272 if (compiler.phase == Compiler.PHASE_RECOMPILING) { |
1273 visitDominatorTree(visitee); | 1273 visitDominatorTree(visitee); |
1274 } | 1274 } |
1275 } | 1275 } |
1276 | 1276 |
1277 void handleFieldGet(HFieldGet field, HType type) { | 1277 void handleFieldGet(HFieldGet field, HType type) { |
1278 assert(compiler.phase == Compiler.PHASE_RECOMPILING); | 1278 assert(compiler.phase == Compiler.PHASE_RECOMPILING); |
1279 if (!type.isConflicting()) { | 1279 if (!type.isConflicting()) { |
| 1280 // If there are no invoked setters with this name, the union of |
| 1281 // the types of the initializers and the setters is guaranteed |
| 1282 // otherwise it is only speculative. |
1280 Element element = field.element; | 1283 Element element = field.element; |
1281 // Check if optimistic type is based on a setter in the | 1284 assert(!element.isGenerativeConstructorBody()); |
1282 // constructor body. | 1285 if (!compiler.codegenWorld.hasInvokedSetter(element, compiler)) { |
1283 if (backend.hasConstructorBodyFieldSetter(element)) { | 1286 field.guaranteedType = |
1284 // If there are no other field setters then the one in | 1287 type.union(backend.fieldSettersTypeSoFar(element)); |
1285 // the constructor body, the type is guaranteed for this | |
1286 // field after construction. | |
1287 assert(!element.isGenerativeConstructorBody()); | |
1288 if (!compiler.codegenWorld.hasInvokedSetter(element, compiler)) { | |
1289 field.guaranteedType = | |
1290 type.union(backend.fieldSettersTypeSoFar(element)); | |
1291 } else { | |
1292 field.propagatedType = | |
1293 type.union(backend.fieldSettersTypeSoFar(element)); | |
1294 } | |
1295 } else { | 1288 } else { |
1296 // If there are no setters the initializer list type is | 1289 field.propagatedType = |
1297 // guaranteed to remain constant. | 1290 type.union(backend.fieldSettersTypeSoFar(element)); |
1298 // | |
1299 // TODO(ager): Why is this treated differently from the | |
1300 // case above? It seems to me that we could/should use | |
1301 // the union of the types for the field setters and the | |
1302 // initializer list here? It would give the same when | |
1303 // there are none and potentially better information for | |
1304 // more cases. | |
1305 if (!compiler.codegenWorld.hasFieldSetter(element, compiler) && | |
1306 !compiler.codegenWorld.hasInvokedSetter(element, compiler)) { | |
1307 field.guaranteedType = type; | |
1308 } else { | |
1309 field.propagatedType = type; | |
1310 } | |
1311 } | 1291 } |
1312 } | 1292 } |
1313 } | 1293 } |
1314 | 1294 |
1315 void handleFieldNumberOperation(HFieldGet field, HType type) { | 1295 void handleFieldNumberOperation(HFieldGet field, HType type) { |
1316 assert(compiler.phase == Compiler.PHASE_RECOMPILING); | 1296 assert(compiler.phase == Compiler.PHASE_RECOMPILING); |
1317 if (compiler.codegenWorld.hasInvokedSetter(field.element, compiler)) { | 1297 if (compiler.codegenWorld.hasInvokedSetter(field.element, compiler)) { |
1318 // If there are invoked setters we don't know for sure | 1298 // If there are invoked setters we don't know for sure |
1319 // that the field will hold a value of the calculated | 1299 // that the field will hold a value of the calculated |
1320 // type, but the fact that the class itself sticks to | 1300 // type, but the fact that the class itself sticks to |
1321 // this type for the field is still a strong signal | 1301 // this type for the field is still a strong signal |
1322 // indicating the expected type of the field. | 1302 // indicating the expected type of the field. |
1323 field.propagatedType = type; | 1303 field.propagatedType = type; |
1324 } else { | 1304 } else { |
1325 // If there are no invoked setters we know the type of | 1305 // If there are no invoked setters we know the type of |
1326 // this field for sure. | 1306 // this field for sure. |
1327 field.guaranteedType = type; | 1307 field.guaranteedType = type; |
1328 } | 1308 } |
1329 } | 1309 } |
1330 } | 1310 } |
OLD | NEW |