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

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

Issue 1562893002: dart2js cps: Generate increment and compound operators. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Also compound string concatenation Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
index 526e5588784b806d66925b99f36d810e6162ba34..0e13cd83e6dd9f8260daa4d91990ce55c1ded387 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
@@ -758,9 +758,35 @@ class StatementRewriter extends Transformer implements Pass {
return node;
}
+ bool sameVariable(Expression e1, Expression e2) {
+ return e1 is VariableUse && e2 is VariableUse && e1.variable == e2.variable;
+ }
+
+ bool isCompoundableBuiltin(Expression e) {
+ return e is ApplyBuiltinOperator &&
+ e.arguments.length == 2 &&
+ isCompoundableOperator(e.operator);
+ }
+
+ void destroyVariableUse(VariableUse node) {
+ --node.variable.readCount;
+ }
+
Expression visitSetField(SetField node) {
allowRhsPropagation.add(true);
node.value = visitExpression(node.value);
+ if (isCompoundableBuiltin(node.value)) {
+ ApplyBuiltinOperator rhs = node.value;
+ Expression left = rhs.arguments[0];
+ Expression right = rhs.arguments[1];
+ if (left is GetField &&
+ left.field == node.field &&
+ sameVariable(left.object, node.object)) {
+ destroyVariableUse(left.object);
+ node.compound = rhs.operator;
+ node.value = right;
+ }
+ }
node.object = visitExpression(node.object);
allowRhsPropagation.removeLast();
return node;
@@ -834,6 +860,19 @@ class StatementRewriter extends Transformer implements Pass {
Expression visitSetIndex(SetIndex node) {
node.value = visitExpression(node.value);
+ if (isCompoundableBuiltin(node.value)) {
+ ApplyBuiltinOperator rhs = node.value;
+ Expression left = rhs.arguments[0];
+ Expression right = rhs.arguments[1];
+ if (left is GetIndex &&
+ sameVariable(left.object, node.object) &&
+ sameVariable(left.index, node.index)) {
+ destroyVariableUse(left.object);
+ destroyVariableUse(left.index);
+ node.compound = rhs.operator;
+ node.value = right;
+ }
+ }
node.index = visitExpression(node.index);
node.object = visitExpression(node.object);
return node;
« no previous file with comments | « pkg/compiler/lib/src/js_backend/codegen/codegen.dart ('k') | pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698