Index: lib/compiler/implementation/ssa/codegen_helpers.dart |
=================================================================== |
--- lib/compiler/implementation/ssa/codegen_helpers.dart (revision 8089) |
+++ lib/compiler/implementation/ssa/codegen_helpers.dart (working copy) |
@@ -22,13 +22,6 @@ |
visitDominatorTree(graph); |
} |
- bool usedOnlyByPhis(instruction) { |
- for (HInstruction user in instruction.usedBy) { |
- if (user is! HPhi) return false; |
- } |
- return true; |
- } |
- |
void visitInstruction(HInstruction instruction) { |
// A code motion invariant instruction is dealt before visiting it. |
assert(!instruction.isCodeMotionInvariant()); |
@@ -102,25 +95,6 @@ |
return false; |
} |
- for (HBasicBlock successor in block.successors) { |
- // Only add the input of the first phi. Making inputs of |
- // later phis generate-at-use-site would make them move |
- // accross the assignment of the first phi, and we need |
- // more analysis before we can do that. |
- HPhi phi = successor.phis.first; |
- if (phi != null) { |
- int index = successor.predecessors.indexOf(block); |
- HInstruction input = phi.inputs[index]; |
- if (!generateAtUseSite.contains(input) |
- && !input.isCodeMotionInvariant() |
- && input.usedBy.length == 1 |
- && input is! HPhi) { |
- expectedInputs.add(input); |
- } |
- break; |
- } |
- } |
- |
block.last.accept(this); |
for (HInstruction instruction = block.last.previous; |
instruction !== null; |
@@ -427,70 +401,3 @@ |
// All binary operators (excluding assignment) are left associative. |
int get precedence() => left; |
} |
- |
-class PhiEquivalator { |
- final Equivalence<HPhi> equivalence; |
- final Map<HPhi, String> logicalOperations; |
- PhiEquivalator(this.equivalence, this.logicalOperations); |
- |
- void analyzeGraph(HGraph graph) { |
- graph.blocks.forEach(analyzeBlock); |
- } |
- |
- void analyzeBlock(HBasicBlock block) { |
- for (HPhi phi = block.phis.first; phi !== null; phi = phi.next) { |
- if (!logicalOperations.containsKey(phi) && |
- phi.usedBy.length == 1 && |
- phi.usedBy[0] is HPhi && |
- phi.block.id < phi.usedBy[0].block.id) { |
- equivalence.makeEquivalent(phi, phi.usedBy[0]); |
- } |
- } |
- } |
-} |
- |
- |
-/** |
- * Try to figure out which phis can be represented by the same temporary |
- * variable, to avoid creating a new variable for each phi. |
- */ |
-class Equivalence<T extends Hashable> { |
- // Represent equivalence classes of HPhi nodes as a forest of trees, |
- // where each tree is one equivalence class, and the root is the |
- // canonical representative for the equivalence class. |
- // Implement the forest by having each phi point to its parent in the tree, |
- // transitively linking it to the root, which itself doesn't have a parent. |
- final Map<T,T> representative; |
- |
- Equivalence() : representative = new Map<T,T>(); |
- |
- T makeEquivalent(T a, T b) { |
- T root1 = getRepresentative(a); |
- T root2 = getRepresentative(b); |
- if (root1 !== root2) { |
- // Merge the trees for the two classes into one. |
- representative[root1] = root2; |
- } |
- } |
- |
- /** |
- * Get the canonical representative for an equivalence class of phis. |
- */ |
- T getRepresentative(T element) { |
- T parent = representative[element]; |
- if (parent === null) { |
- // This is the root of a tree (a previously unseen node is considered |
- // the root of its own tree). |
- return element; |
- } |
- // Shorten the path for all the elements on the way to the root, |
- // improving the performance of future lookups. |
- T root = getRepresentative(parent); |
- if (root !== parent) representative[element] = root; |
- return root; |
- } |
- |
- bool areEquivalent(T a, T b) { |
- return getRepresentative(a) === getRepresentative(b); |
- } |
-} |