summaryrefslogtreecommitdiffstats
path: root/dx/src/com/android/jack/dx/ssa/DomFront.java
diff options
context:
space:
mode:
Diffstat (limited to 'dx/src/com/android/jack/dx/ssa/DomFront.java')
-rw-r--r--dx/src/com/android/jack/dx/ssa/DomFront.java282
1 files changed, 138 insertions, 144 deletions
diff --git a/dx/src/com/android/jack/dx/ssa/DomFront.java b/dx/src/com/android/jack/dx/ssa/DomFront.java
index 9e67f46..5a599ff 100644
--- a/dx/src/com/android/jack/dx/ssa/DomFront.java
+++ b/dx/src/com/android/jack/dx/ssa/DomFront.java
@@ -16,12 +16,9 @@
package com.android.jack.dx.ssa;
-import com.android.jack.dx.util.BitIntSet;
import com.android.jack.dx.util.IntSet;
-import com.android.jack.dx.util.ListIntSet;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.BitSet;
/**
@@ -30,175 +27,172 @@ import java.util.BitSet;
* Harvey, and Kennedy; transliterated to Java.
*/
public class DomFront {
- /** local debug flag */
- private static boolean DEBUG = false;
+ /** local debug flag */
+ private static final boolean DEBUG = false;
- /** {@code non-null;} method being processed */
- private final SsaMethod meth;
+ /** {@code non-null;} method being processed */
+ private final SsaMethod meth;
- private final ArrayList<SsaBasicBlock> nodes;
+ private final ArrayList<SsaBasicBlock> nodes;
- private final DomInfo[] domInfos;
+ private final DomInfo[] domInfos;
+ /**
+ * Dominance-frontier information for a single basic block.
+ */
+ public static class DomInfo {
/**
- * Dominance-frontier information for a single basic block.
+ * {@code null-ok;} the dominance frontier set indexed by
+ * block index
*/
- public static class DomInfo {
- /**
- * {@code null-ok;} the dominance frontier set indexed by
- * block index
- */
- public IntSet dominanceFrontiers;
-
- /** {@code >= 0 after run();} the index of the immediate dominator */
- public int idom = -1;
+ public IntSet dominanceFrontiers;
+
+ /** {@code >= 0 after run();} the index of the immediate dominator */
+ public int idom = -1;
+ }
+
+ /**
+ * Constructs instance. Call {@link DomFront#run} to process.
+ *
+ * @param meth {@code non-null;} method to process
+ */
+ public DomFront(SsaMethod meth) {
+ this.meth = meth;
+ nodes = meth.getBlocks();
+
+ int szNodes = nodes.size();
+ domInfos = new DomInfo[szNodes];
+
+ for (int i = 0; i < szNodes; i++) {
+ domInfos[i] = new DomInfo();
+ }
+ }
+
+ /**
+ * Calculates the dominance frontier information for the method.
+ *
+ * @return {@code non-null;} an array of DomInfo structures
+ */
+ public DomInfo[] run() {
+ int szNodes = nodes.size();
+
+ if (DEBUG) {
+ for (int i = 0; i < szNodes; i++) {
+ SsaBasicBlock node = nodes.get(i);
+ System.out.println("pred[" + i + "]: " + node.getPredecessors());
+ }
}
- /**
- * Constructs instance. Call {@link DomFront#run} to process.
- *
- * @param meth {@code non-null;} method to process
- */
- public DomFront(SsaMethod meth) {
- this.meth = meth;
- nodes = meth.getBlocks();
-
- int szNodes = nodes.size();
- domInfos = new DomInfo[szNodes];
+ Dominators.make(meth, domInfos, false);
- for (int i = 0; i < szNodes; i++) {
- domInfos[i] = new DomInfo();
- }
+ if (DEBUG) {
+ for (int i = 0; i < szNodes; i++) {
+ DomInfo info = domInfos[i];
+ System.out.println("idom[" + i + "]: " + info.idom);
+ }
}
- /**
- * Calculates the dominance frontier information for the method.
- *
- * @return {@code non-null;} an array of DomInfo structures
- */
- public DomInfo[] run() {
- int szNodes = nodes.size();
-
- if (DEBUG) {
- for (int i = 0; i < szNodes; i++) {
- SsaBasicBlock node = nodes.get(i);
- System.out.println("pred[" + i + "]: "
- + node.getPredecessors());
- }
- }
-
- Dominators methDom = Dominators.make(meth, domInfos, false);
+ buildDomTree();
- if (DEBUG) {
- for (int i = 0; i < szNodes; i++) {
- DomInfo info = domInfos[i];
- System.out.println("idom[" + i + "]: "
- + info.idom);
- }
- }
+ if (DEBUG) {
+ debugPrintDomChildren();
+ }
- buildDomTree();
+ for (int i = 0; i < szNodes; i++) {
+ domInfos[i].dominanceFrontiers = SetFactory.makeDomFrontSet(szNodes);
+ }
- if (DEBUG) {
- debugPrintDomChildren();
- }
+ calcDomFronts();
- for (int i = 0; i < szNodes; i++) {
- domInfos[i].dominanceFrontiers
- = SetFactory.makeDomFrontSet(szNodes);
- }
-
- calcDomFronts();
+ if (DEBUG) {
+ for (int i = 0; i < szNodes; i++) {
+ System.out.println("df[" + i + "]: " + domInfos[i].dominanceFrontiers);
+ }
+ }
- if (DEBUG) {
- for (int i = 0; i < szNodes; i++) {
- System.out.println("df[" + i + "]: "
- + domInfos[i].dominanceFrontiers);
- }
- }
+ return domInfos;
+ }
- return domInfos;
- }
+ private void debugPrintDomChildren() {
+ int szNodes = nodes.size();
- private void debugPrintDomChildren() {
- int szNodes = nodes.size();
-
- for (int i = 0; i < szNodes; i++) {
- SsaBasicBlock node = nodes.get(i);
- StringBuffer sb = new StringBuffer();
-
- sb.append('{');
- boolean comma = false;
- for (SsaBasicBlock child : node.getDomChildren()) {
- if (comma) {
- sb.append(',');
- }
- sb.append(child);
- comma = true;
- }
- sb.append('}');
+ for (int i = 0; i < szNodes; i++) {
+ SsaBasicBlock node = nodes.get(i);
+ StringBuffer sb = new StringBuffer();
- System.out.println("domChildren[" + node + "]: "
- + sb);
+ sb.append('{');
+ boolean comma = false;
+ for (SsaBasicBlock child : node.getDomChildren()) {
+ if (comma) {
+ sb.append(',');
}
+ sb.append(child);
+ comma = true;
+ }
+ sb.append('}');
+
+ System.out.println("domChildren[" + node + "]: " + sb);
}
+ }
- /**
- * The dominators algorithm leaves us knowing who the immediate dominator
- * is for each node. This sweeps the node list and builds the proper
- * dominance tree.
- */
- private void buildDomTree() {
- int szNodes = nodes.size();
+ /**
+ * The dominators algorithm leaves us knowing who the immediate dominator
+ * is for each node. This sweeps the node list and builds the proper
+ * dominance tree.
+ */
+ private void buildDomTree() {
+ int szNodes = nodes.size();
- for (int i = 0; i < szNodes; i++) {
- DomInfo info = domInfos[i];
+ for (int i = 0; i < szNodes; i++) {
+ DomInfo info = domInfos[i];
- if (info.idom == -1) continue;
+ if (info.idom == -1) {
+ continue;
+ }
- SsaBasicBlock domParent = nodes.get(info.idom);
- domParent.addDomChild(nodes.get(i));
- }
+ SsaBasicBlock domParent = nodes.get(info.idom);
+ domParent.addDomChild(nodes.get(i));
}
+ }
+
+ /**
+ * Calculates the dominance-frontier set.
+ * from "A Simple, Fast Dominance Algorithm" by Cooper,
+ * Harvey, and Kennedy; transliterated to Java.
+ */
+ private void calcDomFronts() {
+ int szNodes = nodes.size();
+
+ for (int b = 0; b < szNodes; b++) {
+ SsaBasicBlock nb = nodes.get(b);
+ DomInfo nbInfo = domInfos[b];
+ BitSet pred = nb.getPredecessors();
+
+ if (pred.cardinality() > 1) {
+ for (int i = pred.nextSetBit(0); i >= 0; i = pred.nextSetBit(i + 1)) {
+
+ for (int runnerIndex = i; runnerIndex != nbInfo.idom; /* empty */) {
+ /*
+ * We can stop if we hit a block we already
+ * added label to, since we must be at a part
+ * of the dom tree we have seen before.
+ */
+ if (runnerIndex == -1) {
+ break;
+ }
- /**
- * Calculates the dominance-frontier set.
- * from "A Simple, Fast Dominance Algorithm" by Cooper,
- * Harvey, and Kennedy; transliterated to Java.
- */
- private void calcDomFronts() {
- int szNodes = nodes.size();
-
- for (int b = 0; b < szNodes; b++) {
- SsaBasicBlock nb = nodes.get(b);
- DomInfo nbInfo = domInfos[b];
- BitSet pred = nb.getPredecessors();
-
- if (pred.cardinality() > 1) {
- for (int i = pred.nextSetBit(0); i >= 0;
- i = pred.nextSetBit(i + 1)) {
-
- for (int runnerIndex = i;
- runnerIndex != nbInfo.idom; /* empty */) {
- /*
- * We can stop if we hit a block we already
- * added label to, since we must be at a part
- * of the dom tree we have seen before.
- */
- if (runnerIndex == -1) break;
-
- DomInfo runnerInfo = domInfos[runnerIndex];
-
- if (runnerInfo.dominanceFrontiers.has(b)) {
- break;
- }
-
- // Add b to runner's dominance frontier set.
- runnerInfo.dominanceFrontiers.add(b);
- runnerIndex = runnerInfo.idom;
- }
- }
+ DomInfo runnerInfo = domInfos[runnerIndex];
+
+ if (runnerInfo.dominanceFrontiers.has(b)) {
+ break;
}
+
+ // Add b to runner's dominance frontier set.
+ runnerInfo.dominanceFrontiers.add(b);
+ runnerIndex = runnerInfo.idom;
+ }
}
+ }
}
+ }
}