Index: pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart |
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart b/pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart |
index 79bf831d9d890d17b02f1f1f066371ff0df2d208..141e646e796b4f50a59c9db10328eaebbbe12efd 100644 |
--- a/pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart |
+++ b/pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart |
@@ -15,9 +15,9 @@ import '../tree_ir_nodes.dart'; |
class VariableMerger extends RecursiveVisitor implements Pass { |
String get passName => 'Variable merger'; |
- void rewrite(RootNode node) { |
+ void rewrite(FunctionDefinition node) { |
rewriteFunction(node); |
- node.forEachBody(visitStatement); |
+ visitStatement(node.body); |
} |
@override |
@@ -27,15 +27,13 @@ class VariableMerger extends RecursiveVisitor implements Pass { |
/// Rewrites the given function. |
/// This is called for the outermost function and inner functions. |
- void rewriteFunction(RootNode node) { |
- node.forEachBody((Statement body) { |
- BlockGraphBuilder builder = new BlockGraphBuilder(); |
- builder.build(node.parameters, body); |
- _computeLiveness(builder.blocks); |
- Map<Variable, Variable> subst = |
- _computeRegisterAllocation(builder.blocks, node.parameters); |
- new SubstituteVariables(subst).apply(node); |
- }); |
+ void rewriteFunction(FunctionDefinition node) { |
+ BlockGraphBuilder builder = new BlockGraphBuilder(); |
+ builder.build(node); |
+ _computeLiveness(builder.blocks); |
+ Map<Variable, Variable> subst = |
+ _computeRegisterAllocation(builder.blocks, node.parameters); |
+ new SubstituteVariables(subst).apply(node); |
} |
} |
@@ -108,10 +106,10 @@ class BlockGraphBuilder extends RecursiveVisitor { |
/// them from the control-flow graph entirely. |
Set<Variable> _ignoredVariables = new Set<Variable>(); |
- void build(List<Variable> parameters, Statement body) { |
+ void build(FunctionDefinition node) { |
_currentBlock = newBlock(); |
- parameters.forEach(write); |
- visitStatement(body); |
+ node.parameters.forEach(write); |
+ visitStatement(node.body); |
} |
@override |
@@ -164,11 +162,6 @@ class BlockGraphBuilder extends RecursiveVisitor { |
read(node.variable); |
} |
- visitVariableDeclaration(VariableDeclaration node) { |
- assert(node.variable.isCaptured); |
- visitStatement(node.next); |
- } |
- |
visitAssign(Assign node) { |
visitExpression(node.value); |
write(node.variable); |
@@ -243,12 +236,6 @@ class BlockGraphBuilder extends RecursiveVisitor { |
branchFrom(afterCondition); |
visitExpression(node.right); |
} |
- |
- visitFunctionDeclaration(FunctionDeclaration node) { |
- // The function variable is final, hence cannot be merged. |
- ignoreVariable(node.variable); |
- visitStatement(node.next); |
- } |
} |
/// Computes liveness information of the given control-flow graph. |
@@ -492,11 +479,11 @@ class SubstituteVariables extends RecursiveTransformer { |
return w; |
} |
- void apply(RootNode node) { |
+ void apply(FunctionDefinition node) { |
for (int i = 0; i < node.parameters.length; ++i) { |
node.parameters[i] = replaceWrite(node.parameters[i]); |
} |
- node.replaceEachBody(visitStatement); |
+ node.body = visitStatement(node.body); |
} |
@override |
@@ -535,15 +522,4 @@ class SubstituteVariables extends RecursiveTransformer { |
} |
return node; |
} |
- |
- Statement visitVariableDeclaration(VariableDeclaration node) { |
- // VariableDeclaration is only used for captured variables, which are never |
- // merged, so this is not strictly necessary. But it's nicer if this class |
- // works for arbitrary substitution maps. |
- node.variable = replaceWrite(node.variable); |
- node.value = visitExpression(node.value); |
- node.next = visitStatement(node.next); |
- return node; |
- } |
- |
} |