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

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

Issue 2799603003: dart2js: make dominator tree traversals nonrecursive (Closed)
Patch Set: fix comment Created 3 years, 8 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 | « no previous file | tests/compiler/dart2js_extra/dart2js_extra.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/nodes.dart
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index ac1961c96b51fa323f04f9e5ae223aaf29d264f8..12d82d9a966f2b318da8dc2c7aabcb4a2f287b77 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -105,32 +105,80 @@ abstract class HVisitor<R> {
abstract class HGraphVisitor {
visitDominatorTree(HGraph graph) {
- void visitBasicBlockAndSuccessors(HBasicBlock block) {
- visitBasicBlock(block);
- List dominated = block.dominatedBlocks;
- for (int i = 0; i < dominated.length; i++) {
- visitBasicBlockAndSuccessors(dominated[i]);
+ // Recursion free version of:
+ //
+ // void visitBasicBlockAndSuccessors(HBasicBlock block) {
+ // visitBasicBlock(block);
+ // List dominated = block.dominatedBlocks;
+ // for (int i = 0; i < dominated.length; i++) {
+ // visitBasicBlockAndSuccessors(dominated[i]);
+ // }
+ // }
+ // visitBasicBlockAndSuccessors(graph.entry);
+
+ _Frame frame = new _Frame(null);
+ frame.block = graph.entry;
+ frame.index = 0;
+
+ visitBasicBlock(frame.block);
+
+ while (frame != null) {
+ HBasicBlock block = frame.block;
+ int index = frame.index;
+ if (index < block.dominatedBlocks.length) {
+ frame.index = index + 1;
+ frame = frame.next ??= new _Frame(frame);
+ frame.block = block.dominatedBlocks[index];
+ frame.index = 0;
+ visitBasicBlock(frame.block);
+ continue;
}
+ frame = frame.previous;
}
-
- visitBasicBlockAndSuccessors(graph.entry);
}
visitPostDominatorTree(HGraph graph) {
- void visitBasicBlockAndSuccessors(HBasicBlock block) {
- List dominated = block.dominatedBlocks;
- for (int i = dominated.length - 1; i >= 0; i--) {
- visitBasicBlockAndSuccessors(dominated[i]);
+ // Recusion free version of:
+ //
+ // void visitBasicBlockAndSuccessors(HBasicBlock block) {
+ // List dominated = block.dominatedBlocks;
+ // for (int i = dominated.length - 1; i >= 0; i--) {
+ // visitBasicBlockAndSuccessors(dominated[i]);
+ // }
+ // visitBasicBlock(block);
+ // }
+ // visitBasicBlockAndSuccessors(graph.entry);
+
+ _Frame frame = new _Frame(null);
+ frame.block = graph.entry;
+ frame.index = frame.block.dominatedBlocks.length;
+
+ while (frame != null) {
+ HBasicBlock block = frame.block;
+ int index = frame.index;
+ if (index > 0) {
+ frame.index = index - 1;
+ frame = frame.next ??= new _Frame(frame);
+ frame.block = block.dominatedBlocks[index - 1];
+ frame.index = frame.block.dominatedBlocks.length;
+ continue;
}
visitBasicBlock(block);
+ frame = frame.previous;
}
-
- visitBasicBlockAndSuccessors(graph.entry);
}
visitBasicBlock(HBasicBlock block);
}
+class _Frame {
+ final _Frame previous;
+ _Frame next;
+ HBasicBlock block;
+ int index;
+ _Frame(this.previous);
+}
+
abstract class HInstructionVisitor extends HGraphVisitor {
HBasicBlock currentBlock;
« no previous file with comments | « no previous file | tests/compiler/dart2js_extra/dart2js_extra.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698