| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// Generate code using the cps-based IR pipeline. | 5 /// Generate code using the cps-based IR pipeline. |
| 6 library code_generator_task; | 6 library code_generator_task; |
| 7 | 7 |
| 8 import 'glue.dart'; | 8 import 'glue.dart'; |
| 9 import 'codegen.dart'; | 9 import 'codegen.dart'; |
| 10 import 'unsugar.dart'; | 10 import 'unsugar.dart'; |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 return node is cps.Variable && node.type != null | 178 return node is cps.Variable && node.type != null |
| 179 ? '$s:${formatTypeMask(node.type)}' | 179 ? '$s:${formatTypeMask(node.type)}' |
| 180 : s; | 180 : s; |
| 181 } | 181 } |
| 182 DEBUG_MODE = true; | 182 DEBUG_MODE = true; |
| 183 print(';;; ==== After $passName ===='); | 183 print(';;; ==== After $passName ===='); |
| 184 print(new SExpressionStringifier(printType).visit(cpsFunction)); | 184 print(new SExpressionStringifier(printType).visit(cpsFunction)); |
| 185 } | 185 } |
| 186 } | 186 } |
| 187 | 187 |
| 188 static bool checkCpsIntegrity(cps.FunctionDefinition node, String pass) { | 188 bool checkCpsIntegrity(cps.FunctionDefinition node, String previousPass) { |
| 189 new CheckCpsIntegrity().check(node, pass); | 189 cpsOptimizationTask.measureSubtask('Check integrity', () { |
| 190 new CheckCpsIntegrity().check(node, previousPass); |
| 191 }); |
| 190 return true; // So this can be used from assert(). | 192 return true; // So this can be used from assert(). |
| 191 } | 193 } |
| 192 | 194 |
| 193 cps.FunctionDefinition optimizeCpsIr(cps.FunctionDefinition cpsFunction) { | 195 cps.FunctionDefinition optimizeCpsIr(cps.FunctionDefinition cpsFunction) { |
| 194 TypeMaskSystem typeSystem = new TypeMaskSystem(compiler); | 196 cpsOptimizationTask.measure(() { |
| 197 TypeMaskSystem typeSystem = new TypeMaskSystem(compiler); |
| 195 | 198 |
| 196 applyCpsPass(new RedundantJoinEliminator(), cpsFunction); | 199 applyCpsPass(new RedundantJoinEliminator(), cpsFunction); |
| 197 applyCpsPass(new RedundantPhiEliminator(), cpsFunction); | 200 applyCpsPass(new RedundantPhiEliminator(), cpsFunction); |
| 198 applyCpsPass(new InsertRefinements(typeSystem), cpsFunction); | 201 applyCpsPass(new InsertRefinements(typeSystem), cpsFunction); |
| 199 applyCpsPass(new TypePropagator(compiler, typeSystem, this), cpsFunction); | 202 applyCpsPass(new TypePropagator(compiler, typeSystem, this), cpsFunction); |
| 200 applyCpsPass(new RemoveRefinements(), cpsFunction); | 203 applyCpsPass(new RemoveRefinements(), cpsFunction); |
| 201 applyCpsPass(new ShrinkingReducer(), cpsFunction); | 204 applyCpsPass(new ShrinkingReducer(), cpsFunction); |
| 202 applyCpsPass(new ScalarReplacer(compiler), cpsFunction); | 205 applyCpsPass(new ScalarReplacer(compiler), cpsFunction); |
| 203 applyCpsPass(new MutableVariableEliminator(), cpsFunction); | 206 applyCpsPass(new MutableVariableEliminator(), cpsFunction); |
| 204 applyCpsPass(new RedundantJoinEliminator(), cpsFunction); | 207 applyCpsPass(new RedundantJoinEliminator(), cpsFunction); |
| 205 applyCpsPass(new RedundantPhiEliminator(), cpsFunction); | 208 applyCpsPass(new RedundantPhiEliminator(), cpsFunction); |
| 206 applyCpsPass(new BoundsChecker(typeSystem, compiler.world), cpsFunction); | 209 applyCpsPass(new BoundsChecker(typeSystem, compiler.world), cpsFunction); |
| 207 applyCpsPass(new ShrinkingReducer(), cpsFunction); | 210 applyCpsPass(new ShrinkingReducer(), cpsFunction); |
| 208 applyCpsPass(new ShareInterceptors(), cpsFunction); | 211 applyCpsPass(new ShareInterceptors(), cpsFunction); |
| 209 applyCpsPass(new ShrinkingReducer(), cpsFunction); | 212 applyCpsPass(new ShrinkingReducer(), cpsFunction); |
| 210 | 213 }); |
| 211 return cpsFunction; | 214 return cpsFunction; |
| 212 } | 215 } |
| 213 | 216 |
| 214 tree_ir.FunctionDefinition compileToTreeIr(cps.FunctionDefinition cpsNode) { | 217 tree_ir.FunctionDefinition compileToTreeIr(cps.FunctionDefinition cpsNode) { |
| 215 tree_builder.Builder builder = new tree_builder.Builder( | 218 tree_builder.Builder builder = new tree_builder.Builder( |
| 216 reporter.internalError); | 219 reporter.internalError); |
| 217 tree_ir.FunctionDefinition treeNode = | 220 tree_ir.FunctionDefinition treeNode = |
| 218 treeBuilderTask.measure(() => builder.buildFunction(cpsNode)); | 221 treeBuilderTask.measure(() => builder.buildFunction(cpsNode)); |
| 219 assert(treeNode != null); | 222 assert(treeNode != null); |
| 220 traceGraph('Tree builder', treeNode); | 223 traceGraph('Tree builder', treeNode); |
| 221 assert(checkTreeIntegrity(treeNode)); | 224 assert(checkTreeIntegrity(treeNode)); |
| 222 return treeNode; | 225 return treeNode; |
| 223 } | 226 } |
| 224 | 227 |
| 225 static bool checkTreeIntegrity(tree_ir.FunctionDefinition node) { | 228 bool checkTreeIntegrity(tree_ir.FunctionDefinition node) { |
| 226 new CheckTreeIntegrity().check(node); | 229 treeOptimizationTask.measureSubtask('Check integrity', () { |
| 230 new CheckTreeIntegrity().check(node); |
| 231 }); |
| 227 return true; // So this can be used from assert(). | 232 return true; // So this can be used from assert(). |
| 228 } | 233 } |
| 229 | 234 |
| 230 tree_ir.FunctionDefinition optimizeTreeIr(tree_ir.FunctionDefinition node) { | 235 tree_ir.FunctionDefinition optimizeTreeIr(tree_ir.FunctionDefinition node) { |
| 231 void applyTreePass(tree_opt.Pass pass) { | 236 void applyTreePass(tree_opt.Pass pass) { |
| 232 treeOptimizationTask.measureSubtask(pass.passName, () { | 237 treeOptimizationTask.measureSubtask(pass.passName, () { |
| 233 pass.rewrite(node); | 238 pass.rewrite(node); |
| 234 }); | 239 }); |
| 235 traceGraph(pass.passName, node); | 240 traceGraph(pass.passName, node); |
| 236 assert(checkTreeIntegrity(node)); | 241 assert(checkTreeIntegrity(node)); |
| 237 } | 242 } |
| 238 | 243 |
| 239 applyTreePass(new StatementRewriter()); | 244 treeOptimizationTask.measure(() { |
| 240 applyTreePass(new VariableMerger()); | 245 applyTreePass(new StatementRewriter()); |
| 241 applyTreePass(new LoopRewriter()); | 246 applyTreePass(new VariableMerger()); |
| 242 applyTreePass(new LogicalRewriter()); | 247 applyTreePass(new LoopRewriter()); |
| 243 applyTreePass(new PullIntoInitializers()); | 248 applyTreePass(new LogicalRewriter()); |
| 249 applyTreePass(new PullIntoInitializers()); |
| 250 }); |
| 244 | 251 |
| 245 return node; | 252 return node; |
| 246 } | 253 } |
| 247 | 254 |
| 248 js.Fun compileToJavaScript(CodegenWorkItem work, | 255 js.Fun compileToJavaScript(CodegenWorkItem work, |
| 249 tree_ir.FunctionDefinition definition) { | 256 tree_ir.FunctionDefinition definition) { |
| 250 CodeGenerator codeGen = new CodeGenerator(glue, work.registry); | 257 CodeGenerator codeGen = new CodeGenerator(glue, work.registry); |
| 251 Element element = work.element; | 258 Element element = work.element; |
| 252 js.Fun code = codeGen.buildFunction(definition); | 259 js.Fun code = codeGen.buildFunction(definition); |
| 253 if (element is FunctionElement && element.asyncMarker != AsyncMarker.SYNC) { | 260 if (element is FunctionElement && element.asyncMarker != AsyncMarker.SYNC) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 265 treeOptimizationTask] | 272 treeOptimizationTask] |
| 266 ..addAll(fallbackCompiler.tasks); | 273 ..addAll(fallbackCompiler.tasks); |
| 267 } | 274 } |
| 268 | 275 |
| 269 js.Node attachPosition(js.Node node, AstElement element) { | 276 js.Node attachPosition(js.Node node, AstElement element) { |
| 270 return node.withSourceInformation( | 277 return node.withSourceInformation( |
| 271 sourceInformationFactory.createBuilderForContext(element) | 278 sourceInformationFactory.createBuilderForContext(element) |
| 272 .buildDeclaration(element)); | 279 .buildDeclaration(element)); |
| 273 } | 280 } |
| 274 } | 281 } |
| OLD | NEW |