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

Unified Diff: pkg/compiler/lib/src/ssa/loop_handler.dart

Issue 2954463002: Refactoring to prepare for kernel based jump targets (Closed)
Patch Set: Updated cf. comments Created 3 years, 6 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
« no previous file with comments | « pkg/compiler/lib/src/ssa/kernel_impact.dart ('k') | pkg/compiler/lib/src/ssa/optimize.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/loop_handler.dart
diff --git a/pkg/compiler/lib/src/ssa/loop_handler.dart b/pkg/compiler/lib/src/ssa/loop_handler.dart
index 3ce6289a64c72e941825603a16b4263758f88f0e..b7d7c800c4ee2af95d05c59dee26e702e4cd28af 100644
--- a/pkg/compiler/lib/src/ssa/loop_handler.dart
+++ b/pkg/compiler/lib/src/ssa/loop_handler.dart
@@ -28,8 +28,14 @@ abstract class LoopHandler<T> {
/// For while loops, [initialize] and [update] are null.
/// The [condition] function must return a boolean result.
/// None of the functions must leave anything on the stack.
- void handleLoop(T loop, LoopClosureRepresentationInfo loopClosureInfo,
- void initialize(), HInstruction condition(), void update(), void body()) {
+ void handleLoop(
+ T loop,
+ LoopClosureRepresentationInfo loopClosureInfo,
+ JumpTarget jumpTarget,
+ void initialize(),
+ HInstruction condition(),
+ void update(),
+ void body()) {
// Generate:
// <initializer>
// loop-entry:
@@ -53,7 +59,7 @@ abstract class LoopHandler<T> {
}
builder.loopDepth++;
- JumpHandler jumpHandler = beginLoopHeader(loop);
+ JumpHandler jumpHandler = beginLoopHeader(loop, jumpTarget);
HLoopInformation loopInfo = builder.current.loopInformation;
HBasicBlock conditionBlock = builder.current;
if (startBlock == null) startBlock = conditionBlock;
@@ -108,17 +114,16 @@ abstract class LoopHandler<T> {
continueHandlers[0].mergeMultiple(continueHandlers, updateBlock);
List<LabelDefinition> labels = jumpHandler.labels;
- JumpTarget target = getTargetDefinition(loop);
if (labels.isNotEmpty) {
beginBodyBlock.setBlockFlow(
new HLabeledBlockInformation(
new HSubGraphBlockInformation(bodyGraph), jumpHandler.labels,
isContinue: true),
updateBlock);
- } else if (target != null && target.isContinueTarget) {
+ } else if (jumpTarget != null && jumpTarget.isContinueTarget) {
beginBodyBlock.setBlockFlow(
new HLabeledBlockInformation.implicit(
- new HSubGraphBlockInformation(bodyGraph), target,
+ new HSubGraphBlockInformation(bodyGraph), jumpTarget,
isContinue: true),
updateBlock);
}
@@ -193,9 +198,8 @@ abstract class LoopHandler<T> {
// If the body has any break, attach a synthesized label to the
// if block.
if (jumpHandler.hasAnyBreak()) {
- JumpTarget target = getTargetDefinition(loop);
- LabelDefinition label = target.addLabel(null, 'loop');
- label.setBreakTarget();
+ LabelDefinition label =
+ jumpTarget.addLabel(null, 'loop', isBreakTarget: true);
SubGraph labelGraph = new SubGraph(conditionBlock, builder.current);
HLabeledBlockInformation labelInfo = new HLabeledBlockInformation(
new HSubGraphBlockInformation(labelGraph),
@@ -217,11 +221,12 @@ abstract class LoopHandler<T> {
/// Creates a new loop-header block. The previous [current] block
/// is closed with an [HGoto] and replaced by the newly created block.
/// Also notifies the locals handler that we're entering a loop.
- JumpHandler beginLoopHeader(T node) {
+ JumpHandler beginLoopHeader(T node, JumpTarget jumpTarget) {
assert(!builder.isAborted());
HBasicBlock previousBlock = builder.close(new HGoto());
- JumpHandler jumpHandler = createJumpHandler(node, isLoopJump: true);
+ JumpHandler jumpHandler =
+ createJumpHandler(node, jumpTarget, isLoopJump: true);
HBasicBlock loopEntry = builder.graph
.addNewLoopHeaderBlock(jumpHandler.target, jumpHandler.labels);
previousBlock.addSuccessor(loopEntry);
@@ -285,9 +290,6 @@ abstract class LoopHandler<T> {
}
}
- /// Returns the jump target defined by [node].
- JumpTarget getTargetDefinition(T node);
-
/// Determine what kind of loop [node] represents.
///
/// The result is one of the kinds defined in [HLoopBlockInformation].
@@ -303,7 +305,8 @@ abstract class LoopHandler<T> {
/// [isLoopJump] is [:true:] when the jump handler is for a loop. This is used
/// to distinguish the synthesized loop created for a switch statement with
/// continue statements from simple switch statements.
- JumpHandler createJumpHandler(T node, {bool isLoopJump});
+ JumpHandler createJumpHandler(T node, JumpTarget jumpTarget,
+ {bool isLoopJump});
}
/// A loop handler for the builder that just uses AST nodes directly.
@@ -315,11 +318,6 @@ class SsaLoopHandler extends LoopHandler<ast.Node> {
super(builder);
@override
- JumpTarget getTargetDefinition(ast.Node node) {
- return builder.elements.getTargetDefinition(node);
- }
-
- @override
int loopKind(ast.Node node) => node.accept(const _SsaLoopTypeVisitor());
@override
@@ -327,8 +325,9 @@ class SsaLoopHandler extends LoopHandler<ast.Node> {
builder.sourceInformationBuilder.buildLoop(node);
@override
- JumpHandler createJumpHandler(ast.Node node, {bool isLoopJump}) =>
- builder.createJumpHandler(node, isLoopJump: isLoopJump);
+ JumpHandler createJumpHandler(ast.Node node, JumpTarget jumpTarget,
+ {bool isLoopJump}) =>
+ builder.createJumpHandler(node, jumpTarget, isLoopJump: isLoopJump);
}
class _SsaLoopTypeVisitor extends ast.Visitor {
@@ -355,12 +354,9 @@ class KernelLoopHandler extends LoopHandler<ir.TreeNode> {
super(builder);
@override
- JumpHandler createJumpHandler(ir.TreeNode node, {bool isLoopJump}) =>
- builder.createJumpHandler(node, isLoopJump: isLoopJump);
-
- @override
- JumpTarget getTargetDefinition(ir.TreeNode node) =>
- builder.localsMap.getJumpTarget(node);
+ JumpHandler createJumpHandler(ir.TreeNode node, JumpTarget jumpTarget,
+ {bool isLoopJump}) =>
+ builder.createJumpHandler(node, jumpTarget, isLoopJump: isLoopJump);
@override
int loopKind(ir.TreeNode node) => node.accept(new _KernelLoopTypeVisitor());
« no previous file with comments | « pkg/compiler/lib/src/ssa/kernel_impact.dart ('k') | pkg/compiler/lib/src/ssa/optimize.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698