| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 class BailoutInfo { | 5 class BailoutInfo { |
| 6 int instructionId; | 6 int instructionId; |
| 7 int bailoutId; | 7 int bailoutId; |
| 8 BailoutInfo(this.instructionId, this.bailoutId); | 8 BailoutInfo(this.instructionId, this.bailoutId); |
| 9 } | 9 } |
| 10 | 10 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 | 52 |
| 53 void removeLoopMarker(HBasicBlock block) { | 53 void removeLoopMarker(HBasicBlock block) { |
| 54 loopMarkers.remove(block); | 54 loopMarkers.remove(block); |
| 55 } | 55 } |
| 56 | 56 |
| 57 void addAll(Environment other) { | 57 void addAll(Environment other) { |
| 58 lives.addAll(other.lives); | 58 lives.addAll(other.lives); |
| 59 loopMarkers.addAll(other.loopMarkers); | 59 loopMarkers.addAll(other.loopMarkers); |
| 60 } | 60 } |
| 61 | 61 |
| 62 bool isEmpty() => lives.isEmpty() && loopMarkers.isEmpty(); | 62 bool get isEmpty => lives.isEmpty && loopMarkers.isEmpty; |
| 63 } | 63 } |
| 64 | 64 |
| 65 | 65 |
| 66 /** | 66 /** |
| 67 * Visits the graph in dominator order and inserts TypeGuards in places where | 67 * Visits the graph in dominator order and inserts TypeGuards in places where |
| 68 * we consider the guard to be of value. | 68 * we consider the guard to be of value. |
| 69 * | 69 * |
| 70 * Might modify the [types] in an inconsistent way. No further analysis should | 70 * Might modify the [types] in an inconsistent way. No further analysis should |
| 71 * rely on them. | 71 * rely on them. |
| 72 */ | 72 */ |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 final Map<HBasicBlock, Environment> liveInstructions; | 256 final Map<HBasicBlock, Environment> liveInstructions; |
| 257 Environment environment; | 257 Environment environment; |
| 258 | 258 |
| 259 SsaEnvironmentBuilder(Compiler this.compiler) | 259 SsaEnvironmentBuilder(Compiler this.compiler) |
| 260 : capturedEnvironments = new Map<HBailoutTarget, Environment>(), | 260 : capturedEnvironments = new Map<HBailoutTarget, Environment>(), |
| 261 liveInstructions = new Map<HBasicBlock, Environment>(); | 261 liveInstructions = new Map<HBasicBlock, Environment>(); |
| 262 | 262 |
| 263 | 263 |
| 264 void visitGraph(HGraph graph) { | 264 void visitGraph(HGraph graph) { |
| 265 visitPostDominatorTree(graph); | 265 visitPostDominatorTree(graph); |
| 266 if (!liveInstructions[graph.entry].isEmpty()) { | 266 if (!liveInstructions[graph.entry].isEmpty) { |
| 267 compiler.internalError('Bailout environment computation', | 267 compiler.internalError('Bailout environment computation', |
| 268 node: compiler.currentElement.parseNode(compiler)); | 268 node: compiler.currentElement.parseNode(compiler)); |
| 269 } | 269 } |
| 270 updateLoopMarkers(); | 270 updateLoopMarkers(); |
| 271 insertCapturedEnvironments(); | 271 insertCapturedEnvironments(); |
| 272 } | 272 } |
| 273 | 273 |
| 274 void updateLoopMarkers() { | 274 void updateLoopMarkers() { |
| 275 // If the block is a loop header, we need to merge the loop | 275 // If the block is a loop header, we need to merge the loop |
| 276 // header's live instructions into every environment that contains | 276 // header's live instructions into every environment that contains |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 * version. | 410 * version. |
| 411 */ | 411 */ |
| 412 | 412 |
| 413 SsaBailoutPropagator(this.compiler, this.generateAtUseSite) | 413 SsaBailoutPropagator(this.compiler, this.generateAtUseSite) |
| 414 : blocks = <HBasicBlock>[], | 414 : blocks = <HBasicBlock>[], |
| 415 labeledBlockInformations = <HLabeledBlockInformation>[]; | 415 labeledBlockInformations = <HLabeledBlockInformation>[]; |
| 416 | 416 |
| 417 void visitGraph(HGraph graph) { | 417 void visitGraph(HGraph graph) { |
| 418 subGraph = new SubGraph(graph.entry, graph.exit); | 418 subGraph = new SubGraph(graph.entry, graph.exit); |
| 419 visitBasicBlock(graph.entry); | 419 visitBasicBlock(graph.entry); |
| 420 if (!blocks.isEmpty()) { | 420 if (!blocks.isEmpty) { |
| 421 compiler.internalError('Bailout propagation', | 421 compiler.internalError('Bailout propagation', |
| 422 node: compiler.currentElement.parseNode(compiler)); | 422 node: compiler.currentElement.parseNode(compiler)); |
| 423 } | 423 } |
| 424 } | 424 } |
| 425 | 425 |
| 426 void visitBasicBlock(HBasicBlock block) { | 426 void visitBasicBlock(HBasicBlock block) { |
| 427 // Abort traversal if we are leaving the currently active sub-graph. | 427 // Abort traversal if we are leaving the currently active sub-graph. |
| 428 if (!subGraph.contains(block)) return; | 428 if (!subGraph.contains(block)) return; |
| 429 | 429 |
| 430 if (block.isLoopHeader()) { | 430 if (block.isLoopHeader()) { |
| 431 blocks.addLast(block); | 431 blocks.addLast(block); |
| 432 } else if (block.isLabeledBlock() | 432 } else if (block.isLabeledBlock() |
| 433 && (blocks.isEmpty() || !identical(blocks.last(), block))) { | 433 && (blocks.isEmpty || !identical(blocks.last(), block))) { |
| 434 HLabeledBlockInformation info = block.blockFlow.body; | 434 HLabeledBlockInformation info = block.blockFlow.body; |
| 435 visitStatements(info.body); | 435 visitStatements(info.body); |
| 436 return; | 436 return; |
| 437 } | 437 } |
| 438 | 438 |
| 439 HInstruction instruction = block.first; | 439 HInstruction instruction = block.first; |
| 440 while (instruction != null) { | 440 while (instruction != null) { |
| 441 instruction.accept(this); | 441 instruction.accept(this); |
| 442 instruction = instruction.next; | 442 instruction = instruction.next; |
| 443 } | 443 } |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 visitBasicBlock(dominated[i]); | 523 visitBasicBlock(dominated[i]); |
| 524 } | 524 } |
| 525 } | 525 } |
| 526 } | 526 } |
| 527 | 527 |
| 528 visitBailoutTarget(HBailoutTarget target) { | 528 visitBailoutTarget(HBailoutTarget target) { |
| 529 int inputLength = target.inputs.length; | 529 int inputLength = target.inputs.length; |
| 530 if (inputLength > maxBailoutParameters) { | 530 if (inputLength > maxBailoutParameters) { |
| 531 maxBailoutParameters = inputLength; | 531 maxBailoutParameters = inputLength; |
| 532 } | 532 } |
| 533 if (blocks.isEmpty()) { | 533 if (blocks.isEmpty) { |
| 534 if (firstBailoutTarget == null) { | 534 if (firstBailoutTarget == null) { |
| 535 firstBailoutTarget = target; | 535 firstBailoutTarget = target; |
| 536 } else { | 536 } else { |
| 537 hasComplexBailoutTargets = true; | 537 hasComplexBailoutTargets = true; |
| 538 } | 538 } |
| 539 } else { | 539 } else { |
| 540 hasComplexBailoutTargets = true; | 540 hasComplexBailoutTargets = true; |
| 541 blocks.forEach((HBasicBlock block) { | 541 blocks.forEach((HBasicBlock block) { |
| 542 block.bailoutTargets.add(target); | 542 block.bailoutTargets.add(target); |
| 543 }); | 543 }); |
| 544 } | 544 } |
| 545 } | 545 } |
| 546 } | 546 } |
| OLD | NEW |