Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 part of dart2js.optimizers; | 5 part of dart2js.optimizers; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Propagates constants throughout the IR, and replaces branches with fixed | 8 * Propagates constants throughout the IR, and replaces branches with fixed |
| 9 * jumps as well as side-effect free expressions with known constant results. | 9 * jumps as well as side-effect free expressions with known constant results. |
| 10 * Should be followed by the [ShrinkingReducer] pass. | 10 * Should be followed by the [ShrinkingReducer] pass. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 21 // arguments. | 21 // arguments. |
| 22 final dart2js.ConstantSystem _constantSystem; | 22 final dart2js.ConstantSystem _constantSystem; |
| 23 | 23 |
| 24 ConstantPropagator(this._compiler, this._constantSystem); | 24 ConstantPropagator(this._compiler, this._constantSystem); |
| 25 | 25 |
| 26 void rewrite(FunctionDefinition root) { | 26 void rewrite(FunctionDefinition root) { |
| 27 if (root.isAbstract) return; | 27 if (root.isAbstract) return; |
| 28 | 28 |
| 29 // Set all parent pointers. | 29 // Set all parent pointers. |
| 30 | 30 |
| 31 new _ParentVisitor().visit(root); | 31 new ParentVisitor().visit(root); |
| 32 | 32 |
| 33 // Analyze. In this phase, the entire term is analyzed for reachability | 33 // Analyze. In this phase, the entire term is analyzed for reachability |
| 34 // and the constant status of each expression. | 34 // and the constant status of each expression. |
| 35 | 35 |
| 36 _ConstPropagationVisitor analyzer = | 36 _ConstPropagationVisitor analyzer = |
| 37 new _ConstPropagationVisitor(_compiler, _constantSystem); | 37 new _ConstPropagationVisitor(_compiler, _constantSystem); |
| 38 analyzer.analyze(root); | 38 analyzer.analyze(root); |
| 39 | 39 |
| 40 // Transform. Uses the data acquired in the previous analysis phase to | 40 // Transform. Uses the data acquired in the previous analysis phase to |
| 41 // replace branches with fixed targets and side-effect-free expressions | 41 // replace branches with fixed targets and side-effect-free expressions |
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 596 setReachable(node.body); | 596 setReachable(node.body); |
| 597 } | 597 } |
| 598 } | 598 } |
| 599 | 599 |
| 600 // Conditions. | 600 // Conditions. |
| 601 | 601 |
| 602 void visitIsTrue(IsTrue node) { | 602 void visitIsTrue(IsTrue node) { |
| 603 Branch branch = node.parent; | 603 Branch branch = node.parent; |
| 604 visitBranch(branch); | 604 visitBranch(branch); |
| 605 } | 605 } |
| 606 | |
| 607 // JavaScript specific nodes. | |
| 608 | |
| 609 void visitIdentical(Identical node) { | |
| 610 setReachable(node.left.definition); | |
|
Kevin Millikin (Google)
2014/11/25 14:27:23
I need to understand the code in this file a bit b
karlklose
2014/11/25 14:38:46
I am not sure if it is okay to not set the paramet
| |
| 611 setReachable(node.right.definition); | |
| 612 } | |
| 606 } | 613 } |
| 607 | 614 |
| 608 /// Represents the constant-state of a variable at some point in the program. | 615 /// Represents the constant-state of a variable at some point in the program. |
| 609 /// UNKNOWN: may be some as yet undetermined constant. | 616 /// UNKNOWN: may be some as yet undetermined constant. |
| 610 /// CONSTANT: is a constant as stored in the local field. | 617 /// CONSTANT: is a constant as stored in the local field. |
| 611 /// NONCONST: not a constant. | 618 /// NONCONST: not a constant. |
| 612 class _ConstnessLattice { | 619 class _ConstnessLattice { |
| 613 static const int UNKNOWN = 0; | 620 static const int UNKNOWN = 0; |
| 614 static const int CONSTANT = 1; | 621 static const int CONSTANT = 1; |
| 615 static const int NONCONST = 2; | 622 static const int NONCONST = 2; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 657 return that; | 664 return that; |
| 658 } | 665 } |
| 659 | 666 |
| 660 if (this.constant == that.constant) { | 667 if (this.constant == that.constant) { |
| 661 return this; | 668 return this; |
| 662 } | 669 } |
| 663 | 670 |
| 664 return NonConst; | 671 return NonConst; |
| 665 } | 672 } |
| 666 } | 673 } |
| OLD | NEW |