| 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 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | 5 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; |
| 6 import '../common/names.dart' show Selectors; | 6 import '../common/names.dart' show Selectors; |
| 7 import '../common/tasks.dart' show CompilerTask; | 7 import '../common/tasks.dart' show CompilerTask; |
| 8 import '../compiler.dart' show Compiler; | 8 import '../compiler.dart' show Compiler; |
| 9 import '../constants/constant_system.dart'; | 9 import '../constants/constant_system.dart'; |
| 10 import '../constants/values.dart'; | 10 import '../constants/values.dart'; |
| (...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 return removeIfCheckAlwaysSucceeds(node, node.knownType); | 898 return removeIfCheckAlwaysSucceeds(node, node.knownType); |
| 899 } | 899 } |
| 900 | 900 |
| 901 HInstruction removeIfCheckAlwaysSucceeds(HCheck node, TypeMask checkedType) { | 901 HInstruction removeIfCheckAlwaysSucceeds(HCheck node, TypeMask checkedType) { |
| 902 if (checkedType.containsAll(_closedWorld)) return node; | 902 if (checkedType.containsAll(_closedWorld)) return node; |
| 903 HInstruction input = node.checkedInput; | 903 HInstruction input = node.checkedInput; |
| 904 TypeMask inputType = input.instructionType; | 904 TypeMask inputType = input.instructionType; |
| 905 return inputType.isInMask(checkedType, _closedWorld) ? input : node; | 905 return inputType.isInMask(checkedType, _closedWorld) ? input : node; |
| 906 } | 906 } |
| 907 | 907 |
| 908 HInstruction removeCheck(HCheck node) => node.checkedInput; | |
| 909 | |
| 910 FieldEntity findConcreteFieldForDynamicAccess( | 908 FieldEntity findConcreteFieldForDynamicAccess( |
| 911 HInstruction receiver, Selector selector) { | 909 HInstruction receiver, Selector selector) { |
| 912 TypeMask receiverType = receiver.instructionType; | 910 TypeMask receiverType = receiver.instructionType; |
| 913 return _closedWorld.locateSingleField(selector, receiverType); | 911 return _closedWorld.locateSingleField(selector, receiverType); |
| 914 } | 912 } |
| 915 | 913 |
| 916 HInstruction visitFieldGet(HFieldGet node) { | 914 HInstruction visitFieldGet(HFieldGet node) { |
| 917 if (node.isNullCheck) return node; | 915 if (node.isNullCheck) return node; |
| 918 var receiver = node.receiver; | 916 var receiver = node.receiver; |
| 919 | 917 |
| (...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2194 | 2192 |
| 2195 // Update users of [input] that are dominated by [:dominator.first:] | 2193 // Update users of [input] that are dominated by [:dominator.first:] |
| 2196 // to use [TypeKnown] of [input] instead. As the type information depends | 2194 // to use [TypeKnown] of [input] instead. As the type information depends |
| 2197 // on the control flow, we mark the inserted [HTypeKnown] nodes as | 2195 // on the control flow, we mark the inserted [HTypeKnown] nodes as |
| 2198 // non-movable. | 2196 // non-movable. |
| 2199 void insertTypePropagationForDominatedUsers( | 2197 void insertTypePropagationForDominatedUsers( |
| 2200 HBasicBlock dominator, HInstruction input, TypeMask convertedType) { | 2198 HBasicBlock dominator, HInstruction input, TypeMask convertedType) { |
| 2201 DominatedUses dominatedUses = DominatedUses.of(input, dominator.first); | 2199 DominatedUses dominatedUses = DominatedUses.of(input, dominator.first); |
| 2202 if (dominatedUses.isEmpty) return; | 2200 if (dominatedUses.isEmpty) return; |
| 2203 | 2201 |
| 2202 // Check to avoid adding a duplicate HTypeKnown node. |
| 2203 if (dominatedUses.isSingleton) { |
| 2204 HInstruction user = dominatedUses.single; |
| 2205 if (user is HTypeKnown && |
| 2206 user.isPinned && |
| 2207 user.knownType == convertedType && |
| 2208 user.checkedInput == input) { |
| 2209 return; |
| 2210 } |
| 2211 } |
| 2212 |
| 2204 HTypeKnown newInput = new HTypeKnown.pinned(convertedType, input); | 2213 HTypeKnown newInput = new HTypeKnown.pinned(convertedType, input); |
| 2205 dominator.addBefore(dominator.first, newInput); | 2214 dominator.addBefore(dominator.first, newInput); |
| 2206 dominatedUses.replaceWith(newInput); | 2215 dominatedUses.replaceWith(newInput); |
| 2207 } | 2216 } |
| 2208 | 2217 |
| 2209 void visitIs(HIs instruction) { | 2218 void visitIs(HIs instruction) { |
| 2210 ResolutionDartType type = instruction.typeExpression; | 2219 ResolutionDartType type = instruction.typeExpression; |
| 2211 if (!instruction.isRawCheck) { | 2220 if (!instruction.isRawCheck) { |
| 2212 return; | 2221 return; |
| 2213 } else if (type.isTypedef) { | 2222 } else if (type.isTypedef) { |
| (...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2861 | 2870 |
| 2862 keyedValues.forEach((receiver, values) { | 2871 keyedValues.forEach((receiver, values) { |
| 2863 result.keyedValues[receiver] = | 2872 result.keyedValues[receiver] = |
| 2864 new Map<HInstruction, HInstruction>.from(values); | 2873 new Map<HInstruction, HInstruction>.from(values); |
| 2865 }); | 2874 }); |
| 2866 | 2875 |
| 2867 result.nonEscapingReceivers.addAll(nonEscapingReceivers); | 2876 result.nonEscapingReceivers.addAll(nonEscapingReceivers); |
| 2868 return result; | 2877 return result; |
| 2869 } | 2878 } |
| 2870 } | 2879 } |
| OLD | NEW |