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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 HInstruction visitInstruction(HInstruction node) { | 148 HInstruction visitInstruction(HInstruction node) { |
149 return node; | 149 return node; |
150 } | 150 } |
151 | 151 |
152 HInstruction visitBoolify(HBoolify node) { | 152 HInstruction visitBoolify(HBoolify node) { |
153 List<HInstruction> inputs = node.inputs; | 153 List<HInstruction> inputs = node.inputs; |
154 assert(inputs.length == 1); | 154 assert(inputs.length == 1); |
155 HInstruction input = inputs[0]; | 155 HInstruction input = inputs[0]; |
156 if (input.isBoolean(types)) return input; | 156 if (input.isBoolean(types)) return input; |
157 // All values !== true are boolified to false. | 157 // All values !== true are boolified to false. |
158 Type type = types[input].computeType(compiler); | 158 DartType type = types[input].computeType(compiler); |
159 if (type !== null && type.element !== compiler.boolClass) { | 159 if (type !== null && type.element !== compiler.boolClass) { |
160 return graph.addConstantBool(false); | 160 return graph.addConstantBool(false); |
161 } | 161 } |
162 return node; | 162 return node; |
163 } | 163 } |
164 | 164 |
165 HInstruction visitNot(HNot node) { | 165 HInstruction visitNot(HNot node) { |
166 List<HInstruction> inputs = node.inputs; | 166 List<HInstruction> inputs = node.inputs; |
167 assert(inputs.length == 1); | 167 assert(inputs.length == 1); |
168 HInstruction input = inputs[0]; | 168 HInstruction input = inputs[0]; |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 HInstruction visitTypeGuard(HTypeGuard node) { | 484 HInstruction visitTypeGuard(HTypeGuard node) { |
485 HInstruction value = node.guarded; | 485 HInstruction value = node.guarded; |
486 // If the intersection of the types is still the incoming type then | 486 // If the intersection of the types is still the incoming type then |
487 // the incoming type was a subtype of the guarded type, and no check | 487 // the incoming type was a subtype of the guarded type, and no check |
488 // is required. | 488 // is required. |
489 HType combinedType = types[value].intersection(node.guardedType); | 489 HType combinedType = types[value].intersection(node.guardedType); |
490 return (combinedType == types[value]) ? value : node; | 490 return (combinedType == types[value]) ? value : node; |
491 } | 491 } |
492 | 492 |
493 HInstruction visitIs(HIs node) { | 493 HInstruction visitIs(HIs node) { |
494 Type type = node.typeExpression; | 494 DartType type = node.typeExpression; |
495 Element element = type.element; | 495 Element element = type.element; |
496 if (element.kind === ElementKind.TYPE_VARIABLE) { | 496 if (element.kind === ElementKind.TYPE_VARIABLE) { |
497 compiler.unimplemented("visitIs for type variables"); | 497 compiler.unimplemented("visitIs for type variables"); |
498 } | 498 } |
499 | 499 |
500 HType expressionType = types[node.expression]; | 500 HType expressionType = types[node.expression]; |
501 if (element === compiler.objectClass | 501 if (element === compiler.objectClass |
502 || element === compiler.dynamicClass) { | 502 || element === compiler.dynamicClass) { |
503 return graph.addConstantBool(true); | 503 return graph.addConstantBool(true); |
504 } else if (expressionType.isInteger()) { | 504 } else if (expressionType.isInteger()) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 if (element === compiler.listClass | 539 if (element === compiler.listClass |
540 || Elements.isListSupertype(element, compiler)) { | 540 || Elements.isListSupertype(element, compiler)) { |
541 return graph.addConstantBool(true); | 541 return graph.addConstantBool(true); |
542 } else { | 542 } else { |
543 return graph.addConstantBool(false); | 543 return graph.addConstantBool(false); |
544 } | 544 } |
545 // TODO(karlklose): remove the hasTypeArguments check. | 545 // TODO(karlklose): remove the hasTypeArguments check. |
546 } else if (expressionType.isUseful() | 546 } else if (expressionType.isUseful() |
547 && !expressionType.canBeNull() | 547 && !expressionType.canBeNull() |
548 && !compiler.codegenWorld.rti.hasTypeArguments(type)) { | 548 && !compiler.codegenWorld.rti.hasTypeArguments(type)) { |
549 Type receiverType = expressionType.computeType(compiler); | 549 DartType receiverType = expressionType.computeType(compiler); |
550 if (receiverType !== null) { | 550 if (receiverType !== null) { |
551 if (compiler.types.isSubtype(receiverType, type)) { | 551 if (compiler.types.isSubtype(receiverType, type)) { |
552 return graph.addConstantBool(true); | 552 return graph.addConstantBool(true); |
553 } else if (expressionType.isExact()) { | 553 } else if (expressionType.isExact()) { |
554 return graph.addConstantBool(false); | 554 return graph.addConstantBool(false); |
555 } | 555 } |
556 } | 556 } |
557 } | 557 } |
558 return node; | 558 return node; |
559 } | 559 } |
560 | 560 |
561 HInstruction visitTypeConversion(HTypeConversion node) { | 561 HInstruction visitTypeConversion(HTypeConversion node) { |
562 HInstruction value = node.inputs[0]; | 562 HInstruction value = node.inputs[0]; |
563 Type type = types[node].computeType(compiler); | 563 DartType type = types[node].computeType(compiler); |
564 if (type.element === compiler.dynamicClass | 564 if (type.element === compiler.dynamicClass |
565 || type.element === compiler.objectClass) { | 565 || type.element === compiler.objectClass) { |
566 return value; | 566 return value; |
567 } | 567 } |
568 HType combinedType = types[value].intersection(types[node]); | 568 HType combinedType = types[value].intersection(types[node]); |
569 return (combinedType == types[value]) ? value : node; | 569 return (combinedType == types[value]) ? value : node; |
570 } | 570 } |
571 | 571 |
572 Element findConcreteFieldForDynamicAccess(HInstruction receiver, | 572 Element findConcreteFieldForDynamicAccess(HInstruction receiver, |
573 Selector selector) { | 573 Selector selector) { |
574 HType receiverType = types[receiver]; | 574 HType receiverType = types[receiver]; |
575 if (!receiverType.isUseful()) return null; | 575 if (!receiverType.isUseful()) return null; |
576 if (receiverType.canBeNull()) return null; | 576 if (receiverType.canBeNull()) return null; |
577 Type type = receiverType.computeType(compiler); | 577 DartType type = receiverType.computeType(compiler); |
578 if (type === null) return null; | 578 if (type === null) return null; |
579 return compiler.world.locateSingleField(type, selector); | 579 return compiler.world.locateSingleField(type, selector); |
580 } | 580 } |
581 | 581 |
582 HInstruction visitInvokeDynamicGetter(HInvokeDynamicGetter node) { | 582 HInstruction visitInvokeDynamicGetter(HInvokeDynamicGetter node) { |
583 Element field = | 583 Element field = |
584 findConcreteFieldForDynamicAccess(node.receiver, node.selector); | 584 findConcreteFieldForDynamicAccess(node.receiver, node.selector); |
585 if (field == null) return node; | 585 if (field == null) return node; |
586 | 586 |
587 Modifiers modifiers = field.modifiers; | 587 Modifiers modifiers = field.modifiers; |
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1327 // this type for the field is still a strong signal | 1327 // this type for the field is still a strong signal |
1328 // indicating the expected type of the field. | 1328 // indicating the expected type of the field. |
1329 types[field] = type; | 1329 types[field] = type; |
1330 } else { | 1330 } else { |
1331 // If there are no invoked setters we know the type of | 1331 // If there are no invoked setters we know the type of |
1332 // this field for sure. | 1332 // this field for sure. |
1333 field.guaranteedType = type; | 1333 field.guaranteedType = type; |
1334 } | 1334 } |
1335 } | 1335 } |
1336 } | 1336 } |
OLD | NEW |