| Index: pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
|
| index f15418f2188f2903ea1b6b692149abfaff6cc589..92b81e2c76378684c06be9124bad8bbac488b2d4 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
|
| @@ -21,63 +21,60 @@ class IRTracer extends TracerUtil implements cps_ir.Visitor {
|
|
|
| visit(cps_ir.Node node) => node.accept(this);
|
|
|
| - void traceGraph(String name, cps_ir.ExecutableDefinition graph) {
|
| + void traceGraph(String name, cps_ir.RootNode node) {
|
| + if (node.isEmpty) return; // Don't bother printing an empty trace.
|
| tag("cfg", () {
|
| printProperty("name", name);
|
| - visit(graph);
|
| +
|
| + names = new Names();
|
| + BlockCollector builder = new BlockCollector(names);
|
| + builder.visit(node);
|
| +
|
| + for (Block block in builder.entries) {
|
| + printBlock(block, entryPointParameters: node.parameters);
|
| + }
|
| + for (Block block in builder.cont2block.values) {
|
| + printBlock(block);
|
| + }
|
| + names = null;
|
| });
|
| }
|
|
|
| // Temporary field used during tree walk
|
| Names names;
|
|
|
| - printDefinition(cps_ir.ExecutableDefinition node) {
|
| - names = new Names();
|
| - BlockCollector builder = new BlockCollector(names);
|
| - builder.visit(node);
|
| -
|
| - for (Block block in builder.entries) {
|
| - printBlock(block);
|
| - }
|
| - for (Block block in builder.cont2block.values) {
|
| - printBlock(block);
|
| - }
|
| - names = null;
|
| - }
|
| -
|
| visitFieldDefinition(cps_ir.FieldDefinition node) {
|
| - if (node.hasInitializer) {
|
| - printDefinition(node);
|
| - }
|
| + unexpectedNode(node);
|
| }
|
|
|
| visitFunctionDefinition(cps_ir.FunctionDefinition node) {
|
| - if (node.isAbstract) return;
|
| - printDefinition(node);
|
| + unexpectedNode(node);
|
| }
|
|
|
| visitConstructorDefinition(cps_ir.ConstructorDefinition node) {
|
| - if (node.isAbstract) return;
|
| - printDefinition(node);
|
| + unexpectedNode(node);
|
| }
|
|
|
| - // Bodies and initializers are not visited. They contain continuations which
|
| - // are found by a BlockCollector, then those continuations are processed by
|
| - // this visitor.
|
| - unexpectedNode(cps_ir.Node node) {
|
| - throw 'The IR tracer reached an unexpected IR instruction: $node';
|
| + visitFieldInitializer(cps_ir.FieldInitializer node) {
|
| + unexpectedNode(node);
|
| }
|
|
|
| - visitRunnableBody(cps_ir.RunnableBody node) {
|
| + visitSuperInitializer(cps_ir.SuperInitializer node) {
|
| unexpectedNode(node);
|
| }
|
| - visitFieldInitializer(cps_ir.FieldInitializer node) {
|
| +
|
| + visitBody(cps_ir.Body node) {
|
| unexpectedNode(node);
|
| }
|
| - visitSuperInitializer(cps_ir.SuperInitializer node) {
|
| - unexpectedNode(node);
|
| +
|
| + // Bodies and initializers are not visited. They contain continuations which
|
| + // are found by a BlockCollector, then those continuations are processed by
|
| + // this visitor.
|
| + unexpectedNode(cps_ir.Node node) {
|
| + throw 'The IR tracer reached an unexpected IR instruction: $node';
|
| }
|
|
|
| +
|
| int countUses(cps_ir.Definition definition) {
|
| int count = 0;
|
| cps_ir.Reference ref = definition.firstRef;
|
| @@ -88,7 +85,9 @@ class IRTracer extends TracerUtil implements cps_ir.Visitor {
|
| return count;
|
| }
|
|
|
| - printBlock(Block block) {
|
| + /// If [entryPointParameters] is given, this block is an entry point
|
| + /// and [entryPointParameters] is the list of function parameters.
|
| + printBlock(Block block, {List<cps_ir.Definition> entryPointParameters}) {
|
| tag("block", () {
|
| printProperty("name", block.name);
|
| printProperty("from_bci", -1);
|
| @@ -104,6 +103,10 @@ class IRTracer extends TracerUtil implements cps_ir.Visitor {
|
| });
|
| });
|
| tag("HIR", () {
|
| + if (entryPointParameters != null) {
|
| + String params = entryPointParameters.map(names.name).join(', ');
|
| + printStmt('x0', 'Entry ($params)');
|
| + }
|
| for (cps_ir.Parameter param in block.parameters) {
|
| String name = names.name(param);
|
| printStmt(name, "Parameter $name [useCount=${countUses(param)}]");
|
| @@ -412,7 +415,7 @@ class BlockCollector implements cps_ir.Visitor {
|
| final Map<cps_ir.Continuation, Block> cont2block =
|
| <cps_ir.Continuation, Block>{};
|
| final Set<Block> entries = new Set<Block>();
|
| - Block current_block;
|
| + Block currentBlock;
|
|
|
| Names names;
|
| BlockCollector(this.names);
|
| @@ -429,9 +432,7 @@ class BlockCollector implements cps_ir.Visitor {
|
| visit(cps_ir.Node node) => node.accept(this);
|
|
|
| visitFieldDefinition(cps_ir.FieldDefinition node) {
|
| - if (node.hasInitializer) {
|
| - visit(node.body);
|
| - }
|
| + visit(node.body);
|
| }
|
|
|
| visitFunctionDefinition(cps_ir.FunctionDefinition node) {
|
| @@ -439,12 +440,13 @@ class BlockCollector implements cps_ir.Visitor {
|
| }
|
|
|
| visitConstructorDefinition(cps_ir.ConstructorDefinition node) {
|
| + node.initializers.forEach(visit);
|
| visit(node.body);
|
| }
|
|
|
| - visitRunnableBody(cps_ir.RunnableBody node) {
|
| - current_block = new Block(names.name(node), [], node.body);
|
| - entries.add(current_block);
|
| + visitBody(cps_ir.Body node) {
|
| + currentBlock = new Block(names.name(node), [], node.body);
|
| + entries.add(currentBlock);
|
| visit(node.body);
|
| }
|
|
|
| @@ -477,7 +479,7 @@ class BlockCollector implements cps_ir.Visitor {
|
| void addEdgeToContinuation(cps_ir.Reference continuation) {
|
| cps_ir.Definition target = continuation.definition;
|
| if (target is cps_ir.Continuation && !target.isReturnContinuation) {
|
| - current_block.addEdgeTo(getBlock(target));
|
| + currentBlock.addEdgeTo(getBlock(target));
|
| }
|
| }
|
|
|
| @@ -520,11 +522,11 @@ class BlockCollector implements cps_ir.Visitor {
|
| visitBranch(cps_ir.Branch exp) {
|
| cps_ir.Continuation trueTarget = exp.trueContinuation.definition;
|
| if (!trueTarget.isReturnContinuation) {
|
| - current_block.addEdgeTo(getBlock(trueTarget));
|
| + currentBlock.addEdgeTo(getBlock(trueTarget));
|
| }
|
| cps_ir.Continuation falseTarget = exp.falseContinuation.definition;
|
| if (!falseTarget.isReturnContinuation) {
|
| - current_block.addEdgeTo(getBlock(falseTarget));
|
| + currentBlock.addEdgeTo(getBlock(falseTarget));
|
| }
|
| }
|
|
|
| @@ -533,10 +535,10 @@ class BlockCollector implements cps_ir.Visitor {
|
| }
|
|
|
| visitContinuation(cps_ir.Continuation c) {
|
| - var old_node = current_block;
|
| - current_block = getBlock(c);
|
| + var old_node = currentBlock;
|
| + currentBlock = getBlock(c);
|
| visit(c.body);
|
| - current_block = old_node;
|
| + currentBlock = old_node;
|
| }
|
|
|
| // Primitives and conditions are not visited when searching for blocks.
|
|
|