| 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 CodegenWorkItem; | 5 import '../common/codegen.dart' show CodegenWorkItem; |
| 6 import '../common/tasks.dart' show CompilerTask; | 6 import '../common/tasks.dart' show CompilerTask; |
| 7 import '../compiler.dart' show Compiler; | 7 import '../compiler.dart' show Compiler; |
| 8 import '../constants/constant_system.dart'; | 8 import '../constants/constant_system.dart'; |
| 9 import '../constants/values.dart'; | 9 import '../constants/values.dart'; |
| 10 import '../core_types.dart' show CoreClasses; | 10 import '../core_types.dart' show CoreClasses; |
| 11 import '../dart_types.dart'; | 11 import '../dart_types.dart'; |
| 12 import '../elements/elements.dart'; | 12 import '../elements/elements.dart'; |
| 13 import '../js/js.dart' as js; | 13 import '../js/js.dart' as js; |
| 14 import '../js_backend/backend_helpers.dart' show BackendHelpers; | 14 import '../js_backend/backend_helpers.dart' show BackendHelpers; |
| 15 import '../js_backend/js_backend.dart'; | 15 import '../js_backend/js_backend.dart'; |
| 16 import '../native/native.dart' as native; | 16 import '../native/native.dart' as native; |
| 17 import '../tree/dartstring.dart' as ast; | 17 import '../tree/dartstring.dart' as ast; |
| 18 import '../types/types.dart'; | 18 import '../types/types.dart'; |
| 19 import '../universe/selector.dart' show Selector; | 19 import '../universe/selector.dart' show Selector; |
| 20 import '../universe/side_effects.dart' show SideEffects; | 20 import '../universe/side_effects.dart' show SideEffects; |
| 21 import '../util/util.dart'; | 21 import '../util/util.dart'; |
| 22 import '../world.dart' show ClassWorld, World; | 22 import '../world.dart' show ClassWorld; |
| 23 import 'interceptor_simplifier.dart'; | 23 import 'interceptor_simplifier.dart'; |
| 24 import 'nodes.dart'; | 24 import 'nodes.dart'; |
| 25 import 'types.dart'; | 25 import 'types.dart'; |
| 26 import 'types_propagation.dart'; | 26 import 'types_propagation.dart'; |
| 27 import 'value_range_analyzer.dart'; | 27 import 'value_range_analyzer.dart'; |
| 28 import 'value_set.dart'; | 28 import 'value_set.dart'; |
| 29 | 29 |
| 30 abstract class OptimizationPhase { | 30 abstract class OptimizationPhase { |
| 31 String get name; | 31 String get name; |
| 32 void visitGraph(HGraph graph); | 32 void visitGraph(HGraph graph); |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 node.specializer.tryConvertToBuiltin(node, compiler); | 366 node.specializer.tryConvertToBuiltin(node, compiler); |
| 367 if (instruction != null) return instruction; | 367 if (instruction != null) return instruction; |
| 368 | 368 |
| 369 Selector selector = node.selector; | 369 Selector selector = node.selector; |
| 370 TypeMask mask = node.mask; | 370 TypeMask mask = node.mask; |
| 371 HInstruction input = node.inputs[1]; | 371 HInstruction input = node.inputs[1]; |
| 372 | 372 |
| 373 ClassWorld world = compiler.closedWorld; | 373 ClassWorld world = compiler.closedWorld; |
| 374 | 374 |
| 375 bool applies(Element element) { | 375 bool applies(Element element) { |
| 376 return selector.applies(element, world) && | 376 return selector.applies(element, backend) && |
| 377 (mask == null || mask.canHit(element, selector, world)); | 377 (mask == null || mask.canHit(element, selector, world)); |
| 378 } | 378 } |
| 379 | 379 |
| 380 if (selector.isCall || selector.isOperator) { | 380 if (selector.isCall || selector.isOperator) { |
| 381 Element target; | 381 Element target; |
| 382 if (input.isExtendableArray(compiler)) { | 382 if (input.isExtendableArray(compiler)) { |
| 383 if (applies(helpers.jsArrayRemoveLast)) { | 383 if (applies(helpers.jsArrayRemoveLast)) { |
| 384 target = helpers.jsArrayRemoveLast; | 384 target = helpers.jsArrayRemoveLast; |
| 385 } else if (applies(helpers.jsArrayAdd)) { | 385 } else if (applies(helpers.jsArrayAdd)) { |
| 386 // The codegen special cases array calls, but does not | 386 // The codegen special cases array calls, but does not |
| (...skipping 28 matching lines...) Expand all Loading... |
| 415 // HForeign is too opaque for the SsaCheckInserter (that adds a | 415 // HForeign is too opaque for the SsaCheckInserter (that adds a |
| 416 // bounds check on removeLast). Once we start inlining, the | 416 // bounds check on removeLast). Once we start inlining, the |
| 417 // bounds check will become explicit, so we won't need this | 417 // bounds check will become explicit, so we won't need this |
| 418 // optimization. | 418 // optimization. |
| 419 HInvokeDynamicMethod result = new HInvokeDynamicMethod(node.selector, | 419 HInvokeDynamicMethod result = new HInvokeDynamicMethod(node.selector, |
| 420 node.mask, node.inputs.sublist(1), node.instructionType); | 420 node.mask, node.inputs.sublist(1), node.instructionType); |
| 421 result.element = target; | 421 result.element = target; |
| 422 return result; | 422 return result; |
| 423 } | 423 } |
| 424 } else if (selector.isGetter) { | 424 } else if (selector.isGetter) { |
| 425 if (selector.applies(helpers.jsIndexableLength, world)) { | 425 if (selector.applies(helpers.jsIndexableLength, backend)) { |
| 426 HInstruction optimized = tryOptimizeLengthInterceptedGetter(node); | 426 HInstruction optimized = tryOptimizeLengthInterceptedGetter(node); |
| 427 if (optimized != null) return optimized; | 427 if (optimized != null) return optimized; |
| 428 } | 428 } |
| 429 } | 429 } |
| 430 | 430 |
| 431 return node; | 431 return node; |
| 432 } | 432 } |
| 433 | 433 |
| 434 HInstruction visitInvokeDynamicMethod(HInvokeDynamicMethod node) { | 434 HInstruction visitInvokeDynamicMethod(HInvokeDynamicMethod node) { |
| 435 propagateConstantValueToUses(node); | 435 propagateConstantValueToUses(node); |
| (...skipping 2144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2580 | 2580 |
| 2581 keyedValues.forEach((receiver, values) { | 2581 keyedValues.forEach((receiver, values) { |
| 2582 result.keyedValues[receiver] = | 2582 result.keyedValues[receiver] = |
| 2583 new Map<HInstruction, HInstruction>.from(values); | 2583 new Map<HInstruction, HInstruction>.from(values); |
| 2584 }); | 2584 }); |
| 2585 | 2585 |
| 2586 result.nonEscapingReceivers.addAll(nonEscapingReceivers); | 2586 result.nonEscapingReceivers.addAll(nonEscapingReceivers); |
| 2587 return result; | 2587 return result; |
| 2588 } | 2588 } |
| 2589 } | 2589 } |
| OLD | NEW |