Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(603)

Side by Side Diff: pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart

Issue 1315333002: dart2js cps: Let effective constant expressions propagate further. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Improve comment Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 library tree_ir.optimization.statement_rewriter; 5 library tree_ir.optimization.statement_rewriter;
6 6
7 import 'optimization.dart' show Pass; 7 import 'optimization.dart' show Pass;
8 import '../tree_ir_nodes.dart'; 8 import '../tree_ir_nodes.dart';
9 import '../../io/source_information.dart'; 9 import '../../io/source_information.dart';
10 10
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 /// handler (i.e., if the code would be moved into a try from outside it). 200 /// handler (i.e., if the code would be moved into a try from outside it).
201 Set<Label> safeForInlining = new Set<Label>(); 201 Set<Label> safeForInlining = new Set<Label>();
202 202
203 /// Returns the redirect target of [jump] or [jump] itself if it should not 203 /// Returns the redirect target of [jump] or [jump] itself if it should not
204 /// be redirected. 204 /// be redirected.
205 Jump redirect(Jump jump) { 205 Jump redirect(Jump jump) {
206 Jump newJump = labelRedirects[jump.target]; 206 Jump newJump = labelRedirects[jump.target];
207 return newJump != null ? newJump : jump; 207 return newJump != null ? newJump : jump;
208 } 208 }
209 209
210 void inEmptyEnvironment(void action()) { 210 void inEmptyEnvironment(void action(), {bool keepConstants: true}) {
211 List oldEnvironment = environment; 211 List oldEnvironment = environment;
212 Map oldConstantEnvironment = constantEnvironment; 212 Map oldConstantEnvironment = constantEnvironment;
213 environment = <Expression>[]; 213 environment = <Expression>[];
214 constantEnvironment = <Variable, Expression>{}; 214 if (!keepConstants) {
215 constantEnvironment = <Variable, Expression>{};
216 }
215 action(); 217 action();
216 assert(environment.isEmpty); 218 assert(environment.isEmpty);
217 environment = oldEnvironment; 219 environment = oldEnvironment;
218 constantEnvironment = oldConstantEnvironment; 220 if (!keepConstants) {
221 constantEnvironment = oldConstantEnvironment;
222 }
219 } 223 }
220 224
221 /// Left-hand side of the given assignment, or `null` if not an assignment. 225 /// Left-hand side of the given assignment, or `null` if not an assignment.
222 Variable getLeftHand(Expression e) { 226 Variable getLeftHand(Expression e) {
223 return e is Assign ? e.variable : null; 227 return e is Assign ? e.variable : null;
224 } 228 }
225 229
226 /// If the given expression always returns the value of one of its 230 /// If the given expression always returns the value of one of its
227 /// subexpressions, returns that subexpression, otherwise `null`. 231 /// subexpressions, returns that subexpression, otherwise `null`.
228 Expression getValueSubexpression(Expression e) { 232 Expression getValueSubexpression(Expression e) {
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 if (reduced != null) { 654 if (reduced != null) {
651 return reduced; 655 return reduced;
652 } 656 }
653 657
654 return node; 658 return node;
655 } 659 }
656 660
657 Statement visitWhileTrue(WhileTrue node) { 661 Statement visitWhileTrue(WhileTrue node) {
658 // Do not propagate assignments into loops. Doing so is not safe for 662 // Do not propagate assignments into loops. Doing so is not safe for
659 // variables modified in the loop (the initial value will be propagated). 663 // variables modified in the loop (the initial value will be propagated).
664 // Do not propagate effective constant expressions into loops, since
665 // computing them is not free (e.g. interceptors are expensive).
660 inEmptyEnvironment(() { 666 inEmptyEnvironment(() {
661 node.body = visitStatement(node.body); 667 node.body = visitStatement(node.body);
662 }); 668 }, keepConstants: false);
663 return node; 669 return node;
664 } 670 }
665 671
666 Statement visitFor(For node) { 672 Statement visitFor(For node) {
667 // Not introduced yet 673 // Not introduced yet
668 throw "Unexpected For in StatementRewriter"; 674 throw "Unexpected For in StatementRewriter";
669 } 675 }
670 676
671 Statement visitTry(Try node) { 677 Statement visitTry(Try node) {
672 inEmptyEnvironment(() { 678 inEmptyEnvironment(() {
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 VariableUseVisitor(this.callback); 1225 VariableUseVisitor(this.callback);
1220 1226
1221 visitVariableUse(VariableUse use) => callback(use); 1227 visitVariableUse(VariableUse use) => callback(use);
1222 1228
1223 visitInnerFunction(FunctionDefinition node) {} 1229 visitInnerFunction(FunctionDefinition node) {}
1224 1230
1225 static void visit(Expression node, VariableUseCallback callback) { 1231 static void visit(Expression node, VariableUseCallback callback) {
1226 new VariableUseVisitor(callback).visitExpression(node); 1232 new VariableUseVisitor(callback).visitExpression(node);
1227 } 1233 }
1228 } 1234 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698