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

Unified Diff: pkg/compiler/lib/src/js_backend/codegen/task.dart

Issue 981523002: Integrity checker for CPS and Tree IR. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix typo Created 5 years, 10 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/js_backend/codegen/task.dart
diff --git a/pkg/compiler/lib/src/js_backend/codegen/task.dart b/pkg/compiler/lib/src/js_backend/codegen/task.dart
index 0eb0685af40530a0cee628cb9c373567f1c9c904..2a545aa17261ab11d5356b44e8c91cece46b6617 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/task.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/task.dart
@@ -13,6 +13,7 @@ import '../js_backend.dart';
import '../../dart2jslib.dart';
import '../../cps_ir/cps_ir_nodes.dart' as cps;
import '../../cps_ir/cps_ir_builder.dart';
+import '../../cps_ir/cps_ir_integrity.dart';
import '../../tree_ir/tree_ir_nodes.dart' as tree_ir;
import '../../types/types.dart' show TypeMask, UnionTypeMask, FlatTypeMask,
ForwardingTypeMask;
@@ -22,10 +23,13 @@ import '../../io/source_information.dart' show StartEndSourceInformation;
import '../../tree_ir/tree_ir_builder.dart' as tree_builder;
import '../../dart_backend/backend_ast_emitter.dart' as backend_ast_emitter;
import '../../cps_ir/optimizers.dart';
+import '../../cps_ir/optimizers.dart' as cps_opt;
import '../../tracer.dart';
import '../../js_backend/codegen/codegen.dart';
import '../../ssa/ssa.dart' as ssa;
import '../../tree_ir/optimization/optimization.dart';
+import '../../tree_ir/optimization/optimization.dart' as tree_opt;
+import '../../tree_ir/tree_ir_integrity.dart';
import '../../cps_ir/cps_ir_nodes_sexpr.dart';
import 'js_tree_builder.dart';
@@ -135,31 +139,45 @@ class CpsFunctionCompiler implements FunctionCompiler {
throw 'unsupported: $type';
}
- cps.FunctionDefinition optimizeCpsIR(cps.FunctionDefinition cpsNode) {
- // Transformations on the CPS IR.
-
- TypePropagator typePropagator = new TypePropagator<TypeMask>(
- compiler.types,
- constantSystem,
- new TypeMaskSystem(compiler),
- compiler.internalError);
- typePropagator.rewrite(cpsNode);
- traceGraph("Sparse constant propagation", cpsNode);
-
+ void dumpTypedIR(cps.FunctionDefinition cpsNode,
+ TypePropagator<TypeMask> typePropagator) {
if (PRINT_TYPED_IR_FILTER != null &&
PRINT_TYPED_IR_FILTER.matchAsPrefix(cpsNode.element.name) != null) {
- String printType(cps.Node node, String s) {
+ String printType(nodeOrRef, String s) {
+ cps.Node node = nodeOrRef is cps.Reference
+ ? nodeOrRef.definition
+ : nodeOrRef;
var type = typePropagator.getType(node);
return type == null ? s : "$s:${formatTypeMask(type.type)}";
}
DEBUG_MODE = true;
print(new SExpressionStringifier(printType).visit(cpsNode));
}
+ }
- new RedundantPhiEliminator().rewrite(cpsNode);
- traceGraph("Redundant phi elimination", cpsNode);
- new ShrinkingReducer().rewrite(cpsNode);
- traceGraph("Shrinking reductions", cpsNode);
+ static bool checkCpsIntegrity(cps.ExecutableDefinition node) {
+ new CheckCpsIntegrity().check(node);
+ return true; // So this can be used from assert().
+ }
+
+ cps.FunctionDefinition optimizeCpsIR(cps.FunctionDefinition cpsNode) {
+ // Transformations on the CPS IR.
+ void applyCpsPass(String name,
+ cps_opt.Pass pass) {
+ pass.rewrite(cpsNode);
+ traceGraph(name, cpsNode);
+ assert(checkCpsIntegrity(cpsNode));
+ }
+
+ TypePropagator typePropagator = new TypePropagator<TypeMask>(
+ compiler.types,
+ constantSystem,
+ new TypeMaskSystem(compiler),
+ compiler.internalError);
+ applyCpsPass("Sparse constant propagation", typePropagator);
+ dumpTypedIR(cpsNode, typePropagator);
+ applyCpsPass("Redundant phi elimination", new RedundantPhiEliminator());
+ applyCpsPass("Shrinking reductions", new ShrinkingReducer());
// Do not rewrite the IR after variable allocation. Allocation
// makes decisions based on an approximation of IR variable live
@@ -174,23 +192,28 @@ class CpsFunctionCompiler implements FunctionCompiler {
tree_ir.FunctionDefinition treeNode = builder.buildFunction(cpsNode);
assert(treeNode != null);
traceGraph('Tree builder', treeNode);
+ assert(checkTreeIntegrity(treeNode));
return treeNode;
}
- tree_ir.FunctionDefinition optimizeTreeIR(
- tree_ir.FunctionDefinition treeNode) {
- // Transformations on the Tree IR.
- new StatementRewriter().rewrite(treeNode);
- traceGraph('Statement rewriter', treeNode);
- new CopyPropagator().rewrite(treeNode);
- traceGraph('Copy propagation', treeNode);
- new LoopRewriter().rewrite(treeNode);
- traceGraph('Loop rewriter', treeNode);
- new LogicalRewriter().rewrite(treeNode);
- traceGraph('Logical rewriter', treeNode);
- new backend_ast_emitter.UnshadowParameters().unshadow(treeNode);
- traceGraph('Unshadow parameters', treeNode);
- return treeNode;
+ static bool checkTreeIntegrity(tree_ir.ExecutableDefinition node) {
+ new CheckTreeIntegrity().check(node);
+ return true; // So this can be used from assert().
+ }
+
+ tree_ir.FunctionDefinition optimizeTreeIR(tree_ir.FunctionDefinition node) {
+ void applyTreePass(String name, tree_opt.Pass pass) {
+ pass.rewrite(node);
+ traceGraph(name, node);
+ assert(checkTreeIntegrity(node));
+ }
+
+ applyTreePass('Statement rewriter', new StatementRewriter());
+ applyTreePass('Copy propagation', new CopyPropagator());
+ applyTreePass('Loop rewriter', new LoopRewriter());
+ applyTreePass('Logical rewriter', new LogicalRewriter());
+
+ return node;
}
js.Fun compileToJavaScript(CodegenWorkItem work,

Powered by Google App Engine
This is Rietveld 408576698