| 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 f38dcf3201247f6b2e6634b91179d988c747c459..32b508ff2cc92ed7615804b77b4ba6fc98597151 100644
|
| --- a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
|
| +++ b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
|
| @@ -239,11 +239,16 @@ class StatementRewriter extends Transformer implements Pass {
|
| /// If the given expression always returns the value of one of its
|
| /// subexpressions, and that subexpression is a variable use, returns that
|
| /// variable. Otherwise `null`.
|
| - Variable getRightHand(Expression e) {
|
| + Variable getRightHandVariable(Expression e) {
|
| Expression value = getValueSubexpression(e);
|
| return value is VariableUse ? value.variable : null;
|
| }
|
|
|
| + Constant getRightHandConstant(Expression e) {
|
| + Expression value = getValueSubexpression(e);
|
| + return value is Constant ? value : null;
|
| + }
|
| +
|
| /// True if the given expression (taken from [constantEnvironment]) uses a
|
| /// variable that might have been reassigned since [node] was evaluated.
|
| bool hasUnsafeVariableUse(Expression node) {
|
| @@ -322,7 +327,7 @@ class StatementRewriter extends Transformer implements Pass {
|
| //
|
| // { E.foo = x; bar(x) } ==> bar(E.foo = x)
|
| //
|
| - if (getRightHand(binding) == node.variable) {
|
| + if (getRightHandVariable(binding) == node.variable) {
|
| environment.removeLast();
|
| --node.variable.readCount;
|
| return visitExpression(binding);
|
| @@ -585,8 +590,15 @@ class StatementRewriter extends Transformer implements Pass {
|
| return node;
|
| }
|
|
|
| + bool isNullConstant(Expression node) {
|
| + return node is Constant && node.value.isNull;
|
| + }
|
| +
|
| Statement visitReturn(Return node) {
|
| - node.value = visitExpression(node.value);
|
| + if (!isNullConstant(node.value)) {
|
| + // Do not chain assignments into a null return.
|
| + node.value = visitExpression(node.value);
|
| + }
|
| return node;
|
| }
|
|
|
| @@ -709,6 +721,12 @@ class StatementRewriter extends Transformer implements Pass {
|
| }
|
|
|
| Expression visitConstant(Constant node) {
|
| + if (!environment.isEmpty) {
|
| + Constant constant = getRightHandConstant(environment.last);
|
| + if (constant != null && constant.value == node.value) {
|
| + return visitExpression(environment.removeLast());
|
| + }
|
| + }
|
| return node;
|
| }
|
|
|
|
|