getAll(K key) {
+ return new ArrayList<>(innerMap.getOrDefault(key, List.of()));
+ }
+
+ public boolean containsKey(K key) {
+ return innerMap.containsKey(key);
+ }
+}
diff --git a/src/ch/usi/inf/sp/cfg/builder/SwitchInstructionNodeInfo.java b/src/ch/usi/inf/sp/cfg/builder/SwitchInstructionNodeInfo.java
new file mode 100644
index 0000000..c4993b0
--- /dev/null
+++ b/src/ch/usi/inf/sp/cfg/builder/SwitchInstructionNodeInfo.java
@@ -0,0 +1,13 @@
+package ch.usi.inf.sp.cfg.builder;
+
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+
+public interface SwitchInstructionNodeInfo {
+ AbstractInsnNode getNode();
+ int getCaseCount();
+ LabelNode getLabelForCase(int index);
+ String getKeyForCase(int index);
+
+ LabelNode getDefaultCase();
+}
diff --git a/src/ch/usi/inf/sp/cfg/builder/TableSwitchInstructionNodeInfo.java b/src/ch/usi/inf/sp/cfg/builder/TableSwitchInstructionNodeInfo.java
new file mode 100644
index 0000000..6091c2a
--- /dev/null
+++ b/src/ch/usi/inf/sp/cfg/builder/TableSwitchInstructionNodeInfo.java
@@ -0,0 +1,38 @@
+package ch.usi.inf.sp.cfg.builder;
+
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.TableSwitchInsnNode;
+
+public class TableSwitchInstructionNodeInfo implements SwitchInstructionNodeInfo {
+ private final TableSwitchInsnNode node;
+
+ public TableSwitchInstructionNodeInfo(TableSwitchInsnNode node) {
+ this.node = node;
+ }
+
+ @Override
+ public AbstractInsnNode getNode() {
+ return node;
+ }
+
+ @Override
+ public int getCaseCount() {
+ return node.labels.size();
+ }
+
+ @Override
+ public LabelNode getLabelForCase(int index) {
+ return node.labels.get(index);
+ }
+
+ @Override
+ public String getKeyForCase(int index) {
+ return Integer.toString(node.min + index);
+ }
+
+ @Override
+ public LabelNode getDefaultCase() {
+ return node.dflt;
+ }
+}
diff --git a/src/ch/usi/inf/sp/dom/DominatorAnalyzer.java b/src/ch/usi/inf/sp/dom/DominatorAnalyzer.java
index adbc072..34b3c02 100644
--- a/src/ch/usi/inf/sp/dom/DominatorAnalyzer.java
+++ b/src/ch/usi/inf/sp/dom/DominatorAnalyzer.java
@@ -2,18 +2,18 @@ package ch.usi.inf.sp.dom;
import ch.usi.inf.sp.cfg.BasicBlock;
import ch.usi.inf.sp.cfg.ControlFlowGraph;
+import ch.usi.inf.sp.graph.Edge;
import ch.usi.inf.sp.graph.Traversal;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
public class DominatorAnalyzer {
/**
* Cooper et al.'s "Engineered Algorithm".
+ *
* ================================================================
* for all nodes, b // initialize the dominators array
* doms[b] ← Undefined
@@ -40,13 +40,71 @@ public class DominatorAnalyzer {
* finger2 = doms[finger2]
* return finger1
* ================================================================
+ *
* Figure 3 of Cooper, Harvey, Kennedy
*/
public static DominatorTree analyze(final ControlFlowGraph cfg) {
- //TODO
- return null;
+ final Map dominators = new HashMap<>();
+ final BasicBlock entryNode = cfg.getEntry();
+ dominators.put(entryNode, entryNode);
+
+ final List rpo = Traversal.getNodesInReversePostOrder(cfg, entryNode);
+
+ boolean changed = true;
+ while (changed) {
+ changed = false;
+ for (final BasicBlock bb : rpo) {
+ if (bb == entryNode) {
+ continue;
+ }
+
+ final List predecessors = bb.getInEdges().stream()
+ .map(Edge::getFrom)
+ .collect(Collectors.toCollection(LinkedList::new));
+
+ if (predecessors.isEmpty()) {
+ throw new IllegalStateException("all non-entry nodes should have one predecessor");
+ }
+
+ BasicBlock newDominator = predecessors.remove(0);
+
+ for (final BasicBlock pred : predecessors) {
+ if (dominators.containsKey(pred)) {
+ newDominator = intersect(pred, newDominator, dominators, Comparator.comparing(rpo::indexOf).reversed());
+ }
+ }
+
+ if (dominators.get(bb) != newDominator) {
+ dominators.put(bb, newDominator);
+ changed = true;
+ }
+ }
+ }
+
+ final DominatorTree tree = new DominatorTree();
+ tree.setRootBlock(entryNode);
+ for (final Map.Entry entry : dominators.entrySet()) {
+ if (entry.getKey() != entryNode) {
+ tree.addDominanceEdge(entry.getValue(), entry.getKey());
+ }
+ }
+
+ return tree;
}
- // probably add a method intersect(...)
+ public static BasicBlock intersect(BasicBlock b1, BasicBlock b2, Map dominators, Comparator super BasicBlock> postOrder) {
+ BasicBlock finger1 = b1;
+ BasicBlock finger2 = b2;
+ while (postOrder.compare(finger1, finger2) != 0) {
+ while (postOrder.compare(finger1, finger2) < 0) {
+ finger1 = dominators.get(finger1);
+ }
+ while (postOrder.compare(finger1, finger2) > 0) {
+ finger2 = dominators.get(finger2);
+ }
+ }
+
+ return finger1;
+ }
}
diff --git a/src/ch/usi/inf/sp/graph/Traversal.java b/src/ch/usi/inf/sp/graph/Traversal.java
index ed5f1b1..3b0d5d7 100644
--- a/src/ch/usi/inf/sp/graph/Traversal.java
+++ b/src/ch/usi/inf/sp/graph/Traversal.java
@@ -14,7 +14,8 @@ public class Traversal {
/**
* From: https://eli.thegreenplace.net/2015/directed-graph-traversal-orderings-and-applications-to-data-flow-analysis/
- *
+ *
+ *
* def postorder(graph, root):
* """Return a post-order ordering of nodes in the graph."""
* visited = set()
@@ -27,13 +28,30 @@ public class Traversal {
* order.append(node)
* dfs_walk(root)
* return order
+ *
*/
public static , N extends Node, E extends Edge>
List getNodesInPostOrder(final DiGraph graph, final N entryNode) {
- //TODO
- return null;
+ final Set visited = new HashSet<>();
+ final List order = new ArrayList<>();
+ final Deque visitStack = new ArrayDeque<>();
+ visitStack.push(entryNode);
+
+ mainLoop:
+ while (!visitStack.isEmpty()) {
+ final N node = visitStack.pop();
+ for (final E outEdge : node.getOutEdges()) {
+ final N successor = outEdge.getTo();
+ if (!visited.contains(successor)) {
+ visited.add(successor);
+ visitStack.push(node);
+ visitStack.push(successor);
+ continue mainLoop;
+ }
+ }
+ order.add(node);
+ }
+
+ return order;
}
-
- // probably add a method dfsWalk(...)
-
}
diff --git a/starter-lab-04-dominator-analysis.iml b/starter-lab-04-dominator-analysis.iml
index 622d288..702823c 100644
--- a/starter-lab-04-dominator-analysis.iml
+++ b/starter-lab-04-dominator-analysis.iml
@@ -21,5 +21,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-output/.asm.txt b/test-output/.asm.txt
new file mode 100644
index 0000000..b94ec36
--- /dev/null
+++ b/test-output/.asm.txt
@@ -0,0 +1,6 @@
+ Method: ()V
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 0
+ 3: INVOKESPECIAL java/lang/Object. ()V
+ 4: RETURN
diff --git a/test-output/.cfg.dot b/test-output/.cfg.dot
new file mode 100644
index 0000000..e3cc09e
--- /dev/null
+++ b/test-output/.cfg.dot
@@ -0,0 +1,10 @@
+digraph init {
+
+ node [shape=record]
+ "initbb-1" [shape=circle,label="e",xlabel="init"]
+ "initbb-2" [shape=circle,label="x"]
+ "initbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: INVOKESPECIAL java/lang/Object. ()V|4: RETURN }"]
+
+ "initbb-1" -> "initbb0"
+ "initbb0" -> "initbb-2"
+}
diff --git a/test-output/.combined.dot b/test-output/.combined.dot
new file mode 100644
index 0000000..6e92ea1
--- /dev/null
+++ b/test-output/.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label=""
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: INVOKESPECIAL java/lang/Object. ()V\l|4: RETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/.dt.dot b/test-output/.dt.dot
new file mode 100644
index 0000000..7dd7d0e
--- /dev/null
+++ b/test-output/.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label=""
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/all.cfg.dot b/test-output/all.cfg.dot
new file mode 100644
index 0000000..03559fd
--- /dev/null
+++ b/test-output/all.cfg.dot
@@ -0,0 +1,805 @@
+digraph root {
+ node [label="\N",
+ shape=record
+ ];
+ subgraph privateInstanceCallMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "privateInstanceCallMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=privateInstanceCallMethod];
+ privateInstanceCallMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V|4: // label|\
+5: // line number information|6: ICONST_2 |7: IRETURN }"];
+ "privateInstanceCallMethodbb-1" -> privateInstanceCallMethodbb0;
+ "privateInstanceCallMethodbb-2" [label=x,
+ shape=circle];
+ privateInstanceCallMethodbb0 -> "privateInstanceCallMethodbb-2";
+ }
+ subgraph privateInstanceCallTarget {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "privateInstanceCallTargetbb-1" [label=e,
+ shape=circle,
+ xlabel=privateInstanceCallTarget];
+ privateInstanceCallTargetbb0 [label="0|{0: // label|1: // line number information|2: RETURN }"];
+ "privateInstanceCallTargetbb-1" -> privateInstanceCallTargetbb0;
+ "privateInstanceCallTargetbb-2" [label=x,
+ shape=circle];
+ privateInstanceCallTargetbb0 -> "privateInstanceCallTargetbb-2";
+ }
+ subgraph allocAndInit2dArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "allocAndInit2dArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=allocAndInit2dArrayMethod];
+ allocAndInit2dArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_1 |3: ANEWARRAY [I|4: DUP |5: ICONST_0 |6: ICONST_1 |7: NEWARRAY T_INT|\
+8: DUP |9: ICONST_0 |10: ICONST_1 |11: IASTORE |12: AASTORE |13: ARETURN }"];
+ "allocAndInit2dArrayMethodbb-1" -> allocAndInit2dArrayMethodbb0;
+ "allocAndInit2dArrayMethodbb-2" [label=x,
+ shape=circle];
+ allocAndInit2dArrayMethodbb0 -> "allocAndInit2dArrayMethodbb-2";
+ }
+ subgraph allocAndInitIntArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "allocAndInitIntArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=allocAndInitIntArrayMethod];
+ allocAndInitIntArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: NEWARRAY T_INT|4: DUP |5: ICONST_0 |6: ICONST_1 |7: IASTORE |8: DUP |\
+9: ICONST_1 |10: ICONST_2 |11: IASTORE |12: ARETURN }"];
+ "allocAndInitIntArrayMethodbb-1" -> allocAndInitIntArrayMethodbb0;
+ "allocAndInitIntArrayMethodbb-2" [label=x,
+ shape=circle];
+ allocAndInitIntArrayMethodbb0 -> "allocAndInitIntArrayMethodbb-2";
+ }
+ subgraph allocAndInitObjectArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "allocAndInitObjectArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=allocAndInitObjectArrayMethod];
+ allocAndInitObjectArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY java/lang/Object|4: DUP |5: ICONST_0 |6: LDC 1|7: AASTORE |\
+8: DUP |9: ICONST_1 |10: LDC 2|11: AASTORE |12: ARETURN }"];
+ "allocAndInitObjectArrayMethodbb-1" -> allocAndInitObjectArrayMethodbb0;
+ "allocAndInitObjectArrayMethodbb-2" [label=x,
+ shape=circle];
+ allocAndInitObjectArrayMethodbb0 -> "allocAndInitObjectArrayMethodbb-2";
+ }
+ subgraph allocIncomplete2dArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "allocIncomplete2dArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=allocIncomplete2dArrayMethod];
+ allocIncomplete2dArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY [I|4: ARETURN }"];
+ "allocIncomplete2dArrayMethodbb-1" -> allocIncomplete2dArrayMethodbb0;
+ "allocIncomplete2dArrayMethodbb-2" [label=x,
+ shape=circle];
+ allocIncomplete2dArrayMethodbb0 -> "allocIncomplete2dArrayMethodbb-2";
+ }
+ subgraph forMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "forMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=forMethod];
+ forMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |\
+7: ISTORE 3}"];
+ "forMethodbb-1" -> forMethodbb0;
+ "forMethodbb-2" [label=x,
+ shape=circle];
+ forMethodbb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 23}"];
+ forMethodbb0 -> forMethodbb8;
+ forMethodbb13 [label="13|{13: // label|14: // line number information|15: ILOAD 2|16: ILOAD 3|17: IADD |18: ISTORE 2|19: // label|20: // line number \
+information|21: IINC 1 1|22: GOTO 8}"];
+ forMethodbb8 -> forMethodbb13;
+ forMethodbb23 [label="23|{23: // label|24: // line number information|25: // stack frame map|26: ILOAD 2|27: IRETURN }"];
+ forMethodbb8 -> forMethodbb23 [label=T];
+ forMethodbb13 -> forMethodbb8 [label=T];
+ forMethodbb23 -> "forMethodbb-2";
+ }
+ subgraph forWithBreakMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "forWithBreakMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=forWithBreakMethod];
+ forWithBreakMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |\
+7: ISTORE 3}"];
+ "forWithBreakMethodbb-1" -> forWithBreakMethodbb0;
+ "forWithBreakMethodbb-2" [label=x,
+ shape=circle];
+ forWithBreakMethodbb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 32}"];
+ forWithBreakMethodbb0 -> forWithBreakMethodbb8;
+ forWithBreakMethodbb13 [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"];
+ forWithBreakMethodbb8 -> forWithBreakMethodbb13;
+ forWithBreakMethodbb32 [label="32|{32: // label|33: // line number information|34: // stack frame map|35: ILOAD 2|36: IRETURN }"];
+ forWithBreakMethodbb8 -> forWithBreakMethodbb32 [label=T];
+ forWithBreakMethodbb18 [label="18|{18: // label|19: // line number information|20: GOTO 32}"];
+ forWithBreakMethodbb13 -> forWithBreakMethodbb18;
+ forWithBreakMethodbb21 [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2|28: // \
+label|29: // line number information|30: IINC 3 1|31: GOTO 8}"];
+ forWithBreakMethodbb13 -> forWithBreakMethodbb21 [label=T];
+ forWithBreakMethodbb18 -> forWithBreakMethodbb32 [label=T];
+ forWithBreakMethodbb21 -> forWithBreakMethodbb8 [label=T];
+ forWithBreakMethodbb32 -> "forWithBreakMethodbb-2";
+ }
+ subgraph forWithContinueMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "forWithContinueMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=forWithContinueMethod];
+ forWithContinueMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |\
+7: ISTORE 3}"];
+ "forWithContinueMethodbb-1" -> forWithContinueMethodbb0;
+ "forWithContinueMethodbb-2" [label=x,
+ shape=circle];
+ forWithContinueMethodbb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 33}"];
+ forWithContinueMethodbb0 -> forWithContinueMethodbb8;
+ forWithContinueMethodbb13 [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"];
+ forWithContinueMethodbb8 -> forWithContinueMethodbb13;
+ forWithContinueMethodbb33 [label="33|{33: // label|34: // line number information|35: // stack frame map|36: ILOAD 2|37: IRETURN }"];
+ forWithContinueMethodbb8 -> forWithContinueMethodbb33 [label=T];
+ forWithContinueMethodbb18 [label="18|{18: // label|19: // line number information|20: GOTO 28}"];
+ forWithContinueMethodbb13 -> forWithContinueMethodbb18;
+ forWithContinueMethodbb21 [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2}"];
+ forWithContinueMethodbb13 -> forWithContinueMethodbb21 [label=T];
+ forWithContinueMethodbb28 [label="28|{28: // label|29: // line number information|30: // stack frame map|31: IINC 3 1|32: GOTO 8}"];
+ forWithContinueMethodbb18 -> forWithContinueMethodbb28 [label=T];
+ forWithContinueMethodbb21 -> forWithContinueMethodbb28;
+ forWithContinueMethodbb28 -> forWithContinueMethodbb8 [label=T];
+ forWithContinueMethodbb33 -> "forWithContinueMethodbb-2";
+ }
+ subgraph ifElseMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "ifElseMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=ifElseMethod];
+ ifElseMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: \
+IFLE 13}"];
+ "ifElseMethodbb-1" -> ifElseMethodbb0;
+ "ifElseMethodbb-2" [label=x,
+ shape=circle];
+ ifElseMethodbb8 [label="8|{8: // label|9: // line number information|10: ICONST_0 |11: ISTORE 2|12: GOTO 18}"];
+ ifElseMethodbb0 -> ifElseMethodbb8;
+ ifElseMethodbb13 [label="13|{13: // label|14: // line number information|15: // stack frame map|16: ILOAD 1|17: ISTORE 2}"];
+ ifElseMethodbb0 -> ifElseMethodbb13 [label=T];
+ ifElseMethodbb18 [label="18|{18: // label|19: // line number information|20: // stack frame map|21: ILOAD 2|22: IRETURN }"];
+ ifElseMethodbb8 -> ifElseMethodbb18 [label=T];
+ ifElseMethodbb13 -> ifElseMethodbb18;
+ ifElseMethodbb18 -> "ifElseMethodbb-2";
+ }
+ subgraph instanceCallMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "instanceCallMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=instanceCallMethod];
+ instanceCallMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V|4: // label|5: // \
+line number information|6: ICONST_2 |7: IRETURN }"];
+ "instanceCallMethodbb-1" -> instanceCallMethodbb0;
+ "instanceCallMethodbb-2" [label=x,
+ shape=circle];
+ instanceCallMethodbb0 -> "instanceCallMethodbb-2";
+ }
+ subgraph instanceCallTarget {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "instanceCallTargetbb-1" [label=e,
+ shape=circle,
+ xlabel=instanceCallTarget];
+ instanceCallTargetbb0 [label="0|{0: // label|1: // line number information|2: RETURN }"];
+ "instanceCallTargetbb-1" -> instanceCallTargetbb0;
+ "instanceCallTargetbb-2" [label=x,
+ shape=circle];
+ instanceCallTargetbb0 -> "instanceCallTargetbb-2";
+ }
+ subgraph interfaceCallMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "interfaceCallMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=interfaceCallMethod];
+ interfaceCallMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V|4: // \
+label|5: // line number information|6: ICONST_2 |7: IRETURN }"];
+ "interfaceCallMethodbb-1" -> interfaceCallMethodbb0;
+ "interfaceCallMethodbb-2" [label=x,
+ shape=circle];
+ interfaceCallMethodbb0 -> "interfaceCallMethodbb-2";
+ }
+ subgraph nestedFor {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "nestedForbb-1" [label=e,
+ shape=circle,
+ xlabel=nestedFor];
+ nestedForbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |\
+7: ISTORE 3}"];
+ "nestedForbb-1" -> nestedForbb0;
+ "nestedForbb-2" [label=x,
+ shape=circle];
+ nestedForbb8 [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 37}"];
+ nestedForbb0 -> nestedForbb8;
+ nestedForbb13 [label="13|{13: // label|14: // line number information|15: ICONST_0 |16: ISTORE 4}"];
+ nestedForbb8 -> nestedForbb13;
+ nestedForbb37 [label="37|{37: // label|38: // line number information|39: // stack frame map|40: ILOAD 2|41: IRETURN }"];
+ nestedForbb8 -> nestedForbb37 [label=T];
+ nestedForbb17 [label="17|{17: // label|18: // stack frame map|19: ILOAD 4|20: ILOAD 3|21: IF_ICMPGE 32}"];
+ nestedForbb13 -> nestedForbb17;
+ nestedForbb22 [label="22|{22: // label|23: // line number information|24: ILOAD 2|25: ILOAD 4|26: IADD |27: ISTORE 2|28: // label|29: // line number \
+information|30: IINC 4 1|31: GOTO 17}"];
+ nestedForbb17 -> nestedForbb22;
+ nestedForbb32 [label="32|{32: // label|33: // line number information|34: // stack frame map|35: IINC 3 1|36: GOTO 8}"];
+ nestedForbb17 -> nestedForbb32 [label=T];
+ nestedForbb22 -> nestedForbb17 [label=T];
+ nestedForbb32 -> nestedForbb8 [label=T];
+ nestedForbb37 -> "nestedForbb-2";
+ }
+ subgraph nonShortCircuitMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "nonShortCircuitMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=nonShortCircuitMethod];
+ nonShortCircuitMethodbb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"];
+ "nonShortCircuitMethodbb-1" -> nonShortCircuitMethodbb0;
+ "nonShortCircuitMethodbb-2" [label=x,
+ shape=circle];
+ nonShortCircuitMethodbb5 [label="5|{5: ICONST_1 |6: GOTO 10}"];
+ nonShortCircuitMethodbb0 -> nonShortCircuitMethodbb5;
+ nonShortCircuitMethodbb7 [label="7|{7: // label|8: // stack frame map|9: ICONST_0 }"];
+ nonShortCircuitMethodbb0 -> nonShortCircuitMethodbb7 [label=T];
+ nonShortCircuitMethodbb10 [label="10|{10: // label|11: // stack frame map|12: ILOAD 1|13: ILOAD 3|14: IF_ICMPGE 17}"];
+ nonShortCircuitMethodbb5 -> nonShortCircuitMethodbb10 [label=T];
+ nonShortCircuitMethodbb7 -> nonShortCircuitMethodbb10;
+ nonShortCircuitMethodbb15 [label="15|{15: ICONST_1 |16: GOTO 20}"];
+ nonShortCircuitMethodbb10 -> nonShortCircuitMethodbb15;
+ nonShortCircuitMethodbb17 [label="17|{17: // label|18: // stack frame map|19: ICONST_0 }"];
+ nonShortCircuitMethodbb10 -> nonShortCircuitMethodbb17 [label=T];
+ nonShortCircuitMethodbb20 [label="20|{20: // label|21: // stack frame map|22: IAND |23: IFEQ 28}"];
+ nonShortCircuitMethodbb15 -> nonShortCircuitMethodbb20 [label=T];
+ nonShortCircuitMethodbb17 -> nonShortCircuitMethodbb20;
+ nonShortCircuitMethodbb24 [label="24|{24: // label|25: // line number information|26: ICONST_1 |27: IRETURN }"];
+ nonShortCircuitMethodbb20 -> nonShortCircuitMethodbb24;
+ nonShortCircuitMethodbb28 [label="28|{28: // label|29: // line number information|30: // stack frame map|31: ICONST_0 |32: IRETURN }"];
+ nonShortCircuitMethodbb20 -> nonShortCircuitMethodbb28 [label=T];
+ nonShortCircuitMethodbb24 -> "nonShortCircuitMethodbb-2";
+ nonShortCircuitMethodbb24 -> nonShortCircuitMethodbb28;
+ nonShortCircuitMethodbb28 -> "nonShortCircuitMethodbb-2";
+ }
+ subgraph shortCircuitMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "shortCircuitMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=shortCircuitMethod];
+ shortCircuitMethodbb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 12}"];
+ "shortCircuitMethodbb-1" -> shortCircuitMethodbb0;
+ "shortCircuitMethodbb-2" [label=x,
+ shape=circle];
+ shortCircuitMethodbb5 [label="5|{5: ILOAD 1|6: ILOAD 3|7: IF_ICMPGE 12}"];
+ shortCircuitMethodbb0 -> shortCircuitMethodbb5;
+ shortCircuitMethodbb12 [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ICONST_0 |16: IRETURN }"];
+ shortCircuitMethodbb0 -> shortCircuitMethodbb12 [label=T];
+ shortCircuitMethodbb8 [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: IRETURN }"];
+ shortCircuitMethodbb5 -> shortCircuitMethodbb8;
+ shortCircuitMethodbb5 -> shortCircuitMethodbb12 [label=T];
+ shortCircuitMethodbb8 -> "shortCircuitMethodbb-2";
+ shortCircuitMethodbb8 -> shortCircuitMethodbb12;
+ shortCircuitMethodbb12 -> "shortCircuitMethodbb-2";
+ }
+ subgraph staticCallMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "staticCallMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=staticCallMethod];
+ staticCallMethodbb0 [label="0|{0: // label|1: // line number information|2: INVOKESTATIC ExampleClass.staticCallTarget ()V|3: // label|4: // line number \
+information|5: ICONST_2 |6: IRETURN }"];
+ "staticCallMethodbb-1" -> staticCallMethodbb0;
+ "staticCallMethodbb-2" [label=x,
+ shape=circle];
+ staticCallMethodbb0 -> "staticCallMethodbb-2";
+ }
+ subgraph staticCallTarget {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "staticCallTargetbb-1" [label=e,
+ shape=circle,
+ xlabel=staticCallTarget];
+ staticCallTargetbb0 [label="0|{0: // label|1: // line number information|2: RETURN }"];
+ "staticCallTargetbb-1" -> staticCallTargetbb0;
+ "staticCallTargetbb-2" [label=x,
+ shape=circle];
+ staticCallTargetbb0 -> "staticCallTargetbb-2";
+ }
+ subgraph staticFieldReadMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "staticFieldReadMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=staticFieldReadMethod];
+ staticFieldReadMethodbb0 [label="0|{0: // label|1: // line number information|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;|3: ARETURN }"];
+ "staticFieldReadMethodbb-1" -> staticFieldReadMethodbb0;
+ "staticFieldReadMethodbb-2" [label=x,
+ shape=circle];
+ staticFieldReadMethodbb0 -> "staticFieldReadMethodbb-2";
+ }
+ subgraph staticFieldWriteMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "staticFieldWriteMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=staticFieldWriteMethod];
+ staticFieldWriteMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;|4: // label|\
+5: // line number information|6: RETURN }"];
+ "staticFieldWriteMethodbb-1" -> staticFieldWriteMethodbb0;
+ "staticFieldWriteMethodbb-2" [label=x,
+ shape=circle];
+ staticFieldWriteMethodbb0 -> "staticFieldWriteMethodbb-2";
+ }
+ subgraph switchMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "switchMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=switchMethod];
+ switchMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: \
+TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26}"];
+ "switchMethodbb-1" -> switchMethodbb0;
+ "switchMethodbb-2" [label=x,
+ shape=circle];
+ switchMethodbb8 [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"];
+ switchMethodbb0 -> switchMethodbb8 [label=0];
+ switchMethodbb14 [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"];
+ switchMethodbb0 -> switchMethodbb14 [label=1];
+ switchMethodbb20 [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"];
+ switchMethodbb0 -> switchMethodbb20 [label=2];
+ switchMethodbb26 [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"];
+ switchMethodbb0 -> switchMethodbb26 [label=default];
+ switchMethodbb31 [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"];
+ switchMethodbb8 -> switchMethodbb31 [label=T];
+ switchMethodbb14 -> switchMethodbb31 [label=T];
+ switchMethodbb20 -> switchMethodbb31 [label=T];
+ switchMethodbb26 -> switchMethodbb31;
+ switchMethodbb31 -> "switchMethodbb-2";
+ }
+ subgraph switchMethod2 {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "switchMethod2bb-1" [label=e,
+ shape=circle,
+ xlabel=switchMethod2];
+ switchMethod2bb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: \
+LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26}"];
+ "switchMethod2bb-1" -> switchMethod2bb0;
+ "switchMethod2bb-2" [label=x,
+ shape=circle];
+ switchMethod2bb8 [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"];
+ switchMethod2bb0 -> switchMethod2bb8 [label=0];
+ switchMethod2bb14 [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"];
+ switchMethod2bb0 -> switchMethod2bb14 [label=1000];
+ switchMethod2bb20 [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"];
+ switchMethod2bb0 -> switchMethod2bb20 [label=2000];
+ switchMethod2bb26 [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"];
+ switchMethod2bb0 -> switchMethod2bb26 [label=default];
+ switchMethod2bb31 [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"];
+ switchMethod2bb8 -> switchMethod2bb31 [label=T];
+ switchMethod2bb14 -> switchMethod2bb31 [label=T];
+ switchMethod2bb20 -> switchMethod2bb31 [label=T];
+ switchMethod2bb26 -> switchMethod2bb31;
+ switchMethod2bb31 -> "switchMethod2bb-2";
+ }
+ subgraph whileMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "whileMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=whileMethod];
+ whileMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"];
+ "whileMethodbb-1" -> whileMethodbb0;
+ "whileMethodbb-2" [label=x,
+ shape=circle];
+ whileMethodbb4 [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 1|8: IFLE 19}"];
+ whileMethodbb0 -> whileMethodbb4;
+ whileMethodbb9 [label="9|{9: // label|10: // line number information|11: ILOAD 2|12: ILOAD 1|13: IADD |14: ISTORE 2|15: // label|16: // line number \
+information|17: IINC 1 -1|18: GOTO 4}"];
+ whileMethodbb4 -> whileMethodbb9;
+ whileMethodbb19 [label="19|{19: // label|20: // line number information|21: // stack frame map|22: ILOAD 2|23: IRETURN }"];
+ whileMethodbb4 -> whileMethodbb19 [label=T];
+ whileMethodbb9 -> whileMethodbb4 [label=T];
+ whileMethodbb19 -> "whileMethodbb-2";
+ }
+ subgraph whileTrueMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "whileTrueMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=whileTrueMethod];
+ whileTrueMethodbb0 [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: GOTO 0}"];
+ "whileTrueMethodbb-1" -> whileTrueMethodbb0;
+ "whileTrueMethodbb-2" [label=e,
+ shape=circle,
+ xlabel=whileTrueMethod];
+ whileTrueMethodbb0 -> whileTrueMethodbb0 [label=T];
+ }
+ subgraph alloc2Of3dArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "alloc2Of3dArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=alloc2Of3dArrayMethod];
+ alloc2Of3dArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[[I 2|5: ARETURN }"];
+ "alloc2Of3dArrayMethodbb-1" -> alloc2Of3dArrayMethodbb0;
+ "alloc2Of3dArrayMethodbb-2" [label=x,
+ shape=circle];
+ alloc2Of3dArrayMethodbb0 -> "alloc2Of3dArrayMethodbb-2";
+ }
+ subgraph alloc2dArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "alloc2dArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=alloc2dArrayMethod];
+ alloc2dArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[I 2|5: ARETURN }"];
+ "alloc2dArrayMethodbb-1" -> alloc2dArrayMethodbb0;
+ "alloc2dArrayMethodbb-2" [label=x,
+ shape=circle];
+ alloc2dArrayMethodbb0 -> "alloc2dArrayMethodbb-2";
+ }
+ subgraph allocIntArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "allocIntArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=allocIntArrayMethod];
+ allocIntArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: NEWARRAY T_INT|4: ARETURN }"];
+ "allocIntArrayMethodbb-1" -> allocIntArrayMethodbb0;
+ "allocIntArrayMethodbb-2" [label=x,
+ shape=circle];
+ allocIntArrayMethodbb0 -> "allocIntArrayMethodbb-2";
+ }
+ subgraph allocObjectArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "allocObjectArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=allocObjectArrayMethod];
+ allocObjectArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: ANEWARRAY java/lang/Object|4: ARETURN }"];
+ "allocObjectArrayMethodbb-1" -> allocObjectArrayMethodbb0;
+ "allocObjectArrayMethodbb-2" [label=x,
+ shape=circle];
+ allocObjectArrayMethodbb0 -> "allocObjectArrayMethodbb-2";
+ }
+ subgraph allocObjectMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "allocObjectMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=allocObjectMethod];
+ allocObjectMethodbb0 [label="0|{0: // label|1: // line number information|2: NEW java/lang/Object|3: DUP |4: INVOKESPECIAL java/lang/Object. ()V|5: ARETURN }"];
+ "allocObjectMethodbb-1" -> allocObjectMethodbb0;
+ "allocObjectMethodbb-2" [label=x,
+ shape=circle];
+ allocObjectMethodbb0 -> "allocObjectMethodbb-2";
+ }
+ subgraph arrayLengthMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "arrayLengthMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=arrayLengthMethod];
+ arrayLengthMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ARRAYLENGTH |4: IRETURN }"];
+ "arrayLengthMethodbb-1" -> arrayLengthMethodbb0;
+ "arrayLengthMethodbb-2" [label=x,
+ shape=circle];
+ arrayLengthMethodbb0 -> "arrayLengthMethodbb-2";
+ }
+ subgraph arrayReadMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "arrayReadMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=arrayReadMethod];
+ arrayReadMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: AALOAD |5: ARETURN }"];
+ "arrayReadMethodbb-1" -> arrayReadMethodbb0;
+ "arrayReadMethodbb-2" [label=x,
+ shape=circle];
+ arrayReadMethodbb0 -> "arrayReadMethodbb-2";
+ }
+ subgraph arrayWriteMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "arrayWriteMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=arrayWriteMethod];
+ arrayWriteMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: ALOAD 2|5: AASTORE |6: // label|7: // line number information|\
+8: RETURN }"];
+ "arrayWriteMethodbb-1" -> arrayWriteMethodbb0;
+ "arrayWriteMethodbb-2" [label=x,
+ shape=circle];
+ arrayWriteMethodbb0 -> "arrayWriteMethodbb-2";
+ }
+ subgraph condMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "condMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=condMethod];
+ condMethodbb0 [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"];
+ "condMethodbb-1" -> condMethodbb0;
+ "condMethodbb-2" [label=x,
+ shape=circle];
+ condMethodbb5 [label="5|{5: ILOAD 1|6: GOTO 10}"];
+ condMethodbb0 -> condMethodbb5;
+ condMethodbb7 [label="7|{7: // label|8: // stack frame map|9: ILOAD 2}"];
+ condMethodbb0 -> condMethodbb7 [label=T];
+ condMethodbb10 [label="10|{10: // label|11: // stack frame map|12: IRETURN }"];
+ condMethodbb5 -> condMethodbb10 [label=T];
+ condMethodbb7 -> condMethodbb10;
+ condMethodbb10 -> "condMethodbb-2";
+ }
+ subgraph doWhileMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "doWhileMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=doWhileMethod];
+ doWhileMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"];
+ "doWhileMethodbb-1" -> doWhileMethodbb0;
+ "doWhileMethodbb-2" [label=x,
+ shape=circle];
+ doWhileMethodbb4 [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 2|8: ILOAD 1|9: IADD |10: ISTORE 2|11: // label|\
+12: // line number information|13: IINC 1 -1|14: // label|15: // line number information|16: ILOAD 1|17: IFGT 4}"];
+ doWhileMethodbb0 -> doWhileMethodbb4;
+ doWhileMethodbb4 -> doWhileMethodbb4 [label=T];
+ doWhileMethodbb18 [label="18|{18: // label|19: // line number information|20: ILOAD 2|21: IRETURN }"];
+ doWhileMethodbb4 -> doWhileMethodbb18;
+ doWhileMethodbb18 -> "doWhileMethodbb-2";
+ }
+ subgraph doWhileTrue {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "doWhileTruebb-1" [label=e,
+ shape=circle,
+ xlabel=doWhileTrue];
+ doWhileTruebb0 [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: // label|5: // line number information|6: \
+GOTO 0}"];
+ "doWhileTruebb-1" -> doWhileTruebb0;
+ "doWhileTruebb-2" [label=e,
+ shape=circle,
+ xlabel=doWhileTrue];
+ doWhileTruebb0 -> doWhileTruebb0 [label=T];
+ }
+ subgraph emptyMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "emptyMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=emptyMethod];
+ emptyMethodbb0 [label="0|{0: // label|1: // line number information|2: RETURN }"];
+ "emptyMethodbb-1" -> emptyMethodbb0;
+ "emptyMethodbb-2" [label=x,
+ shape=circle];
+ emptyMethodbb0 -> "emptyMethodbb-2";
+ }
+ subgraph fieldReadMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "fieldReadMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=fieldReadMethod];
+ fieldReadMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: GETFIELD ExampleClass.field Ljava/lang/String;|4: ARETURN }"];
+ "fieldReadMethodbb-1" -> fieldReadMethodbb0;
+ "fieldReadMethodbb-2" [label=x,
+ shape=circle];
+ fieldReadMethodbb0 -> "fieldReadMethodbb-2";
+ }
+ subgraph fieldWriteMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "fieldWriteMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=fieldWriteMethod];
+ fieldWriteMethodbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: ALOAD 1|4: PUTFIELD ExampleClass.field Ljava/lang/String;|5: // label|\
+6: // line number information|7: RETURN }"];
+ "fieldWriteMethodbb-1" -> fieldWriteMethodbb0;
+ "fieldWriteMethodbb-2" [label=x,
+ shape=circle];
+ fieldWriteMethodbb0 -> "fieldWriteMethodbb-2";
+ }
+ subgraph forEachArrayMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "forEachArrayMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=forEachArrayMethod];
+ forEachArrayMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: \
+ASTORE 3|8: ALOAD 3|9: ARRAYLENGTH |10: ISTORE 4|11: ICONST_0 |12: ISTORE 5}"];
+ "forEachArrayMethodbb-1" -> forEachArrayMethodbb0;
+ "forEachArrayMethodbb-2" [label=x,
+ shape=circle];
+ forEachArrayMethodbb13 [label="13|{13: // label|14: // stack frame map|15: ILOAD 5|16: ILOAD 4|17: IF_ICMPGE 29}"];
+ forEachArrayMethodbb0 -> forEachArrayMethodbb13;
+ forEachArrayMethodbb18 [label="18|{18: ALOAD 3|19: ILOAD 5|20: AALOAD |21: ASTORE 6|22: // label|23: // line number information|24: IINC 2 1|25: // label|26: // \
+line number information|27: IINC 5 1|28: GOTO 13}"];
+ forEachArrayMethodbb13 -> forEachArrayMethodbb18;
+ forEachArrayMethodbb29 [label="29|{29: // label|30: // line number information|31: // stack frame map|32: ILOAD 2|33: IRETURN }"];
+ forEachArrayMethodbb13 -> forEachArrayMethodbb29 [label=T];
+ forEachArrayMethodbb18 -> forEachArrayMethodbb13 [label=T];
+ forEachArrayMethodbb29 -> "forEachArrayMethodbb-2";
+ }
+ subgraph forEachCollectionMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "forEachCollectionMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=forEachCollectionMethod];
+ forEachCollectionMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: \
+INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;|8: ASTORE 3}"];
+ "forEachCollectionMethodbb-1" -> forEachCollectionMethodbb0;
+ "forEachCollectionMethodbb-2" [label=x,
+ shape=circle];
+ forEachCollectionMethodbb9 [label="9|{9: // label|10: // stack frame map|11: ALOAD 3|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z|13: IFEQ 24}"];
+ forEachCollectionMethodbb0 -> forEachCollectionMethodbb9;
+ forEachCollectionMethodbb14 [label="14|{14: ALOAD 3|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;|16: CHECKCAST java/lang/String|17: ASTORE 4|18: // \
+label|19: // line number information|20: IINC 2 1|21: // label|22: // line number information|23: GOTO 9}"];
+ forEachCollectionMethodbb9 -> forEachCollectionMethodbb14;
+ forEachCollectionMethodbb24 [label="24|{24: // label|25: // line number information|26: // stack frame map|27: ILOAD 2|28: IRETURN }"];
+ forEachCollectionMethodbb9 -> forEachCollectionMethodbb24 [label=T];
+ forEachCollectionMethodbb14 -> forEachCollectionMethodbb9 [label=T];
+ forEachCollectionMethodbb24 -> "forEachCollectionMethodbb-2";
+ }
+ subgraph ifMethod {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "ifMethodbb-1" [label=e,
+ shape=circle,
+ xlabel=ifMethod];
+ ifMethodbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: \
+IFGE 12}"];
+ "ifMethodbb-1" -> ifMethodbb0;
+ "ifMethodbb-2" [label=x,
+ shape=circle];
+ ifMethodbb8 [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: ISTORE 2}"];
+ ifMethodbb0 -> ifMethodbb8;
+ ifMethodbb12 [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ILOAD 2|16: IRETURN }"];
+ ifMethodbb0 -> ifMethodbb12 [label=T];
+ ifMethodbb8 -> ifMethodbb12;
+ ifMethodbb12 -> "ifMethodbb-2";
+ }
+ subgraph init {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ "initbb-1" [label=e,
+ shape=circle,
+ xlabel=init];
+ initbb0 [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: INVOKESPECIAL java/lang/Object. ()V|4: RETURN }"];
+ "initbb-1" -> initbb0;
+ "initbb-2" [label=x,
+ shape=circle];
+ initbb0 -> "initbb-2";
+ }
+ subgraph forEver {
+ node [label="\N",
+ shape=record,
+ xlabel=""
+ ];
+ edge [label=""];
+ "forEverbb-1" [label=e,
+ shape=circle,
+ xlabel=forEver];
+ forEverbb0 [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"];
+ "forEverbb-1" -> forEverbb0;
+ "forEverbb-2" [label=e,
+ shape=circle,
+ xlabel=forEver];
+ forEverbb4 [label="4|{4: // label|5: // stack frame map|6: IINC 2 1|7: GOTO 4}"];
+ forEverbb0 -> forEverbb4;
+ forEverbb4 -> forEverbb4 [label=T];
+ }
+}
diff --git a/test-output/all.cfg.pdf b/test-output/all.cfg.pdf
new file mode 100644
index 0000000..c4bf8f7
Binary files /dev/null and b/test-output/all.cfg.pdf differ
diff --git a/test-output/all.combined.dot b/test-output/all.combined.dot
new file mode 100644
index 0000000..f4e5be2
--- /dev/null
+++ b/test-output/all.combined.dot
@@ -0,0 +1,1206 @@
+digraph root {
+ node [label="\N"];
+ subgraph combined {
+ graph [label=""];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ -1 [label="-1|entry",
+ shape=record,
+ style=filled];
+ 0 [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: INVOKESPECIAL java/lang/Object. ()V\l|4: RETURN \l}",
+ shape=record];
+ -1 -> 0;
+ -1 -> 0 [style=dotted];
+ -2 [label="-2|exit",
+ shape=record];
+ 0 -> -2;
+ 0 -> -2 [style=dotted];
+ }
+ subgraph combined_gv40 {
+ graph [label=switchMethod2];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv40" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv40" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ILOAD 1\l|7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26\l}",
+ shape=record];
+ "-1_gv40" -> "0_gv40";
+ "-1_gv40" -> "0_gv40" [style=dotted];
+ "-2_gv40" [label="-2|exit",
+ shape=record];
+ "8_gv8" [label="8|{8: // label\l|9: // line number information\l|10: // stack frame map\l|11: ICONST_0 \l|12: ISTORE 2\l|13: GOTO 31\l}",
+ shape=record];
+ "0_gv40" -> "8_gv8" [label=0];
+ "0_gv40" -> "8_gv8" [style=dotted];
+ "14_gv2" [label="14|{14: // label\l|15: // line number information\l|16: // stack frame map\l|17: ICONST_1 \l|18: ISTORE 2\l|19: GOTO 31\l}",
+ shape=record];
+ "0_gv40" -> "14_gv2" [label=1000];
+ "0_gv40" -> "14_gv2" [style=dotted];
+ "20_gv2" [label="20|{20: // label\l|21: // line number information\l|22: // stack frame map\l|23: ICONST_2 \l|24: ISTORE 2\l|25: GOTO 31\l}",
+ shape=record];
+ "0_gv40" -> "20_gv2" [label=2000];
+ "0_gv40" -> "20_gv2" [style=dotted];
+ "26_gv1" [label="26|{26: // label\l|27: // line number information\l|28: // stack frame map\l|29: ICONST_M1 \l|30: ISTORE 2\l}",
+ shape=record];
+ "0_gv40" -> "26_gv1" [label=default];
+ "0_gv40" -> "26_gv1" [style=dotted];
+ "31_gv1" [label="31|{31: // label\l|32: // line number information\l|33: // stack frame map\l|34: ILOAD 2\l|35: IRETURN \l}",
+ shape=record];
+ "0_gv40" -> "31_gv1" [style=dotted];
+ "8_gv8" -> "31_gv1" [label=T];
+ "14_gv2" -> "31_gv1" [label=T];
+ "20_gv2" -> "31_gv1" [label=T];
+ "26_gv1" -> "31_gv1";
+ "31_gv1" -> "-2_gv40";
+ "31_gv1" -> "-2_gv40" [style=dotted];
+ }
+ subgraph combined_gv41 {
+ graph [label=whileMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv41" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv41" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}",
+ shape=record];
+ "-1_gv41" -> "0_gv41";
+ "-1_gv41" -> "0_gv41" [style=dotted];
+ "-2_gv41" [label="-2|exit",
+ shape=record];
+ "4_gv2" [label="4|{4: // label\l|5: // line number information\l|6: // stack frame map\l|7: ILOAD 1\l|8: IFLE 19\l}",
+ shape=record];
+ "0_gv41" -> "4_gv2";
+ "0_gv41" -> "4_gv2" [style=dotted];
+ "9_gv1" [label="9|{9: // label\l|10: // line number information\l|11: ILOAD 2\l|12: ILOAD 1\l|13: IADD \l|14: ISTORE 2\l|15: // label\l|16: // \
+line number information\l|17: IINC 1 -1\l|18: GOTO 4\l}",
+ shape=record];
+ "4_gv2" -> "9_gv1";
+ "4_gv2" -> "9_gv1" [style=dotted];
+ 19 [label="19|{19: // label\l|20: // line number information\l|21: // stack frame map\l|22: ILOAD 2\l|23: IRETURN \l}",
+ shape=record];
+ "4_gv2" -> 19 [label=T];
+ "4_gv2" -> 19 [style=dotted];
+ "9_gv1" -> "4_gv2" [label=T];
+ 19 -> "-2_gv41";
+ 19 -> "-2_gv41" [style=dotted];
+ }
+ subgraph combined_gv42 {
+ graph [label=whileTrueMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv42" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv42" [label="0|{0: // label\l|1: // line number information\l|2: // stack frame map\l|3: IINC 1 1\l|4: GOTO 0\l}",
+ shape=record];
+ "-1_gv42" -> "0_gv42";
+ "-1_gv42" -> "0_gv42" [style=dotted];
+ "-2_gv42" [label="-2|exit",
+ shape=record];
+ "0_gv42" -> "0_gv42" [label=T];
+ }
+ subgraph combined_gv5 {
+ graph [label=allocAndInitObjectArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv5" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv5" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ANEWARRAY java/lang/Object\l|4: DUP \l|5: ICONST_0 \l|6: LDC \
+1\l|7: AASTORE \l|8: DUP \l|9: ICONST_1 \l|10: LDC 2\l|11: AASTORE \l|12: ARETURN \l}",
+ shape=record];
+ "-1_gv5" -> "0_gv5";
+ "-1_gv5" -> "0_gv5" [style=dotted];
+ "-2_gv5" [label="-2|exit",
+ shape=record];
+ "0_gv5" -> "-2_gv5";
+ "0_gv5" -> "-2_gv5" [style=dotted];
+ }
+ subgraph combined_gv6 {
+ graph [label=allocIncomplete2dArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv6" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv6" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ANEWARRAY [I\l|4: ARETURN \l}",
+ shape=record];
+ "-1_gv6" -> "0_gv6";
+ "-1_gv6" -> "0_gv6" [style=dotted];
+ "-2_gv6" [label="-2|exit",
+ shape=record];
+ "0_gv6" -> "-2_gv6";
+ "0_gv6" -> "-2_gv6" [style=dotted];
+ }
+ subgraph combined_gv7 {
+ graph [label=allocIntArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv7" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv7" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_3 \l|3: NEWARRAY T_INT\l|4: ARETURN \l}",
+ shape=record];
+ "-1_gv7" -> "0_gv7";
+ "-1_gv7" -> "0_gv7" [style=dotted];
+ "-2_gv7" [label="-2|exit",
+ shape=record];
+ "0_gv7" -> "-2_gv7";
+ "0_gv7" -> "-2_gv7" [style=dotted];
+ }
+ subgraph combined_gv8 {
+ graph [label=allocObjectArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv8" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv8" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_3 \l|3: ANEWARRAY java/lang/Object\l|4: ARETURN \l}",
+ shape=record];
+ "-1_gv8" -> "0_gv8";
+ "-1_gv8" -> "0_gv8" [style=dotted];
+ "-2_gv8" [label="-2|exit",
+ shape=record];
+ "0_gv8" -> "-2_gv8";
+ "0_gv8" -> "-2_gv8" [style=dotted];
+ }
+ subgraph combined_gv9 {
+ graph [label=allocObjectMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv9" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv9" [label="0|{0: // label\l|1: // line number information\l|2: NEW java/lang/Object\l|3: DUP \l|4: INVOKESPECIAL java/lang/Object. ()\
+V\l|5: ARETURN \l}",
+ shape=record];
+ "-1_gv9" -> "0_gv9";
+ "-1_gv9" -> "0_gv9" [style=dotted];
+ "-2_gv9" [label="-2|exit",
+ shape=record];
+ "0_gv9" -> "-2_gv9";
+ "0_gv9" -> "-2_gv9" [style=dotted];
+ }
+ subgraph combined_gv10 {
+ graph [label=arrayLengthMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv10" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv10" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ARRAYLENGTH \l|4: IRETURN \l}",
+ shape=record];
+ "-1_gv10" -> "0_gv10";
+ "-1_gv10" -> "0_gv10" [style=dotted];
+ "-2_gv10" [label="-2|exit",
+ shape=record];
+ "0_gv10" -> "-2_gv10";
+ "0_gv10" -> "-2_gv10" [style=dotted];
+ }
+ subgraph combined_gv11 {
+ graph [label=arrayReadMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv11" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv11" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ICONST_0 \l|4: AALOAD \l|5: ARETURN \l}",
+ shape=record];
+ "-1_gv11" -> "0_gv11";
+ "-1_gv11" -> "0_gv11" [style=dotted];
+ "-2_gv11" [label="-2|exit",
+ shape=record];
+ "0_gv11" -> "-2_gv11";
+ "0_gv11" -> "-2_gv11" [style=dotted];
+ }
+ subgraph combined_gv12 {
+ graph [label=arrayWriteMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv12" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv12" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ICONST_0 \l|4: ALOAD 2\l|5: AASTORE \l|6: // label\l|7: // \
+line number information\l|8: RETURN \l}",
+ shape=record];
+ "-1_gv12" -> "0_gv12";
+ "-1_gv12" -> "0_gv12" [style=dotted];
+ "-2_gv12" [label="-2|exit",
+ shape=record];
+ "0_gv12" -> "-2_gv12";
+ "0_gv12" -> "-2_gv12" [style=dotted];
+ }
+ subgraph combined_gv13 {
+ graph [label=condMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv13" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv13" [label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 7\l}",
+ shape=record];
+ "-1_gv13" -> "0_gv13";
+ "-1_gv13" -> "0_gv13" [style=dotted];
+ "-2_gv13" [label="-2|exit",
+ shape=record];
+ 5 [label="5|{5: ILOAD 1\l|6: GOTO 10\l}",
+ shape=record];
+ "0_gv13" -> 5;
+ "0_gv13" -> 5 [style=dotted];
+ 7 [label="7|{7: // label\l|8: // stack frame map\l|9: ILOAD 2\l}",
+ shape=record];
+ "0_gv13" -> 7 [label=T];
+ "0_gv13" -> 7 [style=dotted];
+ 10 [label="10|{10: // label\l|11: // stack frame map\l|12: IRETURN \l}",
+ shape=record];
+ "0_gv13" -> 10 [style=dotted];
+ 5 -> 10 [label=T];
+ 7 -> 10;
+ 10 -> "-2_gv13";
+ 10 -> "-2_gv13" [style=dotted];
+ }
+ subgraph combined_gv14 {
+ graph [label=doWhileMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv14" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv14" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}",
+ shape=record];
+ "-1_gv14" -> "0_gv14";
+ "-1_gv14" -> "0_gv14" [style=dotted];
+ "-2_gv14" [label="-2|exit",
+ shape=record];
+ 4 [label="4|{4: // label\l|5: // line number information\l|6: // stack frame map\l|7: ILOAD 2\l|8: ILOAD 1\l|9: IADD \l|10: ISTORE 2\l|\
+11: // label\l|12: // line number information\l|13: IINC 1 -1\l|14: // label\l|15: // line number information\l|16: ILOAD 1\l|\
+17: IFGT 4\l}",
+ shape=record];
+ "0_gv14" -> 4;
+ "0_gv14" -> 4 [style=dotted];
+ 4 -> 4 [label=T];
+ 18 [label="18|{18: // label\l|19: // line number information\l|20: ILOAD 2\l|21: IRETURN \l}",
+ shape=record];
+ 4 -> 18;
+ 4 -> 18 [style=dotted];
+ 18 -> "-2_gv14";
+ 18 -> "-2_gv14" [style=dotted];
+ }
+ subgraph combined_gv15 {
+ graph [label=doWhileTrue];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv15" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv15" [label="0|{0: // label\l|1: // line number information\l|2: // stack frame map\l|3: IINC 1 1\l|4: // label\l|5: // line number information\l|\
+6: GOTO 0\l}",
+ shape=record];
+ "-1_gv15" -> "0_gv15";
+ "-1_gv15" -> "0_gv15" [style=dotted];
+ "-2_gv15" [label="-2|exit",
+ shape=record];
+ "0_gv15" -> "0_gv15" [label=T];
+ }
+ subgraph combined_gv16 {
+ graph [label=emptyMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv16" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv16" [label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}",
+ shape=record];
+ "-1_gv16" -> "0_gv16";
+ "-1_gv16" -> "0_gv16" [style=dotted];
+ "-2_gv16" [label="-2|exit",
+ shape=record];
+ "0_gv16" -> "-2_gv16";
+ "0_gv16" -> "-2_gv16" [style=dotted];
+ }
+ subgraph combined_gv17 {
+ graph [label=fieldReadMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv17" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv17" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: GETFIELD ExampleClass.field Ljava/lang/String;\l|4: ARETURN \l}",
+ shape=record];
+ "-1_gv17" -> "0_gv17";
+ "-1_gv17" -> "0_gv17" [style=dotted];
+ "-2_gv17" [label="-2|exit",
+ shape=record];
+ "0_gv17" -> "-2_gv17";
+ "0_gv17" -> "-2_gv17" [style=dotted];
+ }
+ subgraph combined_gv18 {
+ graph [label=fieldWriteMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv18" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv18" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: ALOAD 1\l|4: PUTFIELD ExampleClass.field Ljava/lang/String;\l|\
+5: // label\l|6: // line number information\l|7: RETURN \l}",
+ shape=record];
+ "-1_gv18" -> "0_gv18";
+ "-1_gv18" -> "0_gv18" [style=dotted];
+ "-2_gv18" [label="-2|exit",
+ shape=record];
+ "0_gv18" -> "-2_gv18";
+ "0_gv18" -> "-2_gv18" [style=dotted];
+ }
+ subgraph combined_gv19 {
+ graph [label=forEachArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv19" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv19" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ALOAD 1\l|7: ASTORE 3\l|8: ALOAD 3\l|9: ARRAYLENGTH \l|10: ISTORE 4\l|11: ICONST_0 \l|12: ISTORE 5\l}",
+ shape=record];
+ "-1_gv19" -> "0_gv19";
+ "-1_gv19" -> "0_gv19" [style=dotted];
+ "-2_gv19" [label="-2|exit",
+ shape=record];
+ 13 [label="13|{13: // label\l|14: // stack frame map\l|15: ILOAD 5\l|16: ILOAD 4\l|17: IF_ICMPGE 29\l}",
+ shape=record];
+ "0_gv19" -> 13;
+ "0_gv19" -> 13 [style=dotted];
+ "18_gv1" [label="18|{18: ALOAD 3\l|19: ILOAD 5\l|20: AALOAD \l|21: ASTORE 6\l|22: // label\l|23: // line number information\l|24: IINC 2 1\l|25: // \
+label\l|26: // line number information\l|27: IINC 5 1\l|28: GOTO 13\l}",
+ shape=record];
+ 13 -> "18_gv1";
+ 13 -> "18_gv1" [style=dotted];
+ 29 [label="29|{29: // label\l|30: // line number information\l|31: // stack frame map\l|32: ILOAD 2\l|33: IRETURN \l}",
+ shape=record];
+ 13 -> 29 [label=T];
+ 13 -> 29 [style=dotted];
+ "18_gv1" -> 13 [label=T];
+ 29 -> "-2_gv19";
+ 29 -> "-2_gv19" [style=dotted];
+ }
+ subgraph combined_gv20 {
+ graph [label=forEachCollectionMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv20" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv20" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ALOAD 1\l|7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;\l|8: ASTORE 3\l}",
+ shape=record];
+ "-1_gv20" -> "0_gv20";
+ "-1_gv20" -> "0_gv20" [style=dotted];
+ "-2_gv20" [label="-2|exit",
+ shape=record];
+ 9 [label="9|{9: // label\l|10: // stack frame map\l|11: ALOAD 3\l|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z\l|13: IFEQ 24\l}",
+ shape=record];
+ "0_gv20" -> 9;
+ "0_gv20" -> 9 [style=dotted];
+ 14 [label="14|{14: ALOAD 3\l|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;\l|16: CHECKCAST java/lang/String\l|17: ASTORE \
+4\l|18: // label\l|19: // line number information\l|20: IINC 2 1\l|21: // label\l|22: // line number information\l|23: GOTO \
+9\l}",
+ shape=record];
+ 9 -> 14;
+ 9 -> 14 [style=dotted];
+ 24 [label="24|{24: // label\l|25: // line number information\l|26: // stack frame map\l|27: ILOAD 2\l|28: IRETURN \l}",
+ shape=record];
+ 9 -> 24 [label=T];
+ 9 -> 24 [style=dotted];
+ 14 -> 9 [label=T];
+ 24 -> "-2_gv20";
+ 24 -> "-2_gv20" [style=dotted];
+ }
+ subgraph combined_gv21 {
+ graph [label=forEver];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv21" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv21" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}",
+ shape=record];
+ "-1_gv21" -> "0_gv21";
+ "-1_gv21" -> "0_gv21" [style=dotted];
+ "-2_gv21" [label="-2|exit",
+ shape=record];
+ "4_gv1" [label="4|{4: // label\l|5: // stack frame map\l|6: IINC 2 1\l|7: GOTO 4\l}",
+ shape=record];
+ "0_gv21" -> "4_gv1";
+ "0_gv21" -> "4_gv1" [style=dotted];
+ "4_gv1" -> "4_gv1" [label=T];
+ }
+ subgraph combined_gv22 {
+ graph [label=forMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv22" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv22" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ICONST_0 \l|7: ISTORE 3\l}",
+ shape=record];
+ "-1_gv22" -> "0_gv22";
+ "-1_gv22" -> "0_gv22" [style=dotted];
+ "-2_gv22" [label="-2|exit",
+ shape=record];
+ 8 [label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 23\l}",
+ shape=record];
+ "0_gv22" -> 8;
+ "0_gv22" -> 8 [style=dotted];
+ "13_gv1" [label="13|{13: // label\l|14: // line number information\l|15: ILOAD 2\l|16: ILOAD 3\l|17: IADD \l|18: ISTORE 2\l|19: // label\l|20: // \
+line number information\l|21: IINC 1 1\l|22: GOTO 8\l}",
+ shape=record];
+ 8 -> "13_gv1";
+ 8 -> "13_gv1" [style=dotted];
+ 23 [label="23|{23: // label\l|24: // line number information\l|25: // stack frame map\l|26: ILOAD 2\l|27: IRETURN \l}",
+ shape=record];
+ 8 -> 23 [label=T];
+ 8 -> 23 [style=dotted];
+ "13_gv1" -> 8 [label=T];
+ 23 -> "-2_gv22";
+ 23 -> "-2_gv22" [style=dotted];
+ }
+ subgraph combined_gv23 {
+ graph [label=forWithBreakMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv23" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv23" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ICONST_0 \l|7: ISTORE 3\l}",
+ shape=record];
+ "-1_gv23" -> "0_gv23";
+ "-1_gv23" -> "0_gv23" [style=dotted];
+ "-2_gv23" [label="-2|exit",
+ shape=record];
+ "8_gv1" [label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 32\l}",
+ shape=record];
+ "0_gv23" -> "8_gv1";
+ "0_gv23" -> "8_gv1" [style=dotted];
+ "13_gv2" [label="13|{13: // label\l|14: // line number information\l|15: ILOAD 3\l|16: BIPUSH 10\l|17: IF_ICMPNE 21\l}",
+ shape=record];
+ "8_gv1" -> "13_gv2";
+ "8_gv1" -> "13_gv2" [style=dotted];
+ 32 [label="32|{32: // label\l|33: // line number information\l|34: // stack frame map\l|35: ILOAD 2\l|36: IRETURN \l}",
+ shape=record];
+ "8_gv1" -> 32 [label=T];
+ "8_gv1" -> 32 [style=dotted];
+ "18_gv2" [label="18|{18: // label\l|19: // line number information\l|20: GOTO 32\l}",
+ shape=record];
+ "13_gv2" -> "18_gv2";
+ "13_gv2" -> "18_gv2" [style=dotted];
+ 21 [label="21|{21: // label\l|22: // line number information\l|23: // stack frame map\l|24: ILOAD 2\l|25: ILOAD 3\l|26: IADD \l|27: ISTORE \
+2\l|28: // label\l|29: // line number information\l|30: IINC 3 1\l|31: GOTO 8\l}",
+ shape=record];
+ "13_gv2" -> 21 [label=T];
+ "13_gv2" -> 21 [style=dotted];
+ "18_gv2" -> 32 [label=T];
+ 21 -> "8_gv1" [label=T];
+ 32 -> "-2_gv23";
+ 32 -> "-2_gv23" [style=dotted];
+ }
+ subgraph combined_gv24 {
+ graph [label=forWithContinueMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv24" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv24" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ICONST_0 \l|7: ISTORE 3\l}",
+ shape=record];
+ "-1_gv24" -> "0_gv24";
+ "-1_gv24" -> "0_gv24" [style=dotted];
+ "-2_gv24" [label="-2|exit",
+ shape=record];
+ "8_gv2" [label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 33\l}",
+ shape=record];
+ "0_gv24" -> "8_gv2";
+ "0_gv24" -> "8_gv2" [style=dotted];
+ "13_gv3" [label="13|{13: // label\l|14: // line number information\l|15: ILOAD 3\l|16: BIPUSH 10\l|17: IF_ICMPNE 21\l}",
+ shape=record];
+ "8_gv2" -> "13_gv3";
+ "8_gv2" -> "13_gv3" [style=dotted];
+ 33 [label="33|{33: // label\l|34: // line number information\l|35: // stack frame map\l|36: ILOAD 2\l|37: IRETURN \l}",
+ shape=record];
+ "8_gv2" -> 33 [label=T];
+ "8_gv2" -> 33 [style=dotted];
+ "18_gv3" [label="18|{18: // label\l|19: // line number information\l|20: GOTO 28\l}",
+ shape=record];
+ "13_gv3" -> "18_gv3";
+ "13_gv3" -> "18_gv3" [style=dotted];
+ "21_gv1" [label="21|{21: // label\l|22: // line number information\l|23: // stack frame map\l|24: ILOAD 2\l|25: ILOAD 3\l|26: IADD \l|27: ISTORE \
+2\l}",
+ shape=record];
+ "13_gv3" -> "21_gv1" [label=T];
+ "13_gv3" -> "21_gv1" [style=dotted];
+ 28 [label="28|{28: // label\l|29: // line number information\l|30: // stack frame map\l|31: IINC 3 1\l|32: GOTO 8\l}",
+ shape=record];
+ "13_gv3" -> 28 [style=dotted];
+ "18_gv3" -> 28 [label=T];
+ "21_gv1" -> 28;
+ 28 -> "8_gv2" [label=T];
+ 33 -> "-2_gv24";
+ 33 -> "-2_gv24" [style=dotted];
+ }
+ subgraph combined_gv25 {
+ graph [label=ifElseMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv25" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv25" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ILOAD 1\l|7: IFLE 13\l}",
+ shape=record];
+ "-1_gv25" -> "0_gv25";
+ "-1_gv25" -> "0_gv25" [style=dotted];
+ "-2_gv25" [label="-2|exit",
+ shape=record];
+ "8_gv3" [label="8|{8: // label\l|9: // line number information\l|10: ICONST_0 \l|11: ISTORE 2\l|12: GOTO 18\l}",
+ shape=record];
+ "0_gv25" -> "8_gv3";
+ "0_gv25" -> "8_gv3" [style=dotted];
+ "13_gv4" [label="13|{13: // label\l|14: // line number information\l|15: // stack frame map\l|16: ILOAD 1\l|17: ISTORE 2\l}",
+ shape=record];
+ "0_gv25" -> "13_gv4" [label=T];
+ "0_gv25" -> "13_gv4" [style=dotted];
+ "18_gv4" [label="18|{18: // label\l|19: // line number information\l|20: // stack frame map\l|21: ILOAD 2\l|22: IRETURN \l}",
+ shape=record];
+ "0_gv25" -> "18_gv4" [style=dotted];
+ "8_gv3" -> "18_gv4" [label=T];
+ "13_gv4" -> "18_gv4";
+ "18_gv4" -> "-2_gv25";
+ "18_gv4" -> "-2_gv25" [style=dotted];
+ }
+ subgraph combined_gv26 {
+ graph [label=ifMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv26" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv26" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ILOAD 1\l|7: IFGE 12\l}",
+ shape=record];
+ "-1_gv26" -> "0_gv26";
+ "-1_gv26" -> "0_gv26" [style=dotted];
+ "-2_gv26" [label="-2|exit",
+ shape=record];
+ "8_gv4" [label="8|{8: // label\l|9: // line number information\l|10: ICONST_1 \l|11: ISTORE 2\l}",
+ shape=record];
+ "0_gv26" -> "8_gv4";
+ "0_gv26" -> "8_gv4" [style=dotted];
+ 12 [label="12|{12: // label\l|13: // line number information\l|14: // stack frame map\l|15: ILOAD 2\l|16: IRETURN \l}",
+ shape=record];
+ "0_gv26" -> 12 [label=T];
+ "0_gv26" -> 12 [style=dotted];
+ "8_gv4" -> 12;
+ 12 -> "-2_gv26";
+ 12 -> "-2_gv26" [style=dotted];
+ }
+ subgraph combined_gv27 {
+ graph [label=instanceCallMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv27" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv27" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V\l|4: // label\l|\
+5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}",
+ shape=record];
+ "-1_gv27" -> "0_gv27";
+ "-1_gv27" -> "0_gv27" [style=dotted];
+ "-2_gv27" [label="-2|exit",
+ shape=record];
+ "0_gv27" -> "-2_gv27";
+ "0_gv27" -> "-2_gv27" [style=dotted];
+ }
+ subgraph combined_gv28 {
+ graph [label=instanceCallTarget];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv28" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv28" [label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}",
+ shape=record];
+ "-1_gv28" -> "0_gv28";
+ "-1_gv28" -> "0_gv28" [style=dotted];
+ "-2_gv28" [label="-2|exit",
+ shape=record];
+ "0_gv28" -> "-2_gv28";
+ "0_gv28" -> "-2_gv28" [style=dotted];
+ }
+ subgraph combined_gv29 {
+ graph [label=interfaceCallMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv29" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv29" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()\
+V\l|4: // label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}",
+ shape=record];
+ "-1_gv29" -> "0_gv29";
+ "-1_gv29" -> "0_gv29" [style=dotted];
+ "-2_gv29" [label="-2|exit",
+ shape=record];
+ "0_gv29" -> "-2_gv29";
+ "0_gv29" -> "-2_gv29" [style=dotted];
+ }
+ subgraph combined_gv30 {
+ graph [label=nestedFor];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv30" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv30" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ICONST_0 \l|7: ISTORE 3\l}",
+ shape=record];
+ "-1_gv30" -> "0_gv30";
+ "-1_gv30" -> "0_gv30" [style=dotted];
+ "-2_gv30" [label="-2|exit",
+ shape=record];
+ "8_gv5" [label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 37\l}",
+ shape=record];
+ "0_gv30" -> "8_gv5";
+ "0_gv30" -> "8_gv5" [style=dotted];
+ "13_gv5" [label="13|{13: // label\l|14: // line number information\l|15: ICONST_0 \l|16: ISTORE 4\l}",
+ shape=record];
+ "8_gv5" -> "13_gv5";
+ "8_gv5" -> "13_gv5" [style=dotted];
+ 37 [label="37|{37: // label\l|38: // line number information\l|39: // stack frame map\l|40: ILOAD 2\l|41: IRETURN \l}",
+ shape=record];
+ "8_gv5" -> 37 [label=T];
+ "8_gv5" -> 37 [style=dotted];
+ 17 [label="17|{17: // label\l|18: // stack frame map\l|19: ILOAD 4\l|20: ILOAD 3\l|21: IF_ICMPGE 32\l}",
+ shape=record];
+ "13_gv5" -> 17;
+ "13_gv5" -> 17 [style=dotted];
+ 22 [label="22|{22: // label\l|23: // line number information\l|24: ILOAD 2\l|25: ILOAD 4\l|26: IADD \l|27: ISTORE 2\l|28: // label\l|29: // \
+line number information\l|30: IINC 4 1\l|31: GOTO 17\l}",
+ shape=record];
+ 17 -> 22;
+ 17 -> 22 [style=dotted];
+ "32_gv1" [label="32|{32: // label\l|33: // line number information\l|34: // stack frame map\l|35: IINC 3 1\l|36: GOTO 8\l}",
+ shape=record];
+ 17 -> "32_gv1" [label=T];
+ 17 -> "32_gv1" [style=dotted];
+ 22 -> 17 [label=T];
+ "32_gv1" -> "8_gv5" [label=T];
+ 37 -> "-2_gv30";
+ 37 -> "-2_gv30" [style=dotted];
+ }
+ subgraph combined_gv31 {
+ graph [label=nonShortCircuitMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv31" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv31" [label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 7\l}",
+ shape=record];
+ "-1_gv31" -> "0_gv31";
+ "-1_gv31" -> "0_gv31" [style=dotted];
+ "-2_gv31" [label="-2|exit",
+ shape=record];
+ "5_gv1" [label="5|{5: ICONST_1 \l|6: GOTO 10\l}",
+ shape=record];
+ "0_gv31" -> "5_gv1";
+ "0_gv31" -> "5_gv1" [style=dotted];
+ "7_gv1" [label="7|{7: // label\l|8: // stack frame map\l|9: ICONST_0 \l}",
+ shape=record];
+ "0_gv31" -> "7_gv1" [label=T];
+ "0_gv31" -> "7_gv1" [style=dotted];
+ "10_gv1" [label="10|{10: // label\l|11: // stack frame map\l|12: ILOAD 1\l|13: ILOAD 3\l|14: IF_ICMPGE 17\l}",
+ shape=record];
+ "0_gv31" -> "10_gv1" [style=dotted];
+ "5_gv1" -> "10_gv1" [label=T];
+ "7_gv1" -> "10_gv1";
+ 15 [label="15|{15: ICONST_1 \l|16: GOTO 20\l}",
+ shape=record];
+ "10_gv1" -> 15;
+ "10_gv1" -> 15 [style=dotted];
+ "17_gv1" [label="17|{17: // label\l|18: // stack frame map\l|19: ICONST_0 \l}",
+ shape=record];
+ "10_gv1" -> "17_gv1" [label=T];
+ "10_gv1" -> "17_gv1" [style=dotted];
+ 20 [label="20|{20: // label\l|21: // stack frame map\l|22: IAND \l|23: IFEQ 28\l}",
+ shape=record];
+ "10_gv1" -> 20 [style=dotted];
+ 15 -> 20 [label=T];
+ "17_gv1" -> 20;
+ 20 -> "-2_gv31" [style=dotted];
+ "24_gv1" [label="24|{24: // label\l|25: // line number information\l|26: ICONST_1 \l|27: IRETURN \l}",
+ shape=record];
+ 20 -> "24_gv1";
+ 20 -> "24_gv1" [style=dotted];
+ "28_gv1" [label="28|{28: // label\l|29: // line number information\l|30: // stack frame map\l|31: ICONST_0 \l|32: IRETURN \l}",
+ shape=record];
+ 20 -> "28_gv1" [label=T];
+ 20 -> "28_gv1" [style=dotted];
+ "24_gv1" -> "-2_gv31";
+ "24_gv1" -> "28_gv1";
+ "28_gv1" -> "-2_gv31";
+ }
+ subgraph combined_gv32 {
+ graph [label=privateInstanceCallMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv32" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv32" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V\l|4: // \
+label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}",
+ shape=record];
+ "-1_gv32" -> "0_gv32";
+ "-1_gv32" -> "0_gv32" [style=dotted];
+ "-2_gv32" [label="-2|exit",
+ shape=record];
+ "0_gv32" -> "-2_gv32";
+ "0_gv32" -> "-2_gv32" [style=dotted];
+ }
+ subgraph combined_gv33 {
+ graph [label=privateInstanceCallTarget];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv33" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv33" [label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}",
+ shape=record];
+ "-1_gv33" -> "0_gv33";
+ "-1_gv33" -> "0_gv33" [style=dotted];
+ "-2_gv33" [label="-2|exit",
+ shape=record];
+ "0_gv33" -> "-2_gv33";
+ "0_gv33" -> "-2_gv33" [style=dotted];
+ }
+ subgraph combined_gv34 {
+ graph [label=shortCircuitMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv34" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv34" [label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 12\l}",
+ shape=record];
+ "-1_gv34" -> "0_gv34";
+ "-1_gv34" -> "0_gv34" [style=dotted];
+ "-2_gv34" [label="-2|exit",
+ shape=record];
+ "0_gv34" -> "-2_gv34" [style=dotted];
+ "5_gv2" [label="5|{5: ILOAD 1\l|6: ILOAD 3\l|7: IF_ICMPGE 12\l}",
+ shape=record];
+ "0_gv34" -> "5_gv2";
+ "0_gv34" -> "5_gv2" [style=dotted];
+ "12_gv1" [label="12|{12: // label\l|13: // line number information\l|14: // stack frame map\l|15: ICONST_0 \l|16: IRETURN \l}",
+ shape=record];
+ "0_gv34" -> "12_gv1" [label=T];
+ "0_gv34" -> "12_gv1" [style=dotted];
+ "8_gv6" [label="8|{8: // label\l|9: // line number information\l|10: ICONST_1 \l|11: IRETURN \l}",
+ shape=record];
+ "5_gv2" -> "8_gv6";
+ "5_gv2" -> "8_gv6" [style=dotted];
+ "5_gv2" -> "12_gv1" [label=T];
+ "8_gv6" -> "-2_gv34";
+ "8_gv6" -> "12_gv1";
+ "12_gv1" -> "-2_gv34";
+ }
+ subgraph combined_gv35 {
+ graph [label=staticCallMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv35" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv35" [label="0|{0: // label\l|1: // line number information\l|2: INVOKESTATIC ExampleClass.staticCallTarget ()V\l|3: // label\l|4: // line \
+number information\l|5: ICONST_2 \l|6: IRETURN \l}",
+ shape=record];
+ "-1_gv35" -> "0_gv35";
+ "-1_gv35" -> "0_gv35" [style=dotted];
+ "-2_gv35" [label="-2|exit",
+ shape=record];
+ "0_gv35" -> "-2_gv35";
+ "0_gv35" -> "-2_gv35" [style=dotted];
+ }
+ subgraph combined_gv36 {
+ graph [label=staticCallTarget];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv36" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv36" [label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}",
+ shape=record];
+ "-1_gv36" -> "0_gv36";
+ "-1_gv36" -> "0_gv36" [style=dotted];
+ "-2_gv36" [label="-2|exit",
+ shape=record];
+ "0_gv36" -> "-2_gv36";
+ "0_gv36" -> "-2_gv36" [style=dotted];
+ }
+ subgraph combined_gv37 {
+ graph [label=staticFieldReadMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv37" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv37" [label="0|{0: // label\l|1: // line number information\l|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;\l|3: ARETURN \l}",
+ shape=record];
+ "-1_gv37" -> "0_gv37";
+ "-1_gv37" -> "0_gv37" [style=dotted];
+ "-2_gv37" [label="-2|exit",
+ shape=record];
+ "0_gv37" -> "-2_gv37";
+ "0_gv37" -> "-2_gv37" [style=dotted];
+ }
+ subgraph combined_gv38 {
+ graph [label=staticFieldWriteMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv38" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv38" [label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;\l|4: // \
+label\l|5: // line number information\l|6: RETURN \l}",
+ shape=record];
+ "-1_gv38" -> "0_gv38";
+ "-1_gv38" -> "0_gv38" [style=dotted];
+ "-2_gv38" [label="-2|exit",
+ shape=record];
+ "0_gv38" -> "-2_gv38";
+ "0_gv38" -> "-2_gv38" [style=dotted];
+ }
+ subgraph combined_gv39 {
+ graph [label=switchMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv39" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv39" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|\
+6: ILOAD 1\l|7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26\l}",
+ shape=record];
+ "-1_gv39" -> "0_gv39";
+ "-1_gv39" -> "0_gv39" [style=dotted];
+ "-2_gv39" [label="-2|exit",
+ shape=record];
+ "8_gv7" [label="8|{8: // label\l|9: // line number information\l|10: // stack frame map\l|11: ICONST_0 \l|12: ISTORE 2\l|13: GOTO 31\l}",
+ shape=record];
+ "0_gv39" -> "8_gv7" [label=0];
+ "0_gv39" -> "8_gv7" [style=dotted];
+ "14_gv1" [label="14|{14: // label\l|15: // line number information\l|16: // stack frame map\l|17: ICONST_1 \l|18: ISTORE 2\l|19: GOTO 31\l}",
+ shape=record];
+ "0_gv39" -> "14_gv1" [label=1];
+ "0_gv39" -> "14_gv1" [style=dotted];
+ "20_gv1" [label="20|{20: // label\l|21: // line number information\l|22: // stack frame map\l|23: ICONST_2 \l|24: ISTORE 2\l|25: GOTO 31\l}",
+ shape=record];
+ "0_gv39" -> "20_gv1" [label=2];
+ "0_gv39" -> "20_gv1" [style=dotted];
+ 26 [label="26|{26: // label\l|27: // line number information\l|28: // stack frame map\l|29: ICONST_M1 \l|30: ISTORE 2\l}",
+ shape=record];
+ "0_gv39" -> 26 [label=default];
+ "0_gv39" -> 26 [style=dotted];
+ 31 [label="31|{31: // label\l|32: // line number information\l|33: // stack frame map\l|34: ILOAD 2\l|35: IRETURN \l}",
+ shape=record];
+ "0_gv39" -> 31 [style=dotted];
+ "8_gv7" -> 31 [label=T];
+ "14_gv1" -> 31 [label=T];
+ "20_gv1" -> 31 [label=T];
+ 26 -> 31;
+ 31 -> "-2_gv39";
+ 31 -> "-2_gv39" [style=dotted];
+ }
+ subgraph combined_gv1 {
+ graph [label=alloc2Of3dArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv1" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv1" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ICONST_3 \l|4: MULTIANEWARRAY [[[I 2\l|5: ARETURN \l}",
+ shape=record];
+ "-1_gv1" -> "0_gv1";
+ "-1_gv1" -> "0_gv1" [style=dotted];
+ "-2_gv1" [label="-2|exit",
+ shape=record];
+ "0_gv1" -> "-2_gv1";
+ "0_gv1" -> "-2_gv1" [style=dotted];
+ }
+ subgraph combined_gv2 {
+ graph [label=alloc2dArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv2" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv2" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ICONST_3 \l|4: MULTIANEWARRAY [[I 2\l|5: ARETURN \l}",
+ shape=record];
+ "-1_gv2" -> "0_gv2";
+ "-1_gv2" -> "0_gv2" [style=dotted];
+ "-2_gv2" [label="-2|exit",
+ shape=record];
+ "0_gv2" -> "-2_gv2";
+ "0_gv2" -> "-2_gv2" [style=dotted];
+ }
+ subgraph combined_gv3 {
+ graph [label=allocAndInit2dArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv3" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv3" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_1 \l|3: ANEWARRAY [I\l|4: DUP \l|5: ICONST_0 \l|6: ICONST_1 \l|7: NEWARRAY \
+T_INT\l|8: DUP \l|9: ICONST_0 \l|10: ICONST_1 \l|11: IASTORE \l|12: AASTORE \l|13: ARETURN \l}",
+ shape=record];
+ "-1_gv3" -> "0_gv3";
+ "-1_gv3" -> "0_gv3" [style=dotted];
+ "-2_gv3" [label="-2|exit",
+ shape=record];
+ "0_gv3" -> "-2_gv3";
+ "0_gv3" -> "-2_gv3" [style=dotted];
+ }
+ subgraph combined_gv4 {
+ graph [label=allocAndInitIntArrayMethod];
+ node [label="\N",
+ shape="",
+ style=""
+ ];
+ edge [label="",
+ style=""
+ ];
+ "-1_gv4" [label="-1|entry",
+ shape=record,
+ style=filled];
+ "0_gv4" [label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: NEWARRAY T_INT\l|4: DUP \l|5: ICONST_0 \l|6: ICONST_1 \l|7: \
+IASTORE \l|8: DUP \l|9: ICONST_1 \l|10: ICONST_2 \l|11: IASTORE \l|12: ARETURN \l}",
+ shape=record];
+ "-1_gv4" -> "0_gv4";
+ "-1_gv4" -> "0_gv4" [style=dotted];
+ "-2_gv4" [label="-2|exit",
+ shape=record];
+ "0_gv4" -> "-2_gv4";
+ "0_gv4" -> "-2_gv4" [style=dotted];
+ }
+}
diff --git a/test-output/all.combined.pdf b/test-output/all.combined.pdf
new file mode 100644
index 0000000..c106b8a
Binary files /dev/null and b/test-output/all.combined.pdf differ
diff --git a/test-output/all.dt.dot b/test-output/all.dt.dot
new file mode 100644
index 0000000..a4f0ee1
--- /dev/null
+++ b/test-output/all.dt.dot
@@ -0,0 +1,448 @@
+digraph root {
+ node [label="\N"];
+ subgraph dominatorTree_gv5 {
+ graph [label=allocAndInitObjectArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv5" [style=filled];
+ "D(-1)_gv5" -> "D(0)_gv5";
+ "D(0)_gv5" -> "D(-2)_gv5";
+ }
+ subgraph dominatorTree_gv6 {
+ graph [label=allocIncomplete2dArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv6" [style=filled];
+ "D(-1)_gv6" -> "D(0)_gv6";
+ "D(0)_gv6" -> "D(-2)_gv6";
+ }
+ subgraph dominatorTree_gv7 {
+ graph [label=allocIntArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv7" [style=filled];
+ "D(-1)_gv7" -> "D(0)_gv7";
+ "D(0)_gv7" -> "D(-2)_gv7";
+ }
+ subgraph dominatorTree_gv8 {
+ graph [label=allocObjectArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv8" [style=filled];
+ "D(-1)_gv8" -> "D(0)_gv8";
+ "D(0)_gv8" -> "D(-2)_gv8";
+ }
+ subgraph dominatorTree_gv9 {
+ graph [label=allocObjectMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv9" [style=filled];
+ "D(-1)_gv9" -> "D(0)_gv9";
+ "D(0)_gv9" -> "D(-2)_gv9";
+ }
+ subgraph dominatorTree_gv10 {
+ graph [label=arrayLengthMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv10" [style=filled];
+ "D(-1)_gv10" -> "D(0)_gv10";
+ "D(0)_gv10" -> "D(-2)_gv10";
+ }
+ subgraph dominatorTree_gv11 {
+ graph [label=arrayReadMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv11" [style=filled];
+ "D(-1)_gv11" -> "D(0)_gv11";
+ "D(0)_gv11" -> "D(-2)_gv11";
+ }
+ subgraph dominatorTree_gv12 {
+ graph [label=arrayWriteMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv12" [style=filled];
+ "D(-1)_gv12" -> "D(0)_gv12";
+ "D(0)_gv12" -> "D(-2)_gv12";
+ }
+ subgraph dominatorTree_gv13 {
+ graph [label=condMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv13" [style=filled];
+ "D(-1)_gv13" -> "D(0)_gv13";
+ "D(0)_gv13" -> "D(7)";
+ "D(0)_gv13" -> "D(10)";
+ "D(0)_gv13" -> "D(5)";
+ "D(10)" -> "D(-2)_gv13";
+ }
+ subgraph dominatorTree_gv14 {
+ graph [label=doWhileMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv14" [style=filled];
+ "D(-1)_gv14" -> "D(0)_gv14";
+ "D(0)_gv14" -> "D(4)";
+ "D(18)" -> "D(-2)_gv14";
+ "D(4)" -> "D(18)";
+ }
+ subgraph dominatorTree_gv15 {
+ graph [label=doWhileTrue];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv15" [style=filled];
+ "D(-1)_gv15" -> "D(0)_gv15";
+ }
+ subgraph dominatorTree_gv16 {
+ graph [label=emptyMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv16" [style=filled];
+ "D(-1)_gv16" -> "D(0)_gv16";
+ "D(0)_gv16" -> "D(-2)_gv15";
+ }
+ subgraph dominatorTree_gv17 {
+ graph [label=fieldReadMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv17" [style=filled];
+ "D(-1)_gv17" -> "D(0)_gv17";
+ "D(0)_gv17" -> "D(-2)_gv16";
+ }
+ subgraph dominatorTree_gv18 {
+ graph [label=fieldWriteMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv18" [style=filled];
+ "D(-1)_gv18" -> "D(0)_gv18";
+ "D(0)_gv18" -> "D(-2)_gv17";
+ }
+ subgraph dominatorTree_gv19 {
+ graph [label=forEachArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv19" [style=filled];
+ "D(-1)_gv19" -> "D(0)_gv19";
+ "D(13)" -> "D(29)";
+ "D(13)" -> "D(18)_gv1";
+ "D(29)" -> "D(-2)_gv18";
+ "D(0)_gv19" -> "D(13)";
+ }
+ subgraph dominatorTree_gv20 {
+ graph [label=forEachCollectionMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv20" [style=filled];
+ "D(-1)_gv20" -> "D(0)_gv20";
+ "D(9)" -> "D(14)";
+ "D(9)" -> "D(24)";
+ "D(0)_gv20" -> "D(9)";
+ "D(24)" -> "D(-2)_gv19";
+ }
+ subgraph dominatorTree_gv21 {
+ graph [label=forEver];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv21" [style=filled];
+ "D(-1)_gv21" -> "D(0)_gv21";
+ "D(0)_gv21" -> "D(4)_gv1";
+ }
+ subgraph dominatorTree_gv22 {
+ graph [label=forMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv22" [style=filled];
+ "D(-1)_gv22" -> "D(0)_gv22";
+ "D(0)_gv22" -> "D(8)";
+ "D(8)" -> "D(23)";
+ "D(8)" -> "D(13)_gv1";
+ "D(23)" -> "D(-2)_gv20";
+ }
+ subgraph dominatorTree_gv23 {
+ graph [label=forWithBreakMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv23" [style=filled];
+ "D(-1)_gv23" -> "D(0)_gv23";
+ "D(0)_gv23" -> "D(8)_gv1";
+ "D(32)" -> "D(-2)_gv21";
+ "D(13)_gv2" -> "D(21)";
+ "D(13)_gv2" -> "D(18)_gv2";
+ "D(8)_gv1" -> "D(32)";
+ "D(8)_gv1" -> "D(13)_gv2";
+ }
+ subgraph dominatorTree_gv24 {
+ graph [label=forWithContinueMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv24" [style=filled];
+ "D(-1)_gv24" -> "D(0)_gv24";
+ "D(33)" -> "D(-2)_gv22";
+ "D(8)_gv2" -> "D(33)";
+ "D(8)_gv2" -> "D(13)_gv3";
+ "D(13)_gv3" -> "D(21)_gv1";
+ "D(13)_gv3" -> "D(18)_gv3";
+ "D(13)_gv3" -> "D(28)";
+ "D(0)_gv24" -> "D(8)_gv2";
+ }
+ subgraph dominatorTree_gv25 {
+ graph [label=ifElseMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv25" [style=filled];
+ "D(-1)_gv25" -> "D(0)_gv25";
+ "D(0)_gv25" -> "D(13)_gv4";
+ "D(0)_gv25" -> "D(18)_gv4";
+ "D(0)_gv25" -> "D(8)_gv3";
+ "D(18)_gv4" -> "D(-2)_gv23";
+ }
+ subgraph dominatorTree_gv26 {
+ graph [label=ifMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv26" [style=filled];
+ "D(-1)_gv26" -> "D(0)_gv26";
+ "D(0)_gv26" -> "D(8)_gv4";
+ "D(0)_gv26" -> "D(12)";
+ "D(12)" -> "D(-2)_gv24";
+ }
+ subgraph dominatorTree_gv27 {
+ graph [label=instanceCallMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv27" [style=filled];
+ "D(-1)_gv27" -> "D(0)_gv27";
+ "D(0)_gv27" -> "D(-2)_gv25";
+ }
+ subgraph dominatorTree_gv28 {
+ graph [label=instanceCallTarget];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv28" [style=filled];
+ "D(-1)_gv28" -> "D(0)_gv28";
+ "D(0)_gv28" -> "D(-2)_gv26";
+ }
+ subgraph dominatorTree_gv29 {
+ graph [label=interfaceCallMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv29" [style=filled];
+ "D(-1)_gv29" -> "D(0)_gv29";
+ "D(0)_gv29" -> "D(-2)_gv27";
+ }
+ subgraph dominatorTree_gv30 {
+ graph [label=nestedFor];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv30" [style=filled];
+ "D(-1)_gv30" -> "D(0)_gv30";
+ "D(17)" -> "D(32)_gv1";
+ "D(17)" -> "D(22)";
+ "D(0)_gv30" -> "D(8)_gv5";
+ "D(8)_gv5" -> "D(13)_gv5";
+ "D(8)_gv5" -> "D(37)";
+ "D(13)_gv5" -> "D(17)";
+ "D(37)" -> "D(-2)_gv28";
+ }
+ subgraph dominatorTree_gv31 {
+ graph [label=nonShortCircuitMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv31" [style=filled];
+ "D(-1)_gv31" -> "D(0)_gv31";
+ "D(10)_gv1" -> "D(20)";
+ "D(10)_gv1" -> "D(17)_gv1";
+ "D(10)_gv1" -> "D(15)";
+ "D(20)" -> "D(-2)_gv29";
+ "D(20)" -> "D(28)_gv1";
+ "D(20)" -> "D(24)_gv1";
+ "D(0)_gv31" -> "D(10)_gv1";
+ "D(0)_gv31" -> "D(7)_gv1";
+ "D(0)_gv31" -> "D(5)_gv1";
+ }
+ subgraph dominatorTree_gv32 {
+ graph [label=privateInstanceCallMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv32" [style=filled];
+ "D(-1)_gv32" -> "D(0)_gv32";
+ "D(0)_gv32" -> "D(-2)_gv30";
+ }
+ subgraph dominatorTree_gv33 {
+ graph [label=privateInstanceCallTarget];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv33" [style=filled];
+ "D(-1)_gv33" -> "D(0)_gv33";
+ "D(0)_gv33" -> "D(-2)_gv31";
+ }
+ subgraph dominatorTree_gv34 {
+ graph [label=shortCircuitMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv34" [style=filled];
+ "D(-1)_gv34" -> "D(0)_gv34";
+ "D(0)_gv34" -> "D(5)_gv2";
+ "D(0)_gv34" -> "D(12)_gv1";
+ "D(0)_gv34" -> "D(-2)_gv32";
+ "D(5)_gv2" -> "D(8)_gv6";
+ }
+ subgraph dominatorTree_gv35 {
+ graph [label=staticCallMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv35" [style=filled];
+ "D(-1)_gv35" -> "D(0)_gv35";
+ "D(0)_gv35" -> "D(-2)_gv33";
+ }
+ subgraph dominatorTree_gv36 {
+ graph [label=staticCallTarget];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv36" [style=filled];
+ "D(-1)_gv36" -> "D(0)_gv36";
+ "D(0)_gv36" -> "D(-2)_gv34";
+ }
+ subgraph dominatorTree_gv37 {
+ graph [label=staticFieldReadMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv37" [style=filled];
+ "D(-1)_gv37" -> "D(0)_gv37";
+ "D(0)_gv37" -> "D(-2)_gv35";
+ }
+ subgraph dominatorTree_gv38 {
+ graph [label=staticFieldWriteMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv38" [style=filled];
+ "D(-1)_gv38" -> "D(0)_gv38";
+ "D(0)_gv38" -> "D(-2)_gv36";
+ }
+ subgraph dominatorTree_gv39 {
+ graph [label=switchMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv39" [style=filled];
+ "D(-1)_gv39" -> "D(0)_gv39";
+ "D(31)" -> "D(-2)_gv37";
+ "D(0)_gv39" -> "D(31)";
+ "D(0)_gv39" -> "D(26)";
+ "D(0)_gv39" -> "D(8)_gv7";
+ "D(0)_gv39" -> "D(20)_gv1";
+ "D(0)_gv39" -> "D(14)_gv1";
+ }
+ subgraph dominatorTree_gv40 {
+ graph [label=switchMethod2];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv40" [style=filled];
+ "D(-1)_gv40" -> "D(0)_gv40";
+ "D(0)_gv40" -> "D(31)_gv1";
+ "D(0)_gv40" -> "D(8)_gv8";
+ "D(0)_gv40" -> "D(14)_gv2";
+ "D(0)_gv40" -> "D(20)_gv2";
+ "D(0)_gv40" -> "D(26)_gv1";
+ "D(31)_gv1" -> "D(-2)_gv38";
+ }
+ subgraph dominatorTree_gv41 {
+ graph [label=whileMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv41" [style=filled];
+ "D(-1)_gv41" -> "D(0)_gv41";
+ "D(0)_gv41" -> "D(4)_gv2";
+ "D(4)_gv2" -> "D(19)";
+ "D(4)_gv2" -> "D(9)_gv1";
+ "D(19)" -> "D(-2)_gv39";
+ }
+ subgraph dominatorTree_gv42 {
+ graph [label=whileTrueMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv42" [style=filled];
+ "D(-1)_gv42" -> "D(0)_gv42";
+ }
+ subgraph dominatorTree {
+ graph [label=""];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)" [style=filled];
+ "D(-1)" -> "D(0)";
+ "D(0)" -> "D(-2)";
+ }
+ subgraph dominatorTree_gv1 {
+ graph [label=alloc2Of3dArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv1" [style=filled];
+ "D(-1)_gv1" -> "D(0)_gv1";
+ "D(0)_gv1" -> "D(-2)_gv1";
+ }
+ subgraph dominatorTree_gv2 {
+ graph [label=alloc2dArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv2" [style=filled];
+ "D(-1)_gv2" -> "D(0)_gv2";
+ "D(0)_gv2" -> "D(-2)_gv2";
+ }
+ subgraph dominatorTree_gv3 {
+ graph [label=allocAndInit2dArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv3" [style=filled];
+ "D(-1)_gv3" -> "D(0)_gv3";
+ "D(0)_gv3" -> "D(-2)_gv3";
+ }
+ subgraph dominatorTree_gv4 {
+ graph [label=allocAndInitIntArrayMethod];
+ node [label="\N",
+ style=""
+ ];
+ "D(-1)_gv4" [style=filled];
+ "D(-1)_gv4" -> "D(0)_gv4";
+ "D(0)_gv4" -> "D(-2)_gv4";
+ }
+}
diff --git a/test-output/all.dt.pdf b/test-output/all.dt.pdf
new file mode 100644
index 0000000..86a3d89
Binary files /dev/null and b/test-output/all.dt.pdf differ
diff --git a/test-output/alloc2Of3dArrayMethod.asm.txt b/test-output/alloc2Of3dArrayMethod.asm.txt
new file mode 100644
index 0000000..a6e5c9e
--- /dev/null
+++ b/test-output/alloc2Of3dArrayMethod.asm.txt
@@ -0,0 +1,7 @@
+ Method: alloc2Of3dArrayMethod()[[[I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_2
+ 3: ICONST_3
+ 4: MULTIANEWARRAY [[[I 2
+ 5: ARETURN
diff --git a/test-output/alloc2Of3dArrayMethod.cfg.dot b/test-output/alloc2Of3dArrayMethod.cfg.dot
new file mode 100644
index 0000000..31add51
--- /dev/null
+++ b/test-output/alloc2Of3dArrayMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph alloc2Of3dArrayMethod {
+
+ node [shape=record]
+ "alloc2Of3dArrayMethodbb-1" [shape=circle,label="e",xlabel="alloc2Of3dArrayMethod"]
+ "alloc2Of3dArrayMethodbb-2" [shape=circle,label="x"]
+ "alloc2Of3dArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[[I 2|5: ARETURN }"]
+
+ "alloc2Of3dArrayMethodbb-1" -> "alloc2Of3dArrayMethodbb0"
+ "alloc2Of3dArrayMethodbb0" -> "alloc2Of3dArrayMethodbb-2"
+}
diff --git a/test-output/alloc2Of3dArrayMethod.combined.dot b/test-output/alloc2Of3dArrayMethod.combined.dot
new file mode 100644
index 0000000..38f7fe4
--- /dev/null
+++ b/test-output/alloc2Of3dArrayMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="alloc2Of3dArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ICONST_3 \l|4: MULTIANEWARRAY [[[I 2\l|5: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/alloc2Of3dArrayMethod.dt.dot b/test-output/alloc2Of3dArrayMethod.dt.dot
new file mode 100644
index 0000000..e2c18a8
--- /dev/null
+++ b/test-output/alloc2Of3dArrayMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="alloc2Of3dArrayMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/alloc2dArrayMethod.asm.txt b/test-output/alloc2dArrayMethod.asm.txt
new file mode 100644
index 0000000..ecd98f2
--- /dev/null
+++ b/test-output/alloc2dArrayMethod.asm.txt
@@ -0,0 +1,7 @@
+ Method: alloc2dArrayMethod()[[I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_2
+ 3: ICONST_3
+ 4: MULTIANEWARRAY [[I 2
+ 5: ARETURN
diff --git a/test-output/alloc2dArrayMethod.cfg.dot b/test-output/alloc2dArrayMethod.cfg.dot
new file mode 100644
index 0000000..820b1e8
--- /dev/null
+++ b/test-output/alloc2dArrayMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph alloc2dArrayMethod {
+
+ node [shape=record]
+ "alloc2dArrayMethodbb-1" [shape=circle,label="e",xlabel="alloc2dArrayMethod"]
+ "alloc2dArrayMethodbb-2" [shape=circle,label="x"]
+ "alloc2dArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ICONST_3 |4: MULTIANEWARRAY [[I 2|5: ARETURN }"]
+
+ "alloc2dArrayMethodbb-1" -> "alloc2dArrayMethodbb0"
+ "alloc2dArrayMethodbb0" -> "alloc2dArrayMethodbb-2"
+}
diff --git a/test-output/alloc2dArrayMethod.combined.dot b/test-output/alloc2dArrayMethod.combined.dot
new file mode 100644
index 0000000..bb1d058
--- /dev/null
+++ b/test-output/alloc2dArrayMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="alloc2dArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ICONST_3 \l|4: MULTIANEWARRAY [[I 2\l|5: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/alloc2dArrayMethod.dt.dot b/test-output/alloc2dArrayMethod.dt.dot
new file mode 100644
index 0000000..5ae18bb
--- /dev/null
+++ b/test-output/alloc2dArrayMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="alloc2dArrayMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/allocAndInit2dArrayMethod.asm.txt b/test-output/allocAndInit2dArrayMethod.asm.txt
new file mode 100644
index 0000000..f595246
--- /dev/null
+++ b/test-output/allocAndInit2dArrayMethod.asm.txt
@@ -0,0 +1,15 @@
+ Method: allocAndInit2dArrayMethod()[[I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_1
+ 3: ANEWARRAY [I
+ 4: DUP
+ 5: ICONST_0
+ 6: ICONST_1
+ 7: NEWARRAY T_INT
+ 8: DUP
+ 9: ICONST_0
+ 10: ICONST_1
+ 11: IASTORE
+ 12: AASTORE
+ 13: ARETURN
diff --git a/test-output/allocAndInit2dArrayMethod.cfg.dot b/test-output/allocAndInit2dArrayMethod.cfg.dot
new file mode 100644
index 0000000..28f2f55
--- /dev/null
+++ b/test-output/allocAndInit2dArrayMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph allocAndInit2dArrayMethod {
+
+ node [shape=record]
+ "allocAndInit2dArrayMethodbb-1" [shape=circle,label="e",xlabel="allocAndInit2dArrayMethod"]
+ "allocAndInit2dArrayMethodbb-2" [shape=circle,label="x"]
+ "allocAndInit2dArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_1 |3: ANEWARRAY [I|4: DUP |5: ICONST_0 |6: ICONST_1 |7: NEWARRAY T_INT|8: DUP |9: ICONST_0 |10: ICONST_1 |11: IASTORE |12: AASTORE |13: ARETURN }"]
+
+ "allocAndInit2dArrayMethodbb-1" -> "allocAndInit2dArrayMethodbb0"
+ "allocAndInit2dArrayMethodbb0" -> "allocAndInit2dArrayMethodbb-2"
+}
diff --git a/test-output/allocAndInit2dArrayMethod.combined.dot b/test-output/allocAndInit2dArrayMethod.combined.dot
new file mode 100644
index 0000000..d9798a5
--- /dev/null
+++ b/test-output/allocAndInit2dArrayMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="allocAndInit2dArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_1 \l|3: ANEWARRAY [I\l|4: DUP \l|5: ICONST_0 \l|6: ICONST_1 \l|7: NEWARRAY T_INT\l|8: DUP \l|9: ICONST_0 \l|10: ICONST_1 \l|11: IASTORE \l|12: AASTORE \l|13: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/allocAndInit2dArrayMethod.dt.dot b/test-output/allocAndInit2dArrayMethod.dt.dot
new file mode 100644
index 0000000..95a5e19
--- /dev/null
+++ b/test-output/allocAndInit2dArrayMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="allocAndInit2dArrayMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/allocAndInitIntArrayMethod.asm.txt b/test-output/allocAndInitIntArrayMethod.asm.txt
new file mode 100644
index 0000000..2aecb79
--- /dev/null
+++ b/test-output/allocAndInitIntArrayMethod.asm.txt
@@ -0,0 +1,14 @@
+ Method: allocAndInitIntArrayMethod()[I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_2
+ 3: NEWARRAY T_INT
+ 4: DUP
+ 5: ICONST_0
+ 6: ICONST_1
+ 7: IASTORE
+ 8: DUP
+ 9: ICONST_1
+ 10: ICONST_2
+ 11: IASTORE
+ 12: ARETURN
diff --git a/test-output/allocAndInitIntArrayMethod.cfg.dot b/test-output/allocAndInitIntArrayMethod.cfg.dot
new file mode 100644
index 0000000..2ddab58
--- /dev/null
+++ b/test-output/allocAndInitIntArrayMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph allocAndInitIntArrayMethod {
+
+ node [shape=record]
+ "allocAndInitIntArrayMethodbb-1" [shape=circle,label="e",xlabel="allocAndInitIntArrayMethod"]
+ "allocAndInitIntArrayMethodbb-2" [shape=circle,label="x"]
+ "allocAndInitIntArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: NEWARRAY T_INT|4: DUP |5: ICONST_0 |6: ICONST_1 |7: IASTORE |8: DUP |9: ICONST_1 |10: ICONST_2 |11: IASTORE |12: ARETURN }"]
+
+ "allocAndInitIntArrayMethodbb-1" -> "allocAndInitIntArrayMethodbb0"
+ "allocAndInitIntArrayMethodbb0" -> "allocAndInitIntArrayMethodbb-2"
+}
diff --git a/test-output/allocAndInitIntArrayMethod.combined.dot b/test-output/allocAndInitIntArrayMethod.combined.dot
new file mode 100644
index 0000000..58bcadc
--- /dev/null
+++ b/test-output/allocAndInitIntArrayMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="allocAndInitIntArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: NEWARRAY T_INT\l|4: DUP \l|5: ICONST_0 \l|6: ICONST_1 \l|7: IASTORE \l|8: DUP \l|9: ICONST_1 \l|10: ICONST_2 \l|11: IASTORE \l|12: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/allocAndInitIntArrayMethod.dt.dot b/test-output/allocAndInitIntArrayMethod.dt.dot
new file mode 100644
index 0000000..fce50fa
--- /dev/null
+++ b/test-output/allocAndInitIntArrayMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="allocAndInitIntArrayMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/allocAndInitObjectArrayMethod.asm.txt b/test-output/allocAndInitObjectArrayMethod.asm.txt
new file mode 100644
index 0000000..0c2494d
--- /dev/null
+++ b/test-output/allocAndInitObjectArrayMethod.asm.txt
@@ -0,0 +1,14 @@
+ Method: allocAndInitObjectArrayMethod()[Ljava/lang/Object;
+ 0: // label
+ 1: // line number information
+ 2: ICONST_2
+ 3: ANEWARRAY java/lang/Object
+ 4: DUP
+ 5: ICONST_0
+ 6: LDC 1
+ 7: AASTORE
+ 8: DUP
+ 9: ICONST_1
+ 10: LDC 2
+ 11: AASTORE
+ 12: ARETURN
diff --git a/test-output/allocAndInitObjectArrayMethod.cfg.dot b/test-output/allocAndInitObjectArrayMethod.cfg.dot
new file mode 100644
index 0000000..ad2168e
--- /dev/null
+++ b/test-output/allocAndInitObjectArrayMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph allocAndInitObjectArrayMethod {
+
+ node [shape=record]
+ "allocAndInitObjectArrayMethodbb-1" [shape=circle,label="e",xlabel="allocAndInitObjectArrayMethod"]
+ "allocAndInitObjectArrayMethodbb-2" [shape=circle,label="x"]
+ "allocAndInitObjectArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY java/lang/Object|4: DUP |5: ICONST_0 |6: LDC 1|7: AASTORE |8: DUP |9: ICONST_1 |10: LDC 2|11: AASTORE |12: ARETURN }"]
+
+ "allocAndInitObjectArrayMethodbb-1" -> "allocAndInitObjectArrayMethodbb0"
+ "allocAndInitObjectArrayMethodbb0" -> "allocAndInitObjectArrayMethodbb-2"
+}
diff --git a/test-output/allocAndInitObjectArrayMethod.combined.dot b/test-output/allocAndInitObjectArrayMethod.combined.dot
new file mode 100644
index 0000000..ba5fb60
--- /dev/null
+++ b/test-output/allocAndInitObjectArrayMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="allocAndInitObjectArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ANEWARRAY java/lang/Object\l|4: DUP \l|5: ICONST_0 \l|6: LDC 1\l|7: AASTORE \l|8: DUP \l|9: ICONST_1 \l|10: LDC 2\l|11: AASTORE \l|12: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/allocAndInitObjectArrayMethod.dt.dot b/test-output/allocAndInitObjectArrayMethod.dt.dot
new file mode 100644
index 0000000..d48d610
--- /dev/null
+++ b/test-output/allocAndInitObjectArrayMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="allocAndInitObjectArrayMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/allocIncomplete2dArrayMethod.asm.txt b/test-output/allocIncomplete2dArrayMethod.asm.txt
new file mode 100644
index 0000000..1c0d908
--- /dev/null
+++ b/test-output/allocIncomplete2dArrayMethod.asm.txt
@@ -0,0 +1,6 @@
+ Method: allocIncomplete2dArrayMethod()[[I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_2
+ 3: ANEWARRAY [I
+ 4: ARETURN
diff --git a/test-output/allocIncomplete2dArrayMethod.cfg.dot b/test-output/allocIncomplete2dArrayMethod.cfg.dot
new file mode 100644
index 0000000..5e41532
--- /dev/null
+++ b/test-output/allocIncomplete2dArrayMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph allocIncomplete2dArrayMethod {
+
+ node [shape=record]
+ "allocIncomplete2dArrayMethodbb-1" [shape=circle,label="e",xlabel="allocIncomplete2dArrayMethod"]
+ "allocIncomplete2dArrayMethodbb-2" [shape=circle,label="x"]
+ "allocIncomplete2dArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_2 |3: ANEWARRAY [I|4: ARETURN }"]
+
+ "allocIncomplete2dArrayMethodbb-1" -> "allocIncomplete2dArrayMethodbb0"
+ "allocIncomplete2dArrayMethodbb0" -> "allocIncomplete2dArrayMethodbb-2"
+}
diff --git a/test-output/allocIncomplete2dArrayMethod.combined.dot b/test-output/allocIncomplete2dArrayMethod.combined.dot
new file mode 100644
index 0000000..04c1c06
--- /dev/null
+++ b/test-output/allocIncomplete2dArrayMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="allocIncomplete2dArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_2 \l|3: ANEWARRAY [I\l|4: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/allocIncomplete2dArrayMethod.dt.dot b/test-output/allocIncomplete2dArrayMethod.dt.dot
new file mode 100644
index 0000000..6a47a9b
--- /dev/null
+++ b/test-output/allocIncomplete2dArrayMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="allocIncomplete2dArrayMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/allocIntArrayMethod.asm.txt b/test-output/allocIntArrayMethod.asm.txt
new file mode 100644
index 0000000..bca1cfe
--- /dev/null
+++ b/test-output/allocIntArrayMethod.asm.txt
@@ -0,0 +1,6 @@
+ Method: allocIntArrayMethod()[I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_3
+ 3: NEWARRAY T_INT
+ 4: ARETURN
diff --git a/test-output/allocIntArrayMethod.cfg.dot b/test-output/allocIntArrayMethod.cfg.dot
new file mode 100644
index 0000000..7b47fc6
--- /dev/null
+++ b/test-output/allocIntArrayMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph allocIntArrayMethod {
+
+ node [shape=record]
+ "allocIntArrayMethodbb-1" [shape=circle,label="e",xlabel="allocIntArrayMethod"]
+ "allocIntArrayMethodbb-2" [shape=circle,label="x"]
+ "allocIntArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: NEWARRAY T_INT|4: ARETURN }"]
+
+ "allocIntArrayMethodbb-1" -> "allocIntArrayMethodbb0"
+ "allocIntArrayMethodbb0" -> "allocIntArrayMethodbb-2"
+}
diff --git a/test-output/allocIntArrayMethod.combined.dot b/test-output/allocIntArrayMethod.combined.dot
new file mode 100644
index 0000000..8997577
--- /dev/null
+++ b/test-output/allocIntArrayMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="allocIntArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_3 \l|3: NEWARRAY T_INT\l|4: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/allocIntArrayMethod.dt.dot b/test-output/allocIntArrayMethod.dt.dot
new file mode 100644
index 0000000..e0ef0ea
--- /dev/null
+++ b/test-output/allocIntArrayMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="allocIntArrayMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/allocObjectArrayMethod.asm.txt b/test-output/allocObjectArrayMethod.asm.txt
new file mode 100644
index 0000000..a4bafb4
--- /dev/null
+++ b/test-output/allocObjectArrayMethod.asm.txt
@@ -0,0 +1,6 @@
+ Method: allocObjectArrayMethod()[Ljava/lang/Object;
+ 0: // label
+ 1: // line number information
+ 2: ICONST_3
+ 3: ANEWARRAY java/lang/Object
+ 4: ARETURN
diff --git a/test-output/allocObjectArrayMethod.cfg.dot b/test-output/allocObjectArrayMethod.cfg.dot
new file mode 100644
index 0000000..5e0cccf
--- /dev/null
+++ b/test-output/allocObjectArrayMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph allocObjectArrayMethod {
+
+ node [shape=record]
+ "allocObjectArrayMethodbb-1" [shape=circle,label="e",xlabel="allocObjectArrayMethod"]
+ "allocObjectArrayMethodbb-2" [shape=circle,label="x"]
+ "allocObjectArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_3 |3: ANEWARRAY java/lang/Object|4: ARETURN }"]
+
+ "allocObjectArrayMethodbb-1" -> "allocObjectArrayMethodbb0"
+ "allocObjectArrayMethodbb0" -> "allocObjectArrayMethodbb-2"
+}
diff --git a/test-output/allocObjectArrayMethod.combined.dot b/test-output/allocObjectArrayMethod.combined.dot
new file mode 100644
index 0000000..f4d4cd4
--- /dev/null
+++ b/test-output/allocObjectArrayMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="allocObjectArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_3 \l|3: ANEWARRAY java/lang/Object\l|4: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/allocObjectArrayMethod.dt.dot b/test-output/allocObjectArrayMethod.dt.dot
new file mode 100644
index 0000000..4e25027
--- /dev/null
+++ b/test-output/allocObjectArrayMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="allocObjectArrayMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/allocObjectMethod.asm.txt b/test-output/allocObjectMethod.asm.txt
new file mode 100644
index 0000000..0279d95
--- /dev/null
+++ b/test-output/allocObjectMethod.asm.txt
@@ -0,0 +1,7 @@
+ Method: allocObjectMethod()Ljava/lang/Object;
+ 0: // label
+ 1: // line number information
+ 2: NEW java/lang/Object
+ 3: DUP
+ 4: INVOKESPECIAL java/lang/Object. ()V
+ 5: ARETURN
diff --git a/test-output/allocObjectMethod.cfg.dot b/test-output/allocObjectMethod.cfg.dot
new file mode 100644
index 0000000..ef41508
--- /dev/null
+++ b/test-output/allocObjectMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph allocObjectMethod {
+
+ node [shape=record]
+ "allocObjectMethodbb-1" [shape=circle,label="e",xlabel="allocObjectMethod"]
+ "allocObjectMethodbb-2" [shape=circle,label="x"]
+ "allocObjectMethodbb0" [label="0|{0: // label|1: // line number information|2: NEW java/lang/Object|3: DUP |4: INVOKESPECIAL java/lang/Object. ()V|5: ARETURN }"]
+
+ "allocObjectMethodbb-1" -> "allocObjectMethodbb0"
+ "allocObjectMethodbb0" -> "allocObjectMethodbb-2"
+}
diff --git a/test-output/allocObjectMethod.combined.dot b/test-output/allocObjectMethod.combined.dot
new file mode 100644
index 0000000..b5f4db6
--- /dev/null
+++ b/test-output/allocObjectMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="allocObjectMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: NEW java/lang/Object\l|3: DUP \l|4: INVOKESPECIAL java/lang/Object. ()V\l|5: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/allocObjectMethod.dt.dot b/test-output/allocObjectMethod.dt.dot
new file mode 100644
index 0000000..b085169
--- /dev/null
+++ b/test-output/allocObjectMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="allocObjectMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/arrayLengthMethod.asm.txt b/test-output/arrayLengthMethod.asm.txt
new file mode 100644
index 0000000..108ea82
--- /dev/null
+++ b/test-output/arrayLengthMethod.asm.txt
@@ -0,0 +1,6 @@
+ Method: arrayLengthMethod([Ljava/lang/String;)I
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 1
+ 3: ARRAYLENGTH
+ 4: IRETURN
diff --git a/test-output/arrayLengthMethod.cfg.dot b/test-output/arrayLengthMethod.cfg.dot
new file mode 100644
index 0000000..d06a7bf
--- /dev/null
+++ b/test-output/arrayLengthMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph arrayLengthMethod {
+
+ node [shape=record]
+ "arrayLengthMethodbb-1" [shape=circle,label="e",xlabel="arrayLengthMethod"]
+ "arrayLengthMethodbb-2" [shape=circle,label="x"]
+ "arrayLengthMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ARRAYLENGTH |4: IRETURN }"]
+
+ "arrayLengthMethodbb-1" -> "arrayLengthMethodbb0"
+ "arrayLengthMethodbb0" -> "arrayLengthMethodbb-2"
+}
diff --git a/test-output/arrayLengthMethod.combined.dot b/test-output/arrayLengthMethod.combined.dot
new file mode 100644
index 0000000..b2aaaa1
--- /dev/null
+++ b/test-output/arrayLengthMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="arrayLengthMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ARRAYLENGTH \l|4: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/arrayLengthMethod.dt.dot b/test-output/arrayLengthMethod.dt.dot
new file mode 100644
index 0000000..5cfb4c7
--- /dev/null
+++ b/test-output/arrayLengthMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="arrayLengthMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/arrayReadMethod.asm.txt b/test-output/arrayReadMethod.asm.txt
new file mode 100644
index 0000000..e008e22
--- /dev/null
+++ b/test-output/arrayReadMethod.asm.txt
@@ -0,0 +1,7 @@
+ Method: arrayReadMethod([Ljava/lang/String;)Ljava/lang/String;
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 1
+ 3: ICONST_0
+ 4: AALOAD
+ 5: ARETURN
diff --git a/test-output/arrayReadMethod.cfg.dot b/test-output/arrayReadMethod.cfg.dot
new file mode 100644
index 0000000..7ca4ab0
--- /dev/null
+++ b/test-output/arrayReadMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph arrayReadMethod {
+
+ node [shape=record]
+ "arrayReadMethodbb-1" [shape=circle,label="e",xlabel="arrayReadMethod"]
+ "arrayReadMethodbb-2" [shape=circle,label="x"]
+ "arrayReadMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: AALOAD |5: ARETURN }"]
+
+ "arrayReadMethodbb-1" -> "arrayReadMethodbb0"
+ "arrayReadMethodbb0" -> "arrayReadMethodbb-2"
+}
diff --git a/test-output/arrayReadMethod.combined.dot b/test-output/arrayReadMethod.combined.dot
new file mode 100644
index 0000000..45fc2f8
--- /dev/null
+++ b/test-output/arrayReadMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="arrayReadMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ICONST_0 \l|4: AALOAD \l|5: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/arrayReadMethod.dt.dot b/test-output/arrayReadMethod.dt.dot
new file mode 100644
index 0000000..618539c
--- /dev/null
+++ b/test-output/arrayReadMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="arrayReadMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/arrayWriteMethod.asm.txt b/test-output/arrayWriteMethod.asm.txt
new file mode 100644
index 0000000..5b5d5ec
--- /dev/null
+++ b/test-output/arrayWriteMethod.asm.txt
@@ -0,0 +1,10 @@
+ Method: arrayWriteMethod([Ljava/lang/String;Ljava/lang/String;)V
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 1
+ 3: ICONST_0
+ 4: ALOAD 2
+ 5: AASTORE
+ 6: // label
+ 7: // line number information
+ 8: RETURN
diff --git a/test-output/arrayWriteMethod.cfg.dot b/test-output/arrayWriteMethod.cfg.dot
new file mode 100644
index 0000000..cfc03b3
--- /dev/null
+++ b/test-output/arrayWriteMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph arrayWriteMethod {
+
+ node [shape=record]
+ "arrayWriteMethodbb-1" [shape=circle,label="e",xlabel="arrayWriteMethod"]
+ "arrayWriteMethodbb-2" [shape=circle,label="x"]
+ "arrayWriteMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: ICONST_0 |4: ALOAD 2|5: AASTORE |6: // label|7: // line number information|8: RETURN }"]
+
+ "arrayWriteMethodbb-1" -> "arrayWriteMethodbb0"
+ "arrayWriteMethodbb0" -> "arrayWriteMethodbb-2"
+}
diff --git a/test-output/arrayWriteMethod.combined.dot b/test-output/arrayWriteMethod.combined.dot
new file mode 100644
index 0000000..c83b47f
--- /dev/null
+++ b/test-output/arrayWriteMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="arrayWriteMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: ICONST_0 \l|4: ALOAD 2\l|5: AASTORE \l|6: // label\l|7: // line number information\l|8: RETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/arrayWriteMethod.dt.dot b/test-output/arrayWriteMethod.dt.dot
new file mode 100644
index 0000000..61b42aa
--- /dev/null
+++ b/test-output/arrayWriteMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="arrayWriteMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/condMethod.asm.txt b/test-output/condMethod.asm.txt
new file mode 100644
index 0000000..9a8c290
--- /dev/null
+++ b/test-output/condMethod.asm.txt
@@ -0,0 +1,14 @@
+ Method: condMethod(II)I
+ 0: // label
+ 1: // line number information
+ 2: ILOAD 1
+ 3: ILOAD 2
+ 4: IF_ICMPLE 7
+ 5: ILOAD 1
+ 6: GOTO 10
+ 7: // label
+ 8: // stack frame map
+ 9: ILOAD 2
+ 10: // label
+ 11: // stack frame map
+ 12: IRETURN
diff --git a/test-output/condMethod.cfg.dot b/test-output/condMethod.cfg.dot
new file mode 100644
index 0000000..6c7c15c
--- /dev/null
+++ b/test-output/condMethod.cfg.dot
@@ -0,0 +1,17 @@
+digraph condMethod {
+
+ node [shape=record]
+ "condMethodbb-1" [shape=circle,label="e",xlabel="condMethod"]
+ "condMethodbb-2" [shape=circle,label="x"]
+ "condMethodbb0" [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"]
+ "condMethodbb5" [label="5|{5: ILOAD 1|6: GOTO 10}"]
+ "condMethodbb7" [label="7|{7: // label|8: // stack frame map|9: ILOAD 2}"]
+ "condMethodbb10" [label="10|{10: // label|11: // stack frame map|12: IRETURN }"]
+
+ "condMethodbb-1" -> "condMethodbb0"
+ "condMethodbb0" -> "condMethodbb5"
+ "condMethodbb7" -> "condMethodbb10"
+ "condMethodbb10" -> "condMethodbb-2"
+ "condMethodbb0" -> "condMethodbb7" [label="T"]
+ "condMethodbb5" -> "condMethodbb10" [label="T"]
+}
diff --git a/test-output/condMethod.combined.dot b/test-output/condMethod.combined.dot
new file mode 100644
index 0000000..fa22f38
--- /dev/null
+++ b/test-output/condMethod.combined.dot
@@ -0,0 +1,20 @@
+digraph combined {
+ label="condMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 7\l}"]
+ 5 [shape=record,label="5|{5: ILOAD 1\l|6: GOTO 10\l}"]
+ 7 [shape=record,label="7|{7: // label\l|8: // stack frame map\l|9: ILOAD 2\l}"]
+ 10 [shape=record,label="10|{10: // label\l|11: // stack frame map\l|12: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 5 [label=""]
+ 7 -> 10 [label=""]
+ 10 -> -2 [label=""]
+ 0 -> 7 [label="T"]
+ 5 -> 10 [label="T"]
+ -1 -> 0 [style=dotted]
+ 0 -> 7 [style=dotted]
+ 10 -> -2 [style=dotted]
+ 0 -> 10 [style=dotted]
+ 0 -> 5 [style=dotted]
+}
diff --git a/test-output/condMethod.dt.dot b/test-output/condMethod.dt.dot
new file mode 100644
index 0000000..84fa5b9
--- /dev/null
+++ b/test-output/condMethod.dt.dot
@@ -0,0 +1,14 @@
+digraph dominatorTree {
+ label="condMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(7)"
+ "D(10)"
+ "D(-2)"
+ "D(5)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(7)"
+ "D(10)" -> "D(-2)"
+ "D(0)" -> "D(10)"
+ "D(0)" -> "D(5)"
+}
diff --git a/test-output/doWhileMethod.asm.txt b/test-output/doWhileMethod.asm.txt
new file mode 100644
index 0000000..7b4c1f0
--- /dev/null
+++ b/test-output/doWhileMethod.asm.txt
@@ -0,0 +1,23 @@
+ Method: doWhileMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: // stack frame map
+ 7: ILOAD 2
+ 8: ILOAD 1
+ 9: IADD
+ 10: ISTORE 2
+ 11: // label
+ 12: // line number information
+ 13: IINC 1 -1
+ 14: // label
+ 15: // line number information
+ 16: ILOAD 1
+ 17: IFGT 4
+ 18: // label
+ 19: // line number information
+ 20: ILOAD 2
+ 21: IRETURN
diff --git a/test-output/doWhileMethod.cfg.dot b/test-output/doWhileMethod.cfg.dot
new file mode 100644
index 0000000..142634e
--- /dev/null
+++ b/test-output/doWhileMethod.cfg.dot
@@ -0,0 +1,15 @@
+digraph doWhileMethod {
+
+ node [shape=record]
+ "doWhileMethodbb-1" [shape=circle,label="e",xlabel="doWhileMethod"]
+ "doWhileMethodbb-2" [shape=circle,label="x"]
+ "doWhileMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"]
+ "doWhileMethodbb4" [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 2|8: ILOAD 1|9: IADD |10: ISTORE 2|11: // label|12: // line number information|13: IINC 1 -1|14: // label|15: // line number information|16: ILOAD 1|17: IFGT 4}"]
+ "doWhileMethodbb18" [label="18|{18: // label|19: // line number information|20: ILOAD 2|21: IRETURN }"]
+
+ "doWhileMethodbb-1" -> "doWhileMethodbb0"
+ "doWhileMethodbb0" -> "doWhileMethodbb4"
+ "doWhileMethodbb4" -> "doWhileMethodbb18"
+ "doWhileMethodbb18" -> "doWhileMethodbb-2"
+ "doWhileMethodbb4" -> "doWhileMethodbb4" [label="T"]
+}
diff --git a/test-output/doWhileMethod.combined.dot b/test-output/doWhileMethod.combined.dot
new file mode 100644
index 0000000..34afc79
--- /dev/null
+++ b/test-output/doWhileMethod.combined.dot
@@ -0,0 +1,17 @@
+digraph combined {
+ label="doWhileMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}"]
+ 4 [shape=record,label="4|{4: // label\l|5: // line number information\l|6: // stack frame map\l|7: ILOAD 2\l|8: ILOAD 1\l|9: IADD \l|10: ISTORE 2\l|11: // label\l|12: // line number information\l|13: IINC 1 -1\l|14: // label\l|15: // line number information\l|16: ILOAD 1\l|17: IFGT 4\l}"]
+ 18 [shape=record,label="18|{18: // label\l|19: // line number information\l|20: ILOAD 2\l|21: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 4 [label=""]
+ 4 -> 18 [label=""]
+ 18 -> -2 [label=""]
+ 4 -> 4 [label="T"]
+ -1 -> 0 [style=dotted]
+ 18 -> -2 [style=dotted]
+ 4 -> 18 [style=dotted]
+ 0 -> 4 [style=dotted]
+}
diff --git a/test-output/doWhileMethod.dt.dot b/test-output/doWhileMethod.dt.dot
new file mode 100644
index 0000000..f81123b
--- /dev/null
+++ b/test-output/doWhileMethod.dt.dot
@@ -0,0 +1,12 @@
+digraph dominatorTree {
+ label="doWhileMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(18)"
+ "D(-2)"
+ "D(4)"
+ "D(-1)" -> "D(0)"
+ "D(18)" -> "D(-2)"
+ "D(4)" -> "D(18)"
+ "D(0)" -> "D(4)"
+}
diff --git a/test-output/doWhileTrue.asm.txt b/test-output/doWhileTrue.asm.txt
new file mode 100644
index 0000000..550fb01
--- /dev/null
+++ b/test-output/doWhileTrue.asm.txt
@@ -0,0 +1,8 @@
+ Method: doWhileTrue(I)I
+ 0: // label
+ 1: // line number information
+ 2: // stack frame map
+ 3: IINC 1 1
+ 4: // label
+ 5: // line number information
+ 6: GOTO 0
diff --git a/test-output/doWhileTrue.cfg.dot b/test-output/doWhileTrue.cfg.dot
new file mode 100644
index 0000000..9f85345
--- /dev/null
+++ b/test-output/doWhileTrue.cfg.dot
@@ -0,0 +1,10 @@
+digraph doWhileTrue {
+
+ node [shape=record]
+ "doWhileTruebb-1" [shape=circle,label="e",xlabel="doWhileTrue"]
+ "doWhileTruebb-2" [shape=circle,label="e",xlabel="doWhileTrue"]
+ "doWhileTruebb0" [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: // label|5: // line number information|6: GOTO 0}"]
+
+ "doWhileTruebb-1" -> "doWhileTruebb0"
+ "doWhileTruebb0" -> "doWhileTruebb0" [label="T"]
+}
diff --git a/test-output/doWhileTrue.combined.dot b/test-output/doWhileTrue.combined.dot
new file mode 100644
index 0000000..7d1a892
--- /dev/null
+++ b/test-output/doWhileTrue.combined.dot
@@ -0,0 +1,9 @@
+digraph combined {
+ label="doWhileTrue"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: // stack frame map\l|3: IINC 1 1\l|4: // label\l|5: // line number information\l|6: GOTO 0\l}"]
+ -1 -> 0 [label=""]
+ 0 -> 0 [label="T"]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/doWhileTrue.dt.dot b/test-output/doWhileTrue.dt.dot
new file mode 100644
index 0000000..38a2eaa
--- /dev/null
+++ b/test-output/doWhileTrue.dt.dot
@@ -0,0 +1,6 @@
+digraph dominatorTree {
+ label="doWhileTrue"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/emptyMethod.asm.txt b/test-output/emptyMethod.asm.txt
new file mode 100644
index 0000000..ecf326c
--- /dev/null
+++ b/test-output/emptyMethod.asm.txt
@@ -0,0 +1,4 @@
+ Method: emptyMethod()V
+ 0: // label
+ 1: // line number information
+ 2: RETURN
diff --git a/test-output/emptyMethod.cfg.dot b/test-output/emptyMethod.cfg.dot
new file mode 100644
index 0000000..2403d46
--- /dev/null
+++ b/test-output/emptyMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph emptyMethod {
+
+ node [shape=record]
+ "emptyMethodbb-1" [shape=circle,label="e",xlabel="emptyMethod"]
+ "emptyMethodbb-2" [shape=circle,label="x"]
+ "emptyMethodbb0" [label="0|{0: // label|1: // line number information|2: RETURN }"]
+
+ "emptyMethodbb-1" -> "emptyMethodbb0"
+ "emptyMethodbb0" -> "emptyMethodbb-2"
+}
diff --git a/test-output/emptyMethod.combined.dot b/test-output/emptyMethod.combined.dot
new file mode 100644
index 0000000..7c744ad
--- /dev/null
+++ b/test-output/emptyMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="emptyMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/emptyMethod.dt.dot b/test-output/emptyMethod.dt.dot
new file mode 100644
index 0000000..3735c46
--- /dev/null
+++ b/test-output/emptyMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="emptyMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/fieldReadMethod.asm.txt b/test-output/fieldReadMethod.asm.txt
new file mode 100644
index 0000000..5e0d7d3
--- /dev/null
+++ b/test-output/fieldReadMethod.asm.txt
@@ -0,0 +1,6 @@
+ Method: fieldReadMethod()Ljava/lang/String;
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 0
+ 3: GETFIELD ExampleClass.field Ljava/lang/String;
+ 4: ARETURN
diff --git a/test-output/fieldReadMethod.cfg.dot b/test-output/fieldReadMethod.cfg.dot
new file mode 100644
index 0000000..3f5c7e3
--- /dev/null
+++ b/test-output/fieldReadMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph fieldReadMethod {
+
+ node [shape=record]
+ "fieldReadMethodbb-1" [shape=circle,label="e",xlabel="fieldReadMethod"]
+ "fieldReadMethodbb-2" [shape=circle,label="x"]
+ "fieldReadMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: GETFIELD ExampleClass.field Ljava/lang/String;|4: ARETURN }"]
+
+ "fieldReadMethodbb-1" -> "fieldReadMethodbb0"
+ "fieldReadMethodbb0" -> "fieldReadMethodbb-2"
+}
diff --git a/test-output/fieldReadMethod.combined.dot b/test-output/fieldReadMethod.combined.dot
new file mode 100644
index 0000000..4f954dd
--- /dev/null
+++ b/test-output/fieldReadMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="fieldReadMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: GETFIELD ExampleClass.field Ljava/lang/String;\l|4: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/fieldReadMethod.dt.dot b/test-output/fieldReadMethod.dt.dot
new file mode 100644
index 0000000..fa471a7
--- /dev/null
+++ b/test-output/fieldReadMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="fieldReadMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/fieldWriteMethod.asm.txt b/test-output/fieldWriteMethod.asm.txt
new file mode 100644
index 0000000..55cca5b
--- /dev/null
+++ b/test-output/fieldWriteMethod.asm.txt
@@ -0,0 +1,9 @@
+ Method: fieldWriteMethod(Ljava/lang/String;)V
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 0
+ 3: ALOAD 1
+ 4: PUTFIELD ExampleClass.field Ljava/lang/String;
+ 5: // label
+ 6: // line number information
+ 7: RETURN
diff --git a/test-output/fieldWriteMethod.cfg.dot b/test-output/fieldWriteMethod.cfg.dot
new file mode 100644
index 0000000..825e37f
--- /dev/null
+++ b/test-output/fieldWriteMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph fieldWriteMethod {
+
+ node [shape=record]
+ "fieldWriteMethodbb-1" [shape=circle,label="e",xlabel="fieldWriteMethod"]
+ "fieldWriteMethodbb-2" [shape=circle,label="x"]
+ "fieldWriteMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 0|3: ALOAD 1|4: PUTFIELD ExampleClass.field Ljava/lang/String;|5: // label|6: // line number information|7: RETURN }"]
+
+ "fieldWriteMethodbb-1" -> "fieldWriteMethodbb0"
+ "fieldWriteMethodbb0" -> "fieldWriteMethodbb-2"
+}
diff --git a/test-output/fieldWriteMethod.combined.dot b/test-output/fieldWriteMethod.combined.dot
new file mode 100644
index 0000000..1d39aad
--- /dev/null
+++ b/test-output/fieldWriteMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="fieldWriteMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 0\l|3: ALOAD 1\l|4: PUTFIELD ExampleClass.field Ljava/lang/String;\l|5: // label\l|6: // line number information\l|7: RETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/fieldWriteMethod.dt.dot b/test-output/fieldWriteMethod.dt.dot
new file mode 100644
index 0000000..63d56f0
--- /dev/null
+++ b/test-output/fieldWriteMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="fieldWriteMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/forEachArrayMethod.asm.txt b/test-output/forEachArrayMethod.asm.txt
new file mode 100644
index 0000000..42d887c
--- /dev/null
+++ b/test-output/forEachArrayMethod.asm.txt
@@ -0,0 +1,35 @@
+ Method: forEachArrayMethod([Ljava/lang/String;)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ALOAD 1
+ 7: ASTORE 3
+ 8: ALOAD 3
+ 9: ARRAYLENGTH
+ 10: ISTORE 4
+ 11: ICONST_0
+ 12: ISTORE 5
+ 13: // label
+ 14: // stack frame map
+ 15: ILOAD 5
+ 16: ILOAD 4
+ 17: IF_ICMPGE 29
+ 18: ALOAD 3
+ 19: ILOAD 5
+ 20: AALOAD
+ 21: ASTORE 6
+ 22: // label
+ 23: // line number information
+ 24: IINC 2 1
+ 25: // label
+ 26: // line number information
+ 27: IINC 5 1
+ 28: GOTO 13
+ 29: // label
+ 30: // line number information
+ 31: // stack frame map
+ 32: ILOAD 2
+ 33: IRETURN
diff --git a/test-output/forEachArrayMethod.cfg.dot b/test-output/forEachArrayMethod.cfg.dot
new file mode 100644
index 0000000..585e66e
--- /dev/null
+++ b/test-output/forEachArrayMethod.cfg.dot
@@ -0,0 +1,17 @@
+digraph forEachArrayMethod {
+
+ node [shape=record]
+ "forEachArrayMethodbb-1" [shape=circle,label="e",xlabel="forEachArrayMethod"]
+ "forEachArrayMethodbb-2" [shape=circle,label="x"]
+ "forEachArrayMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: ASTORE 3|8: ALOAD 3|9: ARRAYLENGTH |10: ISTORE 4|11: ICONST_0 |12: ISTORE 5}"]
+ "forEachArrayMethodbb13" [label="13|{13: // label|14: // stack frame map|15: ILOAD 5|16: ILOAD 4|17: IF_ICMPGE 29}"]
+ "forEachArrayMethodbb18" [label="18|{18: ALOAD 3|19: ILOAD 5|20: AALOAD |21: ASTORE 6|22: // label|23: // line number information|24: IINC 2 1|25: // label|26: // line number information|27: IINC 5 1|28: GOTO 13}"]
+ "forEachArrayMethodbb29" [label="29|{29: // label|30: // line number information|31: // stack frame map|32: ILOAD 2|33: IRETURN }"]
+
+ "forEachArrayMethodbb-1" -> "forEachArrayMethodbb0"
+ "forEachArrayMethodbb0" -> "forEachArrayMethodbb13"
+ "forEachArrayMethodbb13" -> "forEachArrayMethodbb18"
+ "forEachArrayMethodbb29" -> "forEachArrayMethodbb-2"
+ "forEachArrayMethodbb18" -> "forEachArrayMethodbb13" [label="T"]
+ "forEachArrayMethodbb13" -> "forEachArrayMethodbb29" [label="T"]
+}
diff --git a/test-output/forEachArrayMethod.combined.dot b/test-output/forEachArrayMethod.combined.dot
new file mode 100644
index 0000000..92b0dbb
--- /dev/null
+++ b/test-output/forEachArrayMethod.combined.dot
@@ -0,0 +1,20 @@
+digraph combined {
+ label="forEachArrayMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ALOAD 1\l|7: ASTORE 3\l|8: ALOAD 3\l|9: ARRAYLENGTH \l|10: ISTORE 4\l|11: ICONST_0 \l|12: ISTORE 5\l}"]
+ 13 [shape=record,label="13|{13: // label\l|14: // stack frame map\l|15: ILOAD 5\l|16: ILOAD 4\l|17: IF_ICMPGE 29\l}"]
+ 18 [shape=record,label="18|{18: ALOAD 3\l|19: ILOAD 5\l|20: AALOAD \l|21: ASTORE 6\l|22: // label\l|23: // line number information\l|24: IINC 2 1\l|25: // label\l|26: // line number information\l|27: IINC 5 1\l|28: GOTO 13\l}"]
+ 29 [shape=record,label="29|{29: // label\l|30: // line number information\l|31: // stack frame map\l|32: ILOAD 2\l|33: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 13 [label=""]
+ 13 -> 18 [label=""]
+ 29 -> -2 [label=""]
+ 18 -> 13 [label="T"]
+ 13 -> 29 [label="T"]
+ 13 -> 29 [style=dotted]
+ 0 -> 13 [style=dotted]
+ 13 -> 18 [style=dotted]
+ 29 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/forEachArrayMethod.dt.dot b/test-output/forEachArrayMethod.dt.dot
new file mode 100644
index 0000000..58c6ee5
--- /dev/null
+++ b/test-output/forEachArrayMethod.dt.dot
@@ -0,0 +1,14 @@
+digraph dominatorTree {
+ label="forEachArrayMethod"
+ "D(-1)" [style=filled]
+ "D(13)"
+ "D(29)"
+ "D(0)"
+ "D(18)"
+ "D(-2)"
+ "D(13)" -> "D(29)"
+ "D(0)" -> "D(13)"
+ "D(13)" -> "D(18)"
+ "D(29)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/forEachCollectionMethod.asm.txt b/test-output/forEachCollectionMethod.asm.txt
new file mode 100644
index 0000000..ac1f8b8
--- /dev/null
+++ b/test-output/forEachCollectionMethod.asm.txt
@@ -0,0 +1,30 @@
+ Method: forEachCollectionMethod(Ljava/util/Set;)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ALOAD 1
+ 7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;
+ 8: ASTORE 3
+ 9: // label
+ 10: // stack frame map
+ 11: ALOAD 3
+ 12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z
+ 13: IFEQ 24
+ 14: ALOAD 3
+ 15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;
+ 16: CHECKCAST java/lang/String
+ 17: ASTORE 4
+ 18: // label
+ 19: // line number information
+ 20: IINC 2 1
+ 21: // label
+ 22: // line number information
+ 23: GOTO 9
+ 24: // label
+ 25: // line number information
+ 26: // stack frame map
+ 27: ILOAD 2
+ 28: IRETURN
diff --git a/test-output/forEachCollectionMethod.cfg.dot b/test-output/forEachCollectionMethod.cfg.dot
new file mode 100644
index 0000000..7c47b46
--- /dev/null
+++ b/test-output/forEachCollectionMethod.cfg.dot
@@ -0,0 +1,17 @@
+digraph forEachCollectionMethod {
+
+ node [shape=record]
+ "forEachCollectionMethodbb-1" [shape=circle,label="e",xlabel="forEachCollectionMethod"]
+ "forEachCollectionMethodbb-2" [shape=circle,label="x"]
+ "forEachCollectionMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ALOAD 1|7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;|8: ASTORE 3}"]
+ "forEachCollectionMethodbb9" [label="9|{9: // label|10: // stack frame map|11: ALOAD 3|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z|13: IFEQ 24}"]
+ "forEachCollectionMethodbb14" [label="14|{14: ALOAD 3|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;|16: CHECKCAST java/lang/String|17: ASTORE 4|18: // label|19: // line number information|20: IINC 2 1|21: // label|22: // line number information|23: GOTO 9}"]
+ "forEachCollectionMethodbb24" [label="24|{24: // label|25: // line number information|26: // stack frame map|27: ILOAD 2|28: IRETURN }"]
+
+ "forEachCollectionMethodbb-1" -> "forEachCollectionMethodbb0"
+ "forEachCollectionMethodbb0" -> "forEachCollectionMethodbb9"
+ "forEachCollectionMethodbb9" -> "forEachCollectionMethodbb14"
+ "forEachCollectionMethodbb24" -> "forEachCollectionMethodbb-2"
+ "forEachCollectionMethodbb14" -> "forEachCollectionMethodbb9" [label="T"]
+ "forEachCollectionMethodbb9" -> "forEachCollectionMethodbb24" [label="T"]
+}
diff --git a/test-output/forEachCollectionMethod.combined.dot b/test-output/forEachCollectionMethod.combined.dot
new file mode 100644
index 0000000..6ce8a4b
--- /dev/null
+++ b/test-output/forEachCollectionMethod.combined.dot
@@ -0,0 +1,20 @@
+digraph combined {
+ label="forEachCollectionMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ALOAD 1\l|7: INVOKEINTERFACE java/util/Set.iterator ()Ljava/util/Iterator;\l|8: ASTORE 3\l}"]
+ 9 [shape=record,label="9|{9: // label\l|10: // stack frame map\l|11: ALOAD 3\l|12: INVOKEINTERFACE java/util/Iterator.hasNext ()Z\l|13: IFEQ 24\l}"]
+ 14 [shape=record,label="14|{14: ALOAD 3\l|15: INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;\l|16: CHECKCAST java/lang/String\l|17: ASTORE 4\l|18: // label\l|19: // line number information\l|20: IINC 2 1\l|21: // label\l|22: // line number information\l|23: GOTO 9\l}"]
+ 24 [shape=record,label="24|{24: // label\l|25: // line number information\l|26: // stack frame map\l|27: ILOAD 2\l|28: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 9 [label=""]
+ 9 -> 14 [label=""]
+ 24 -> -2 [label=""]
+ 14 -> 9 [label="T"]
+ 9 -> 24 [label="T"]
+ 9 -> 14 [style=dotted]
+ 0 -> 9 [style=dotted]
+ 24 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+ 9 -> 24 [style=dotted]
+}
diff --git a/test-output/forEachCollectionMethod.dt.dot b/test-output/forEachCollectionMethod.dt.dot
new file mode 100644
index 0000000..89676a2
--- /dev/null
+++ b/test-output/forEachCollectionMethod.dt.dot
@@ -0,0 +1,14 @@
+digraph dominatorTree {
+ label="forEachCollectionMethod"
+ "D(-1)" [style=filled]
+ "D(9)"
+ "D(14)"
+ "D(0)"
+ "D(24)"
+ "D(-2)"
+ "D(9)" -> "D(14)"
+ "D(0)" -> "D(9)"
+ "D(24)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(9)" -> "D(24)"
+}
diff --git a/test-output/forEver.asm.txt b/test-output/forEver.asm.txt
new file mode 100644
index 0000000..f73c00e
--- /dev/null
+++ b/test-output/forEver.asm.txt
@@ -0,0 +1,9 @@
+ Method: forEver(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // stack frame map
+ 6: IINC 2 1
+ 7: GOTO 4
diff --git a/test-output/forEver.cfg.dot b/test-output/forEver.cfg.dot
new file mode 100644
index 0000000..03a00c4
--- /dev/null
+++ b/test-output/forEver.cfg.dot
@@ -0,0 +1,12 @@
+digraph forEver {
+
+ node [shape=record]
+ "forEverbb-1" [shape=circle,label="e",xlabel="forEver"]
+ "forEverbb-2" [shape=circle,label="e",xlabel="forEver"]
+ "forEverbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"]
+ "forEverbb4" [label="4|{4: // label|5: // stack frame map|6: IINC 2 1|7: GOTO 4}"]
+
+ "forEverbb-1" -> "forEverbb0"
+ "forEverbb0" -> "forEverbb4"
+ "forEverbb4" -> "forEverbb4" [label="T"]
+}
diff --git a/test-output/forEver.combined.dot b/test-output/forEver.combined.dot
new file mode 100644
index 0000000..0213236
--- /dev/null
+++ b/test-output/forEver.combined.dot
@@ -0,0 +1,12 @@
+digraph combined {
+ label="forEver"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}"]
+ 4 [shape=record,label="4|{4: // label\l|5: // stack frame map\l|6: IINC 2 1\l|7: GOTO 4\l}"]
+ -1 -> 0 [label=""]
+ 0 -> 4 [label=""]
+ 4 -> 4 [label="T"]
+ 0 -> 4 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/forEver.dt.dot b/test-output/forEver.dt.dot
new file mode 100644
index 0000000..f80b1dd
--- /dev/null
+++ b/test-output/forEver.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="forEver"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(4)"
+ "D(0)" -> "D(4)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/forMethod.asm.txt b/test-output/forMethod.asm.txt
new file mode 100644
index 0000000..e9962ff
--- /dev/null
+++ b/test-output/forMethod.asm.txt
@@ -0,0 +1,29 @@
+ Method: forMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ICONST_0
+ 7: ISTORE 3
+ 8: // label
+ 9: // stack frame map
+ 10: ILOAD 3
+ 11: ILOAD 1
+ 12: IF_ICMPGE 23
+ 13: // label
+ 14: // line number information
+ 15: ILOAD 2
+ 16: ILOAD 3
+ 17: IADD
+ 18: ISTORE 2
+ 19: // label
+ 20: // line number information
+ 21: IINC 1 1
+ 22: GOTO 8
+ 23: // label
+ 24: // line number information
+ 25: // stack frame map
+ 26: ILOAD 2
+ 27: IRETURN
diff --git a/test-output/forMethod.cfg.dot b/test-output/forMethod.cfg.dot
new file mode 100644
index 0000000..e297cc2
--- /dev/null
+++ b/test-output/forMethod.cfg.dot
@@ -0,0 +1,17 @@
+digraph forMethod {
+
+ node [shape=record]
+ "forMethodbb-1" [shape=circle,label="e",xlabel="forMethod"]
+ "forMethodbb-2" [shape=circle,label="x"]
+ "forMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"]
+ "forMethodbb8" [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 23}"]
+ "forMethodbb13" [label="13|{13: // label|14: // line number information|15: ILOAD 2|16: ILOAD 3|17: IADD |18: ISTORE 2|19: // label|20: // line number information|21: IINC 1 1|22: GOTO 8}"]
+ "forMethodbb23" [label="23|{23: // label|24: // line number information|25: // stack frame map|26: ILOAD 2|27: IRETURN }"]
+
+ "forMethodbb-1" -> "forMethodbb0"
+ "forMethodbb0" -> "forMethodbb8"
+ "forMethodbb8" -> "forMethodbb13"
+ "forMethodbb23" -> "forMethodbb-2"
+ "forMethodbb13" -> "forMethodbb8" [label="T"]
+ "forMethodbb8" -> "forMethodbb23" [label="T"]
+}
diff --git a/test-output/forMethod.combined.dot b/test-output/forMethod.combined.dot
new file mode 100644
index 0000000..5956aed
--- /dev/null
+++ b/test-output/forMethod.combined.dot
@@ -0,0 +1,20 @@
+digraph combined {
+ label="forMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ICONST_0 \l|7: ISTORE 3\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 23\l}"]
+ 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: ILOAD 2\l|16: ILOAD 3\l|17: IADD \l|18: ISTORE 2\l|19: // label\l|20: // line number information\l|21: IINC 1 1\l|22: GOTO 8\l}"]
+ 23 [shape=record,label="23|{23: // label\l|24: // line number information\l|25: // stack frame map\l|26: ILOAD 2\l|27: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 8 [label=""]
+ 8 -> 13 [label=""]
+ 23 -> -2 [label=""]
+ 13 -> 8 [label="T"]
+ 8 -> 23 [label="T"]
+ 0 -> 8 [style=dotted]
+ 23 -> -2 [style=dotted]
+ 8 -> 23 [style=dotted]
+ -1 -> 0 [style=dotted]
+ 8 -> 13 [style=dotted]
+}
diff --git a/test-output/forMethod.dt.dot b/test-output/forMethod.dt.dot
new file mode 100644
index 0000000..b837ce0
--- /dev/null
+++ b/test-output/forMethod.dt.dot
@@ -0,0 +1,14 @@
+digraph dominatorTree {
+ label="forMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(8)"
+ "D(23)"
+ "D(-2)"
+ "D(13)"
+ "D(0)" -> "D(8)"
+ "D(23)" -> "D(-2)"
+ "D(8)" -> "D(23)"
+ "D(-1)" -> "D(0)"
+ "D(8)" -> "D(13)"
+}
diff --git a/test-output/forWithBreakMethod.asm.txt b/test-output/forWithBreakMethod.asm.txt
new file mode 100644
index 0000000..9ed276b
--- /dev/null
+++ b/test-output/forWithBreakMethod.asm.txt
@@ -0,0 +1,38 @@
+ Method: forWithBreakMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ICONST_0
+ 7: ISTORE 3
+ 8: // label
+ 9: // stack frame map
+ 10: ILOAD 3
+ 11: ILOAD 1
+ 12: IF_ICMPGE 32
+ 13: // label
+ 14: // line number information
+ 15: ILOAD 3
+ 16: BIPUSH 10
+ 17: IF_ICMPNE 21
+ 18: // label
+ 19: // line number information
+ 20: GOTO 32
+ 21: // label
+ 22: // line number information
+ 23: // stack frame map
+ 24: ILOAD 2
+ 25: ILOAD 3
+ 26: IADD
+ 27: ISTORE 2
+ 28: // label
+ 29: // line number information
+ 30: IINC 3 1
+ 31: GOTO 8
+ 32: // label
+ 33: // line number information
+ 34: // stack frame map
+ 35: ILOAD 2
+ 36: IRETURN
diff --git a/test-output/forWithBreakMethod.cfg.dot b/test-output/forWithBreakMethod.cfg.dot
new file mode 100644
index 0000000..c67a277
--- /dev/null
+++ b/test-output/forWithBreakMethod.cfg.dot
@@ -0,0 +1,22 @@
+digraph forWithBreakMethod {
+
+ node [shape=record]
+ "forWithBreakMethodbb-1" [shape=circle,label="e",xlabel="forWithBreakMethod"]
+ "forWithBreakMethodbb-2" [shape=circle,label="x"]
+ "forWithBreakMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"]
+ "forWithBreakMethodbb8" [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 32}"]
+ "forWithBreakMethodbb13" [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"]
+ "forWithBreakMethodbb18" [label="18|{18: // label|19: // line number information|20: GOTO 32}"]
+ "forWithBreakMethodbb21" [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2|28: // label|29: // line number information|30: IINC 3 1|31: GOTO 8}"]
+ "forWithBreakMethodbb32" [label="32|{32: // label|33: // line number information|34: // stack frame map|35: ILOAD 2|36: IRETURN }"]
+
+ "forWithBreakMethodbb-1" -> "forWithBreakMethodbb0"
+ "forWithBreakMethodbb0" -> "forWithBreakMethodbb8"
+ "forWithBreakMethodbb8" -> "forWithBreakMethodbb13"
+ "forWithBreakMethodbb13" -> "forWithBreakMethodbb18"
+ "forWithBreakMethodbb32" -> "forWithBreakMethodbb-2"
+ "forWithBreakMethodbb21" -> "forWithBreakMethodbb8" [label="T"]
+ "forWithBreakMethodbb13" -> "forWithBreakMethodbb21" [label="T"]
+ "forWithBreakMethodbb8" -> "forWithBreakMethodbb32" [label="T"]
+ "forWithBreakMethodbb18" -> "forWithBreakMethodbb32" [label="T"]
+}
diff --git a/test-output/forWithBreakMethod.combined.dot b/test-output/forWithBreakMethod.combined.dot
new file mode 100644
index 0000000..01559c2
--- /dev/null
+++ b/test-output/forWithBreakMethod.combined.dot
@@ -0,0 +1,27 @@
+digraph combined {
+ label="forWithBreakMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ICONST_0 \l|7: ISTORE 3\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 32\l}"]
+ 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: ILOAD 3\l|16: BIPUSH 10\l|17: IF_ICMPNE 21\l}"]
+ 18 [shape=record,label="18|{18: // label\l|19: // line number information\l|20: GOTO 32\l}"]
+ 21 [shape=record,label="21|{21: // label\l|22: // line number information\l|23: // stack frame map\l|24: ILOAD 2\l|25: ILOAD 3\l|26: IADD \l|27: ISTORE 2\l|28: // label\l|29: // line number information\l|30: IINC 3 1\l|31: GOTO 8\l}"]
+ 32 [shape=record,label="32|{32: // label\l|33: // line number information\l|34: // stack frame map\l|35: ILOAD 2\l|36: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 8 [label=""]
+ 8 -> 13 [label=""]
+ 13 -> 18 [label=""]
+ 32 -> -2 [label=""]
+ 21 -> 8 [label="T"]
+ 13 -> 21 [label="T"]
+ 8 -> 32 [label="T"]
+ 18 -> 32 [label="T"]
+ -1 -> 0 [style=dotted]
+ 32 -> -2 [style=dotted]
+ 13 -> 21 [style=dotted]
+ 13 -> 18 [style=dotted]
+ 8 -> 32 [style=dotted]
+ 8 -> 13 [style=dotted]
+ 0 -> 8 [style=dotted]
+}
diff --git a/test-output/forWithBreakMethod.dt.dot b/test-output/forWithBreakMethod.dt.dot
new file mode 100644
index 0000000..e9b0456
--- /dev/null
+++ b/test-output/forWithBreakMethod.dt.dot
@@ -0,0 +1,18 @@
+digraph dominatorTree {
+ label="forWithBreakMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(32)"
+ "D(-2)"
+ "D(13)"
+ "D(21)"
+ "D(18)"
+ "D(8)"
+ "D(-1)" -> "D(0)"
+ "D(32)" -> "D(-2)"
+ "D(13)" -> "D(21)"
+ "D(13)" -> "D(18)"
+ "D(8)" -> "D(32)"
+ "D(8)" -> "D(13)"
+ "D(0)" -> "D(8)"
+}
diff --git a/test-output/forWithContinueMethod.asm.txt b/test-output/forWithContinueMethod.asm.txt
new file mode 100644
index 0000000..68ff61a
--- /dev/null
+++ b/test-output/forWithContinueMethod.asm.txt
@@ -0,0 +1,39 @@
+ Method: forWithContinueMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ICONST_0
+ 7: ISTORE 3
+ 8: // label
+ 9: // stack frame map
+ 10: ILOAD 3
+ 11: ILOAD 1
+ 12: IF_ICMPGE 33
+ 13: // label
+ 14: // line number information
+ 15: ILOAD 3
+ 16: BIPUSH 10
+ 17: IF_ICMPNE 21
+ 18: // label
+ 19: // line number information
+ 20: GOTO 28
+ 21: // label
+ 22: // line number information
+ 23: // stack frame map
+ 24: ILOAD 2
+ 25: ILOAD 3
+ 26: IADD
+ 27: ISTORE 2
+ 28: // label
+ 29: // line number information
+ 30: // stack frame map
+ 31: IINC 3 1
+ 32: GOTO 8
+ 33: // label
+ 34: // line number information
+ 35: // stack frame map
+ 36: ILOAD 2
+ 37: IRETURN
diff --git a/test-output/forWithContinueMethod.cfg.dot b/test-output/forWithContinueMethod.cfg.dot
new file mode 100644
index 0000000..5ceda39
--- /dev/null
+++ b/test-output/forWithContinueMethod.cfg.dot
@@ -0,0 +1,24 @@
+digraph forWithContinueMethod {
+
+ node [shape=record]
+ "forWithContinueMethodbb-1" [shape=circle,label="e",xlabel="forWithContinueMethod"]
+ "forWithContinueMethodbb-2" [shape=circle,label="x"]
+ "forWithContinueMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"]
+ "forWithContinueMethodbb8" [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 33}"]
+ "forWithContinueMethodbb13" [label="13|{13: // label|14: // line number information|15: ILOAD 3|16: BIPUSH 10|17: IF_ICMPNE 21}"]
+ "forWithContinueMethodbb18" [label="18|{18: // label|19: // line number information|20: GOTO 28}"]
+ "forWithContinueMethodbb21" [label="21|{21: // label|22: // line number information|23: // stack frame map|24: ILOAD 2|25: ILOAD 3|26: IADD |27: ISTORE 2}"]
+ "forWithContinueMethodbb28" [label="28|{28: // label|29: // line number information|30: // stack frame map|31: IINC 3 1|32: GOTO 8}"]
+ "forWithContinueMethodbb33" [label="33|{33: // label|34: // line number information|35: // stack frame map|36: ILOAD 2|37: IRETURN }"]
+
+ "forWithContinueMethodbb-1" -> "forWithContinueMethodbb0"
+ "forWithContinueMethodbb0" -> "forWithContinueMethodbb8"
+ "forWithContinueMethodbb8" -> "forWithContinueMethodbb13"
+ "forWithContinueMethodbb13" -> "forWithContinueMethodbb18"
+ "forWithContinueMethodbb21" -> "forWithContinueMethodbb28"
+ "forWithContinueMethodbb33" -> "forWithContinueMethodbb-2"
+ "forWithContinueMethodbb28" -> "forWithContinueMethodbb8" [label="T"]
+ "forWithContinueMethodbb13" -> "forWithContinueMethodbb21" [label="T"]
+ "forWithContinueMethodbb18" -> "forWithContinueMethodbb28" [label="T"]
+ "forWithContinueMethodbb8" -> "forWithContinueMethodbb33" [label="T"]
+}
diff --git a/test-output/forWithContinueMethod.combined.dot b/test-output/forWithContinueMethod.combined.dot
new file mode 100644
index 0000000..9590439
--- /dev/null
+++ b/test-output/forWithContinueMethod.combined.dot
@@ -0,0 +1,30 @@
+digraph combined {
+ label="forWithContinueMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ICONST_0 \l|7: ISTORE 3\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 33\l}"]
+ 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: ILOAD 3\l|16: BIPUSH 10\l|17: IF_ICMPNE 21\l}"]
+ 18 [shape=record,label="18|{18: // label\l|19: // line number information\l|20: GOTO 28\l}"]
+ 21 [shape=record,label="21|{21: // label\l|22: // line number information\l|23: // stack frame map\l|24: ILOAD 2\l|25: ILOAD 3\l|26: IADD \l|27: ISTORE 2\l}"]
+ 28 [shape=record,label="28|{28: // label\l|29: // line number information\l|30: // stack frame map\l|31: IINC 3 1\l|32: GOTO 8\l}"]
+ 33 [shape=record,label="33|{33: // label\l|34: // line number information\l|35: // stack frame map\l|36: ILOAD 2\l|37: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 8 [label=""]
+ 8 -> 13 [label=""]
+ 13 -> 18 [label=""]
+ 21 -> 28 [label=""]
+ 33 -> -2 [label=""]
+ 28 -> 8 [label="T"]
+ 13 -> 21 [label="T"]
+ 18 -> 28 [label="T"]
+ 8 -> 33 [label="T"]
+ 33 -> -2 [style=dotted]
+ 8 -> 33 [style=dotted]
+ 13 -> 21 [style=dotted]
+ -1 -> 0 [style=dotted]
+ 0 -> 8 [style=dotted]
+ 13 -> 18 [style=dotted]
+ 13 -> 28 [style=dotted]
+ 8 -> 13 [style=dotted]
+}
diff --git a/test-output/forWithContinueMethod.dt.dot b/test-output/forWithContinueMethod.dt.dot
new file mode 100644
index 0000000..42f402e
--- /dev/null
+++ b/test-output/forWithContinueMethod.dt.dot
@@ -0,0 +1,20 @@
+digraph dominatorTree {
+ label="forWithContinueMethod"
+ "D(-1)" [style=filled]
+ "D(33)"
+ "D(-2)"
+ "D(8)"
+ "D(13)"
+ "D(21)"
+ "D(0)"
+ "D(18)"
+ "D(28)"
+ "D(33)" -> "D(-2)"
+ "D(8)" -> "D(33)"
+ "D(13)" -> "D(21)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(8)"
+ "D(13)" -> "D(18)"
+ "D(13)" -> "D(28)"
+ "D(8)" -> "D(13)"
+}
diff --git a/test-output/ifElseMethod.asm.txt b/test-output/ifElseMethod.asm.txt
new file mode 100644
index 0000000..05d205b
--- /dev/null
+++ b/test-output/ifElseMethod.asm.txt
@@ -0,0 +1,24 @@
+ Method: ifElseMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ILOAD 1
+ 7: IFLE 13
+ 8: // label
+ 9: // line number information
+ 10: ICONST_0
+ 11: ISTORE 2
+ 12: GOTO 18
+ 13: // label
+ 14: // line number information
+ 15: // stack frame map
+ 16: ILOAD 1
+ 17: ISTORE 2
+ 18: // label
+ 19: // line number information
+ 20: // stack frame map
+ 21: ILOAD 2
+ 22: IRETURN
diff --git a/test-output/ifElseMethod.cfg.dot b/test-output/ifElseMethod.cfg.dot
new file mode 100644
index 0000000..190e71c
--- /dev/null
+++ b/test-output/ifElseMethod.cfg.dot
@@ -0,0 +1,17 @@
+digraph ifElseMethod {
+
+ node [shape=record]
+ "ifElseMethodbb-1" [shape=circle,label="e",xlabel="ifElseMethod"]
+ "ifElseMethodbb-2" [shape=circle,label="x"]
+ "ifElseMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: IFLE 13}"]
+ "ifElseMethodbb8" [label="8|{8: // label|9: // line number information|10: ICONST_0 |11: ISTORE 2|12: GOTO 18}"]
+ "ifElseMethodbb13" [label="13|{13: // label|14: // line number information|15: // stack frame map|16: ILOAD 1|17: ISTORE 2}"]
+ "ifElseMethodbb18" [label="18|{18: // label|19: // line number information|20: // stack frame map|21: ILOAD 2|22: IRETURN }"]
+
+ "ifElseMethodbb-1" -> "ifElseMethodbb0"
+ "ifElseMethodbb0" -> "ifElseMethodbb8"
+ "ifElseMethodbb13" -> "ifElseMethodbb18"
+ "ifElseMethodbb18" -> "ifElseMethodbb-2"
+ "ifElseMethodbb0" -> "ifElseMethodbb13" [label="T"]
+ "ifElseMethodbb8" -> "ifElseMethodbb18" [label="T"]
+}
diff --git a/test-output/ifElseMethod.combined.dot b/test-output/ifElseMethod.combined.dot
new file mode 100644
index 0000000..19148cb
--- /dev/null
+++ b/test-output/ifElseMethod.combined.dot
@@ -0,0 +1,20 @@
+digraph combined {
+ label="ifElseMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ILOAD 1\l|7: IFLE 13\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: ICONST_0 \l|11: ISTORE 2\l|12: GOTO 18\l}"]
+ 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: // stack frame map\l|16: ILOAD 1\l|17: ISTORE 2\l}"]
+ 18 [shape=record,label="18|{18: // label\l|19: // line number information\l|20: // stack frame map\l|21: ILOAD 2\l|22: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 8 [label=""]
+ 13 -> 18 [label=""]
+ 18 -> -2 [label=""]
+ 0 -> 13 [label="T"]
+ 8 -> 18 [label="T"]
+ -1 -> 0 [style=dotted]
+ 0 -> 13 [style=dotted]
+ 18 -> -2 [style=dotted]
+ 0 -> 8 [style=dotted]
+ 0 -> 18 [style=dotted]
+}
diff --git a/test-output/ifElseMethod.dt.dot b/test-output/ifElseMethod.dt.dot
new file mode 100644
index 0000000..a5f5c55
--- /dev/null
+++ b/test-output/ifElseMethod.dt.dot
@@ -0,0 +1,14 @@
+digraph dominatorTree {
+ label="ifElseMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(13)"
+ "D(18)"
+ "D(-2)"
+ "D(8)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(13)"
+ "D(18)" -> "D(-2)"
+ "D(0)" -> "D(8)"
+ "D(0)" -> "D(18)"
+}
diff --git a/test-output/ifMethod.asm.txt b/test-output/ifMethod.asm.txt
new file mode 100644
index 0000000..90e7767
--- /dev/null
+++ b/test-output/ifMethod.asm.txt
@@ -0,0 +1,18 @@
+ Method: ifMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ILOAD 1
+ 7: IFGE 12
+ 8: // label
+ 9: // line number information
+ 10: ICONST_1
+ 11: ISTORE 2
+ 12: // label
+ 13: // line number information
+ 14: // stack frame map
+ 15: ILOAD 2
+ 16: IRETURN
diff --git a/test-output/ifMethod.cfg.dot b/test-output/ifMethod.cfg.dot
new file mode 100644
index 0000000..66ac008
--- /dev/null
+++ b/test-output/ifMethod.cfg.dot
@@ -0,0 +1,15 @@
+digraph ifMethod {
+
+ node [shape=record]
+ "ifMethodbb-1" [shape=circle,label="e",xlabel="ifMethod"]
+ "ifMethodbb-2" [shape=circle,label="x"]
+ "ifMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: IFGE 12}"]
+ "ifMethodbb8" [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: ISTORE 2}"]
+ "ifMethodbb12" [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ILOAD 2|16: IRETURN }"]
+
+ "ifMethodbb-1" -> "ifMethodbb0"
+ "ifMethodbb0" -> "ifMethodbb8"
+ "ifMethodbb8" -> "ifMethodbb12"
+ "ifMethodbb12" -> "ifMethodbb-2"
+ "ifMethodbb0" -> "ifMethodbb12" [label="T"]
+}
diff --git a/test-output/ifMethod.combined.dot b/test-output/ifMethod.combined.dot
new file mode 100644
index 0000000..3580dfc
--- /dev/null
+++ b/test-output/ifMethod.combined.dot
@@ -0,0 +1,17 @@
+digraph combined {
+ label="ifMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ILOAD 1\l|7: IFGE 12\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: ICONST_1 \l|11: ISTORE 2\l}"]
+ 12 [shape=record,label="12|{12: // label\l|13: // line number information\l|14: // stack frame map\l|15: ILOAD 2\l|16: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 8 [label=""]
+ 8 -> 12 [label=""]
+ 12 -> -2 [label=""]
+ 0 -> 12 [label="T"]
+ 0 -> 8 [style=dotted]
+ 12 -> -2 [style=dotted]
+ 0 -> 12 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/ifMethod.dt.dot b/test-output/ifMethod.dt.dot
new file mode 100644
index 0000000..db902b6
--- /dev/null
+++ b/test-output/ifMethod.dt.dot
@@ -0,0 +1,12 @@
+digraph dominatorTree {
+ label="ifMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(8)"
+ "D(12)"
+ "D(-2)"
+ "D(0)" -> "D(8)"
+ "D(12)" -> "D(-2)"
+ "D(0)" -> "D(12)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/instanceCallMethod.asm.txt b/test-output/instanceCallMethod.asm.txt
new file mode 100644
index 0000000..2afff13
--- /dev/null
+++ b/test-output/instanceCallMethod.asm.txt
@@ -0,0 +1,9 @@
+ Method: instanceCallMethod(LExampleClass;)I
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 1
+ 3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V
+ 4: // label
+ 5: // line number information
+ 6: ICONST_2
+ 7: IRETURN
diff --git a/test-output/instanceCallMethod.cfg.dot b/test-output/instanceCallMethod.cfg.dot
new file mode 100644
index 0000000..840b3a1
--- /dev/null
+++ b/test-output/instanceCallMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph instanceCallMethod {
+
+ node [shape=record]
+ "instanceCallMethodbb-1" [shape=circle,label="e",xlabel="instanceCallMethod"]
+ "instanceCallMethodbb-2" [shape=circle,label="x"]
+ "instanceCallMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"]
+
+ "instanceCallMethodbb-1" -> "instanceCallMethodbb0"
+ "instanceCallMethodbb0" -> "instanceCallMethodbb-2"
+}
diff --git a/test-output/instanceCallMethod.combined.dot b/test-output/instanceCallMethod.combined.dot
new file mode 100644
index 0000000..4dc9d84
--- /dev/null
+++ b/test-output/instanceCallMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="instanceCallMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKEVIRTUAL ExampleClass.instanceCallTarget ()V\l|4: // label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/instanceCallMethod.dt.dot b/test-output/instanceCallMethod.dt.dot
new file mode 100644
index 0000000..537687c
--- /dev/null
+++ b/test-output/instanceCallMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="instanceCallMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/instanceCallTarget.asm.txt b/test-output/instanceCallTarget.asm.txt
new file mode 100644
index 0000000..56a689f
--- /dev/null
+++ b/test-output/instanceCallTarget.asm.txt
@@ -0,0 +1,4 @@
+ Method: instanceCallTarget()V
+ 0: // label
+ 1: // line number information
+ 2: RETURN
diff --git a/test-output/instanceCallTarget.cfg.dot b/test-output/instanceCallTarget.cfg.dot
new file mode 100644
index 0000000..29ade3a
--- /dev/null
+++ b/test-output/instanceCallTarget.cfg.dot
@@ -0,0 +1,10 @@
+digraph instanceCallTarget {
+
+ node [shape=record]
+ "instanceCallTargetbb-1" [shape=circle,label="e",xlabel="instanceCallTarget"]
+ "instanceCallTargetbb-2" [shape=circle,label="x"]
+ "instanceCallTargetbb0" [label="0|{0: // label|1: // line number information|2: RETURN }"]
+
+ "instanceCallTargetbb-1" -> "instanceCallTargetbb0"
+ "instanceCallTargetbb0" -> "instanceCallTargetbb-2"
+}
diff --git a/test-output/instanceCallTarget.combined.dot b/test-output/instanceCallTarget.combined.dot
new file mode 100644
index 0000000..534cc5a
--- /dev/null
+++ b/test-output/instanceCallTarget.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="instanceCallTarget"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/instanceCallTarget.dt.dot b/test-output/instanceCallTarget.dt.dot
new file mode 100644
index 0000000..6e5ad7a
--- /dev/null
+++ b/test-output/instanceCallTarget.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="instanceCallTarget"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/interfaceCallMethod.asm.txt b/test-output/interfaceCallMethod.asm.txt
new file mode 100644
index 0000000..92924cc
--- /dev/null
+++ b/test-output/interfaceCallMethod.asm.txt
@@ -0,0 +1,9 @@
+ Method: interfaceCallMethod(LExampleClass$Interface;)I
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 1
+ 3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V
+ 4: // label
+ 5: // line number information
+ 6: ICONST_2
+ 7: IRETURN
diff --git a/test-output/interfaceCallMethod.cfg.dot b/test-output/interfaceCallMethod.cfg.dot
new file mode 100644
index 0000000..b488799
--- /dev/null
+++ b/test-output/interfaceCallMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph interfaceCallMethod {
+
+ node [shape=record]
+ "interfaceCallMethodbb-1" [shape=circle,label="e",xlabel="interfaceCallMethod"]
+ "interfaceCallMethodbb-2" [shape=circle,label="x"]
+ "interfaceCallMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"]
+
+ "interfaceCallMethodbb-1" -> "interfaceCallMethodbb0"
+ "interfaceCallMethodbb0" -> "interfaceCallMethodbb-2"
+}
diff --git a/test-output/interfaceCallMethod.combined.dot b/test-output/interfaceCallMethod.combined.dot
new file mode 100644
index 0000000..885ff1a
--- /dev/null
+++ b/test-output/interfaceCallMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="interfaceCallMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKEINTERFACE ExampleClass$Interface.interfaceCallTarget ()V\l|4: // label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/interfaceCallMethod.dt.dot b/test-output/interfaceCallMethod.dt.dot
new file mode 100644
index 0000000..90a132e
--- /dev/null
+++ b/test-output/interfaceCallMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="interfaceCallMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/nestedFor.asm.txt b/test-output/nestedFor.asm.txt
new file mode 100644
index 0000000..5ecdb14
--- /dev/null
+++ b/test-output/nestedFor.asm.txt
@@ -0,0 +1,43 @@
+ Method: nestedFor(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ICONST_0
+ 7: ISTORE 3
+ 8: // label
+ 9: // stack frame map
+ 10: ILOAD 3
+ 11: ILOAD 1
+ 12: IF_ICMPGE 37
+ 13: // label
+ 14: // line number information
+ 15: ICONST_0
+ 16: ISTORE 4
+ 17: // label
+ 18: // stack frame map
+ 19: ILOAD 4
+ 20: ILOAD 3
+ 21: IF_ICMPGE 32
+ 22: // label
+ 23: // line number information
+ 24: ILOAD 2
+ 25: ILOAD 4
+ 26: IADD
+ 27: ISTORE 2
+ 28: // label
+ 29: // line number information
+ 30: IINC 4 1
+ 31: GOTO 17
+ 32: // label
+ 33: // line number information
+ 34: // stack frame map
+ 35: IINC 3 1
+ 36: GOTO 8
+ 37: // label
+ 38: // line number information
+ 39: // stack frame map
+ 40: ILOAD 2
+ 41: IRETURN
diff --git a/test-output/nestedFor.cfg.dot b/test-output/nestedFor.cfg.dot
new file mode 100644
index 0000000..7c70285
--- /dev/null
+++ b/test-output/nestedFor.cfg.dot
@@ -0,0 +1,24 @@
+digraph nestedFor {
+
+ node [shape=record]
+ "nestedForbb-1" [shape=circle,label="e",xlabel="nestedFor"]
+ "nestedForbb-2" [shape=circle,label="x"]
+ "nestedForbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ICONST_0 |7: ISTORE 3}"]
+ "nestedForbb8" [label="8|{8: // label|9: // stack frame map|10: ILOAD 3|11: ILOAD 1|12: IF_ICMPGE 37}"]
+ "nestedForbb13" [label="13|{13: // label|14: // line number information|15: ICONST_0 |16: ISTORE 4}"]
+ "nestedForbb17" [label="17|{17: // label|18: // stack frame map|19: ILOAD 4|20: ILOAD 3|21: IF_ICMPGE 32}"]
+ "nestedForbb22" [label="22|{22: // label|23: // line number information|24: ILOAD 2|25: ILOAD 4|26: IADD |27: ISTORE 2|28: // label|29: // line number information|30: IINC 4 1|31: GOTO 17}"]
+ "nestedForbb32" [label="32|{32: // label|33: // line number information|34: // stack frame map|35: IINC 3 1|36: GOTO 8}"]
+ "nestedForbb37" [label="37|{37: // label|38: // line number information|39: // stack frame map|40: ILOAD 2|41: IRETURN }"]
+
+ "nestedForbb-1" -> "nestedForbb0"
+ "nestedForbb0" -> "nestedForbb8"
+ "nestedForbb8" -> "nestedForbb13"
+ "nestedForbb13" -> "nestedForbb17"
+ "nestedForbb17" -> "nestedForbb22"
+ "nestedForbb37" -> "nestedForbb-2"
+ "nestedForbb32" -> "nestedForbb8" [label="T"]
+ "nestedForbb22" -> "nestedForbb17" [label="T"]
+ "nestedForbb17" -> "nestedForbb32" [label="T"]
+ "nestedForbb8" -> "nestedForbb37" [label="T"]
+}
diff --git a/test-output/nestedFor.combined.dot b/test-output/nestedFor.combined.dot
new file mode 100644
index 0000000..d92acff
--- /dev/null
+++ b/test-output/nestedFor.combined.dot
@@ -0,0 +1,30 @@
+digraph combined {
+ label="nestedFor"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ICONST_0 \l|7: ISTORE 3\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // stack frame map\l|10: ILOAD 3\l|11: ILOAD 1\l|12: IF_ICMPGE 37\l}"]
+ 13 [shape=record,label="13|{13: // label\l|14: // line number information\l|15: ICONST_0 \l|16: ISTORE 4\l}"]
+ 17 [shape=record,label="17|{17: // label\l|18: // stack frame map\l|19: ILOAD 4\l|20: ILOAD 3\l|21: IF_ICMPGE 32\l}"]
+ 22 [shape=record,label="22|{22: // label\l|23: // line number information\l|24: ILOAD 2\l|25: ILOAD 4\l|26: IADD \l|27: ISTORE 2\l|28: // label\l|29: // line number information\l|30: IINC 4 1\l|31: GOTO 17\l}"]
+ 32 [shape=record,label="32|{32: // label\l|33: // line number information\l|34: // stack frame map\l|35: IINC 3 1\l|36: GOTO 8\l}"]
+ 37 [shape=record,label="37|{37: // label\l|38: // line number information\l|39: // stack frame map\l|40: ILOAD 2\l|41: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 8 [label=""]
+ 8 -> 13 [label=""]
+ 13 -> 17 [label=""]
+ 17 -> 22 [label=""]
+ 37 -> -2 [label=""]
+ 32 -> 8 [label="T"]
+ 22 -> 17 [label="T"]
+ 17 -> 32 [label="T"]
+ 8 -> 37 [label="T"]
+ 17 -> 32 [style=dotted]
+ -1 -> 0 [style=dotted]
+ 8 -> 13 [style=dotted]
+ 0 -> 8 [style=dotted]
+ 8 -> 37 [style=dotted]
+ 37 -> -2 [style=dotted]
+ 13 -> 17 [style=dotted]
+ 17 -> 22 [style=dotted]
+}
diff --git a/test-output/nestedFor.dt.dot b/test-output/nestedFor.dt.dot
new file mode 100644
index 0000000..f1f02f5
--- /dev/null
+++ b/test-output/nestedFor.dt.dot
@@ -0,0 +1,20 @@
+digraph dominatorTree {
+ label="nestedFor"
+ "D(-1)" [style=filled]
+ "D(17)"
+ "D(32)"
+ "D(0)"
+ "D(8)"
+ "D(13)"
+ "D(37)"
+ "D(-2)"
+ "D(22)"
+ "D(17)" -> "D(32)"
+ "D(-1)" -> "D(0)"
+ "D(8)" -> "D(13)"
+ "D(0)" -> "D(8)"
+ "D(8)" -> "D(37)"
+ "D(37)" -> "D(-2)"
+ "D(13)" -> "D(17)"
+ "D(17)" -> "D(22)"
+}
diff --git a/test-output/nonShortCircuitMethod.asm.txt b/test-output/nonShortCircuitMethod.asm.txt
new file mode 100644
index 0000000..a029161
--- /dev/null
+++ b/test-output/nonShortCircuitMethod.asm.txt
@@ -0,0 +1,34 @@
+ Method: nonShortCircuitMethod(III)I
+ 0: // label
+ 1: // line number information
+ 2: ILOAD 1
+ 3: ILOAD 2
+ 4: IF_ICMPLE 7
+ 5: ICONST_1
+ 6: GOTO 10
+ 7: // label
+ 8: // stack frame map
+ 9: ICONST_0
+ 10: // label
+ 11: // stack frame map
+ 12: ILOAD 1
+ 13: ILOAD 3
+ 14: IF_ICMPGE 17
+ 15: ICONST_1
+ 16: GOTO 20
+ 17: // label
+ 18: // stack frame map
+ 19: ICONST_0
+ 20: // label
+ 21: // stack frame map
+ 22: IAND
+ 23: IFEQ 28
+ 24: // label
+ 25: // line number information
+ 26: ICONST_1
+ 27: IRETURN
+ 28: // label
+ 29: // line number information
+ 30: // stack frame map
+ 31: ICONST_0
+ 32: IRETURN
diff --git a/test-output/nonShortCircuitMethod.cfg.dot b/test-output/nonShortCircuitMethod.cfg.dot
new file mode 100644
index 0000000..d61827a
--- /dev/null
+++ b/test-output/nonShortCircuitMethod.cfg.dot
@@ -0,0 +1,30 @@
+digraph nonShortCircuitMethod {
+
+ node [shape=record]
+ "nonShortCircuitMethodbb-1" [shape=circle,label="e",xlabel="nonShortCircuitMethod"]
+ "nonShortCircuitMethodbb-2" [shape=circle,label="x"]
+ "nonShortCircuitMethodbb0" [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 7}"]
+ "nonShortCircuitMethodbb5" [label="5|{5: ICONST_1 |6: GOTO 10}"]
+ "nonShortCircuitMethodbb7" [label="7|{7: // label|8: // stack frame map|9: ICONST_0 }"]
+ "nonShortCircuitMethodbb10" [label="10|{10: // label|11: // stack frame map|12: ILOAD 1|13: ILOAD 3|14: IF_ICMPGE 17}"]
+ "nonShortCircuitMethodbb15" [label="15|{15: ICONST_1 |16: GOTO 20}"]
+ "nonShortCircuitMethodbb17" [label="17|{17: // label|18: // stack frame map|19: ICONST_0 }"]
+ "nonShortCircuitMethodbb20" [label="20|{20: // label|21: // stack frame map|22: IAND |23: IFEQ 28}"]
+ "nonShortCircuitMethodbb24" [label="24|{24: // label|25: // line number information|26: ICONST_1 |27: IRETURN }"]
+ "nonShortCircuitMethodbb28" [label="28|{28: // label|29: // line number information|30: // stack frame map|31: ICONST_0 |32: IRETURN }"]
+
+ "nonShortCircuitMethodbb-1" -> "nonShortCircuitMethodbb0"
+ "nonShortCircuitMethodbb0" -> "nonShortCircuitMethodbb5"
+ "nonShortCircuitMethodbb7" -> "nonShortCircuitMethodbb10"
+ "nonShortCircuitMethodbb10" -> "nonShortCircuitMethodbb15"
+ "nonShortCircuitMethodbb17" -> "nonShortCircuitMethodbb20"
+ "nonShortCircuitMethodbb20" -> "nonShortCircuitMethodbb24"
+ "nonShortCircuitMethodbb24" -> "nonShortCircuitMethodbb-2"
+ "nonShortCircuitMethodbb24" -> "nonShortCircuitMethodbb28"
+ "nonShortCircuitMethodbb28" -> "nonShortCircuitMethodbb-2"
+ "nonShortCircuitMethodbb0" -> "nonShortCircuitMethodbb7" [label="T"]
+ "nonShortCircuitMethodbb5" -> "nonShortCircuitMethodbb10" [label="T"]
+ "nonShortCircuitMethodbb10" -> "nonShortCircuitMethodbb17" [label="T"]
+ "nonShortCircuitMethodbb15" -> "nonShortCircuitMethodbb20" [label="T"]
+ "nonShortCircuitMethodbb20" -> "nonShortCircuitMethodbb28" [label="T"]
+}
diff --git a/test-output/nonShortCircuitMethod.combined.dot b/test-output/nonShortCircuitMethod.combined.dot
new file mode 100644
index 0000000..ddb90b6
--- /dev/null
+++ b/test-output/nonShortCircuitMethod.combined.dot
@@ -0,0 +1,38 @@
+digraph combined {
+ label="nonShortCircuitMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 7\l}"]
+ 5 [shape=record,label="5|{5: ICONST_1 \l|6: GOTO 10\l}"]
+ 7 [shape=record,label="7|{7: // label\l|8: // stack frame map\l|9: ICONST_0 \l}"]
+ 10 [shape=record,label="10|{10: // label\l|11: // stack frame map\l|12: ILOAD 1\l|13: ILOAD 3\l|14: IF_ICMPGE 17\l}"]
+ 15 [shape=record,label="15|{15: ICONST_1 \l|16: GOTO 20\l}"]
+ 17 [shape=record,label="17|{17: // label\l|18: // stack frame map\l|19: ICONST_0 \l}"]
+ 20 [shape=record,label="20|{20: // label\l|21: // stack frame map\l|22: IAND \l|23: IFEQ 28\l}"]
+ 24 [shape=record,label="24|{24: // label\l|25: // line number information\l|26: ICONST_1 \l|27: IRETURN \l}"]
+ 28 [shape=record,label="28|{28: // label\l|29: // line number information\l|30: // stack frame map\l|31: ICONST_0 \l|32: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 5 [label=""]
+ 7 -> 10 [label=""]
+ 10 -> 15 [label=""]
+ 17 -> 20 [label=""]
+ 20 -> 24 [label=""]
+ 24 -> -2 [label=""]
+ 24 -> 28 [label=""]
+ 28 -> -2 [label=""]
+ 0 -> 7 [label="T"]
+ 5 -> 10 [label="T"]
+ 10 -> 17 [label="T"]
+ 15 -> 20 [label="T"]
+ 20 -> 28 [label="T"]
+ 10 -> 20 [style=dotted]
+ 20 -> -2 [style=dotted]
+ 10 -> 17 [style=dotted]
+ -1 -> 0 [style=dotted]
+ 20 -> 28 [style=dotted]
+ 20 -> 24 [style=dotted]
+ 0 -> 7 [style=dotted]
+ 0 -> 10 [style=dotted]
+ 0 -> 5 [style=dotted]
+ 10 -> 15 [style=dotted]
+}
diff --git a/test-output/nonShortCircuitMethod.dt.dot b/test-output/nonShortCircuitMethod.dt.dot
new file mode 100644
index 0000000..0466944
--- /dev/null
+++ b/test-output/nonShortCircuitMethod.dt.dot
@@ -0,0 +1,24 @@
+digraph dominatorTree {
+ label="nonShortCircuitMethod"
+ "D(-1)" [style=filled]
+ "D(10)"
+ "D(20)"
+ "D(-2)"
+ "D(17)"
+ "D(0)"
+ "D(28)"
+ "D(24)"
+ "D(7)"
+ "D(5)"
+ "D(15)"
+ "D(10)" -> "D(20)"
+ "D(20)" -> "D(-2)"
+ "D(10)" -> "D(17)"
+ "D(-1)" -> "D(0)"
+ "D(20)" -> "D(28)"
+ "D(20)" -> "D(24)"
+ "D(0)" -> "D(7)"
+ "D(0)" -> "D(10)"
+ "D(0)" -> "D(5)"
+ "D(10)" -> "D(15)"
+}
diff --git a/test-output/privateInstanceCallMethod.asm.txt b/test-output/privateInstanceCallMethod.asm.txt
new file mode 100644
index 0000000..b75ef45
--- /dev/null
+++ b/test-output/privateInstanceCallMethod.asm.txt
@@ -0,0 +1,9 @@
+ Method: privateInstanceCallMethod(LExampleClass;)I
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 1
+ 3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V
+ 4: // label
+ 5: // line number information
+ 6: ICONST_2
+ 7: IRETURN
diff --git a/test-output/privateInstanceCallMethod.cfg.dot b/test-output/privateInstanceCallMethod.cfg.dot
new file mode 100644
index 0000000..c14d74e
--- /dev/null
+++ b/test-output/privateInstanceCallMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph privateInstanceCallMethod {
+
+ node [shape=record]
+ "privateInstanceCallMethodbb-1" [shape=circle,label="e",xlabel="privateInstanceCallMethod"]
+ "privateInstanceCallMethodbb-2" [shape=circle,label="x"]
+ "privateInstanceCallMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V|4: // label|5: // line number information|6: ICONST_2 |7: IRETURN }"]
+
+ "privateInstanceCallMethodbb-1" -> "privateInstanceCallMethodbb0"
+ "privateInstanceCallMethodbb0" -> "privateInstanceCallMethodbb-2"
+}
diff --git a/test-output/privateInstanceCallMethod.combined.dot b/test-output/privateInstanceCallMethod.combined.dot
new file mode 100644
index 0000000..f5a5876
--- /dev/null
+++ b/test-output/privateInstanceCallMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="privateInstanceCallMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: INVOKESPECIAL ExampleClass.privateInstanceCallTarget ()V\l|4: // label\l|5: // line number information\l|6: ICONST_2 \l|7: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/privateInstanceCallMethod.dt.dot b/test-output/privateInstanceCallMethod.dt.dot
new file mode 100644
index 0000000..a2d12f1
--- /dev/null
+++ b/test-output/privateInstanceCallMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="privateInstanceCallMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/privateInstanceCallTarget.asm.txt b/test-output/privateInstanceCallTarget.asm.txt
new file mode 100644
index 0000000..073ee34
--- /dev/null
+++ b/test-output/privateInstanceCallTarget.asm.txt
@@ -0,0 +1,4 @@
+ Method: privateInstanceCallTarget()V
+ 0: // label
+ 1: // line number information
+ 2: RETURN
diff --git a/test-output/privateInstanceCallTarget.cfg.dot b/test-output/privateInstanceCallTarget.cfg.dot
new file mode 100644
index 0000000..ce86815
--- /dev/null
+++ b/test-output/privateInstanceCallTarget.cfg.dot
@@ -0,0 +1,10 @@
+digraph privateInstanceCallTarget {
+
+ node [shape=record]
+ "privateInstanceCallTargetbb-1" [shape=circle,label="e",xlabel="privateInstanceCallTarget"]
+ "privateInstanceCallTargetbb-2" [shape=circle,label="x"]
+ "privateInstanceCallTargetbb0" [label="0|{0: // label|1: // line number information|2: RETURN }"]
+
+ "privateInstanceCallTargetbb-1" -> "privateInstanceCallTargetbb0"
+ "privateInstanceCallTargetbb0" -> "privateInstanceCallTargetbb-2"
+}
diff --git a/test-output/privateInstanceCallTarget.combined.dot b/test-output/privateInstanceCallTarget.combined.dot
new file mode 100644
index 0000000..6b2cee8
--- /dev/null
+++ b/test-output/privateInstanceCallTarget.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="privateInstanceCallTarget"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/privateInstanceCallTarget.dt.dot b/test-output/privateInstanceCallTarget.dt.dot
new file mode 100644
index 0000000..3ca35d7
--- /dev/null
+++ b/test-output/privateInstanceCallTarget.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="privateInstanceCallTarget"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/shortCircuitMethod.asm.txt b/test-output/shortCircuitMethod.asm.txt
new file mode 100644
index 0000000..5dae89d
--- /dev/null
+++ b/test-output/shortCircuitMethod.asm.txt
@@ -0,0 +1,18 @@
+ Method: shortCircuitMethod(III)I
+ 0: // label
+ 1: // line number information
+ 2: ILOAD 1
+ 3: ILOAD 2
+ 4: IF_ICMPLE 12
+ 5: ILOAD 1
+ 6: ILOAD 3
+ 7: IF_ICMPGE 12
+ 8: // label
+ 9: // line number information
+ 10: ICONST_1
+ 11: IRETURN
+ 12: // label
+ 13: // line number information
+ 14: // stack frame map
+ 15: ICONST_0
+ 16: IRETURN
diff --git a/test-output/shortCircuitMethod.cfg.dot b/test-output/shortCircuitMethod.cfg.dot
new file mode 100644
index 0000000..262f0fd
--- /dev/null
+++ b/test-output/shortCircuitMethod.cfg.dot
@@ -0,0 +1,19 @@
+digraph shortCircuitMethod {
+
+ node [shape=record]
+ "shortCircuitMethodbb-1" [shape=circle,label="e",xlabel="shortCircuitMethod"]
+ "shortCircuitMethodbb-2" [shape=circle,label="x"]
+ "shortCircuitMethodbb0" [label="0|{0: // label|1: // line number information|2: ILOAD 1|3: ILOAD 2|4: IF_ICMPLE 12}"]
+ "shortCircuitMethodbb5" [label="5|{5: ILOAD 1|6: ILOAD 3|7: IF_ICMPGE 12}"]
+ "shortCircuitMethodbb8" [label="8|{8: // label|9: // line number information|10: ICONST_1 |11: IRETURN }"]
+ "shortCircuitMethodbb12" [label="12|{12: // label|13: // line number information|14: // stack frame map|15: ICONST_0 |16: IRETURN }"]
+
+ "shortCircuitMethodbb-1" -> "shortCircuitMethodbb0"
+ "shortCircuitMethodbb0" -> "shortCircuitMethodbb5"
+ "shortCircuitMethodbb5" -> "shortCircuitMethodbb8"
+ "shortCircuitMethodbb8" -> "shortCircuitMethodbb-2"
+ "shortCircuitMethodbb8" -> "shortCircuitMethodbb12"
+ "shortCircuitMethodbb12" -> "shortCircuitMethodbb-2"
+ "shortCircuitMethodbb0" -> "shortCircuitMethodbb12" [label="T"]
+ "shortCircuitMethodbb5" -> "shortCircuitMethodbb12" [label="T"]
+}
diff --git a/test-output/shortCircuitMethod.combined.dot b/test-output/shortCircuitMethod.combined.dot
new file mode 100644
index 0000000..a965db2
--- /dev/null
+++ b/test-output/shortCircuitMethod.combined.dot
@@ -0,0 +1,22 @@
+digraph combined {
+ label="shortCircuitMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ILOAD 1\l|3: ILOAD 2\l|4: IF_ICMPLE 12\l}"]
+ 5 [shape=record,label="5|{5: ILOAD 1\l|6: ILOAD 3\l|7: IF_ICMPGE 12\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: ICONST_1 \l|11: IRETURN \l}"]
+ 12 [shape=record,label="12|{12: // label\l|13: // line number information\l|14: // stack frame map\l|15: ICONST_0 \l|16: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 5 [label=""]
+ 5 -> 8 [label=""]
+ 8 -> -2 [label=""]
+ 8 -> 12 [label=""]
+ 12 -> -2 [label=""]
+ 0 -> 12 [label="T"]
+ 5 -> 12 [label="T"]
+ -1 -> 0 [style=dotted]
+ 5 -> 8 [style=dotted]
+ 0 -> 12 [style=dotted]
+ 0 -> 5 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/shortCircuitMethod.dt.dot b/test-output/shortCircuitMethod.dt.dot
new file mode 100644
index 0000000..6640bae
--- /dev/null
+++ b/test-output/shortCircuitMethod.dt.dot
@@ -0,0 +1,14 @@
+digraph dominatorTree {
+ label="shortCircuitMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(5)"
+ "D(8)"
+ "D(12)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(5)" -> "D(8)"
+ "D(0)" -> "D(12)"
+ "D(0)" -> "D(5)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/staticCallMethod.asm.txt b/test-output/staticCallMethod.asm.txt
new file mode 100644
index 0000000..655b5b8
--- /dev/null
+++ b/test-output/staticCallMethod.asm.txt
@@ -0,0 +1,8 @@
+ Method: staticCallMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: INVOKESTATIC ExampleClass.staticCallTarget ()V
+ 3: // label
+ 4: // line number information
+ 5: ICONST_2
+ 6: IRETURN
diff --git a/test-output/staticCallMethod.cfg.dot b/test-output/staticCallMethod.cfg.dot
new file mode 100644
index 0000000..88128c9
--- /dev/null
+++ b/test-output/staticCallMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph staticCallMethod {
+
+ node [shape=record]
+ "staticCallMethodbb-1" [shape=circle,label="e",xlabel="staticCallMethod"]
+ "staticCallMethodbb-2" [shape=circle,label="x"]
+ "staticCallMethodbb0" [label="0|{0: // label|1: // line number information|2: INVOKESTATIC ExampleClass.staticCallTarget ()V|3: // label|4: // line number information|5: ICONST_2 |6: IRETURN }"]
+
+ "staticCallMethodbb-1" -> "staticCallMethodbb0"
+ "staticCallMethodbb0" -> "staticCallMethodbb-2"
+}
diff --git a/test-output/staticCallMethod.combined.dot b/test-output/staticCallMethod.combined.dot
new file mode 100644
index 0000000..ec5bdda
--- /dev/null
+++ b/test-output/staticCallMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="staticCallMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: INVOKESTATIC ExampleClass.staticCallTarget ()V\l|3: // label\l|4: // line number information\l|5: ICONST_2 \l|6: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/staticCallMethod.dt.dot b/test-output/staticCallMethod.dt.dot
new file mode 100644
index 0000000..0843bbd
--- /dev/null
+++ b/test-output/staticCallMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="staticCallMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/staticCallTarget.asm.txt b/test-output/staticCallTarget.asm.txt
new file mode 100644
index 0000000..1e26d76
--- /dev/null
+++ b/test-output/staticCallTarget.asm.txt
@@ -0,0 +1,4 @@
+ Method: staticCallTarget()V
+ 0: // label
+ 1: // line number information
+ 2: RETURN
diff --git a/test-output/staticCallTarget.cfg.dot b/test-output/staticCallTarget.cfg.dot
new file mode 100644
index 0000000..fc92b36
--- /dev/null
+++ b/test-output/staticCallTarget.cfg.dot
@@ -0,0 +1,10 @@
+digraph staticCallTarget {
+
+ node [shape=record]
+ "staticCallTargetbb-1" [shape=circle,label="e",xlabel="staticCallTarget"]
+ "staticCallTargetbb-2" [shape=circle,label="x"]
+ "staticCallTargetbb0" [label="0|{0: // label|1: // line number information|2: RETURN }"]
+
+ "staticCallTargetbb-1" -> "staticCallTargetbb0"
+ "staticCallTargetbb0" -> "staticCallTargetbb-2"
+}
diff --git a/test-output/staticCallTarget.combined.dot b/test-output/staticCallTarget.combined.dot
new file mode 100644
index 0000000..0c13ea7
--- /dev/null
+++ b/test-output/staticCallTarget.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="staticCallTarget"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: RETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ -1 -> 0 [style=dotted]
+ 0 -> -2 [style=dotted]
+}
diff --git a/test-output/staticCallTarget.dt.dot b/test-output/staticCallTarget.dt.dot
new file mode 100644
index 0000000..70ed860
--- /dev/null
+++ b/test-output/staticCallTarget.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="staticCallTarget"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(-2)"
+}
diff --git a/test-output/staticFieldReadMethod.asm.txt b/test-output/staticFieldReadMethod.asm.txt
new file mode 100644
index 0000000..82a4ec0
--- /dev/null
+++ b/test-output/staticFieldReadMethod.asm.txt
@@ -0,0 +1,5 @@
+ Method: staticFieldReadMethod()Ljava/lang/String;
+ 0: // label
+ 1: // line number information
+ 2: GETSTATIC ExampleClass.staticField Ljava/lang/String;
+ 3: ARETURN
diff --git a/test-output/staticFieldReadMethod.cfg.dot b/test-output/staticFieldReadMethod.cfg.dot
new file mode 100644
index 0000000..c2ad464
--- /dev/null
+++ b/test-output/staticFieldReadMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph staticFieldReadMethod {
+
+ node [shape=record]
+ "staticFieldReadMethodbb-1" [shape=circle,label="e",xlabel="staticFieldReadMethod"]
+ "staticFieldReadMethodbb-2" [shape=circle,label="x"]
+ "staticFieldReadMethodbb0" [label="0|{0: // label|1: // line number information|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;|3: ARETURN }"]
+
+ "staticFieldReadMethodbb-1" -> "staticFieldReadMethodbb0"
+ "staticFieldReadMethodbb0" -> "staticFieldReadMethodbb-2"
+}
diff --git a/test-output/staticFieldReadMethod.combined.dot b/test-output/staticFieldReadMethod.combined.dot
new file mode 100644
index 0000000..fb1ddd5
--- /dev/null
+++ b/test-output/staticFieldReadMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="staticFieldReadMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: GETSTATIC ExampleClass.staticField Ljava/lang/String;\l|3: ARETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/staticFieldReadMethod.dt.dot b/test-output/staticFieldReadMethod.dt.dot
new file mode 100644
index 0000000..135dbd3
--- /dev/null
+++ b/test-output/staticFieldReadMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="staticFieldReadMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/staticFieldWriteMethod.asm.txt b/test-output/staticFieldWriteMethod.asm.txt
new file mode 100644
index 0000000..20d506e
--- /dev/null
+++ b/test-output/staticFieldWriteMethod.asm.txt
@@ -0,0 +1,8 @@
+ Method: staticFieldWriteMethod(Ljava/lang/String;)V
+ 0: // label
+ 1: // line number information
+ 2: ALOAD 1
+ 3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;
+ 4: // label
+ 5: // line number information
+ 6: RETURN
diff --git a/test-output/staticFieldWriteMethod.cfg.dot b/test-output/staticFieldWriteMethod.cfg.dot
new file mode 100644
index 0000000..4f5f825
--- /dev/null
+++ b/test-output/staticFieldWriteMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph staticFieldWriteMethod {
+
+ node [shape=record]
+ "staticFieldWriteMethodbb-1" [shape=circle,label="e",xlabel="staticFieldWriteMethod"]
+ "staticFieldWriteMethodbb-2" [shape=circle,label="x"]
+ "staticFieldWriteMethodbb0" [label="0|{0: // label|1: // line number information|2: ALOAD 1|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;|4: // label|5: // line number information|6: RETURN }"]
+
+ "staticFieldWriteMethodbb-1" -> "staticFieldWriteMethodbb0"
+ "staticFieldWriteMethodbb0" -> "staticFieldWriteMethodbb-2"
+}
diff --git a/test-output/staticFieldWriteMethod.combined.dot b/test-output/staticFieldWriteMethod.combined.dot
new file mode 100644
index 0000000..ff2cb80
--- /dev/null
+++ b/test-output/staticFieldWriteMethod.combined.dot
@@ -0,0 +1,10 @@
+digraph combined {
+ label="staticFieldWriteMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ALOAD 1\l|3: PUTSTATIC ExampleClass.staticField Ljava/lang/String;\l|4: // label\l|5: // line number information\l|6: RETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> -2 [label=""]
+ 0 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/staticFieldWriteMethod.dt.dot b/test-output/staticFieldWriteMethod.dt.dot
new file mode 100644
index 0000000..bb4ac73
--- /dev/null
+++ b/test-output/staticFieldWriteMethod.dt.dot
@@ -0,0 +1,8 @@
+digraph dominatorTree {
+ label="staticFieldWriteMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-2)"
+ "D(0)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+}
diff --git a/test-output/switchMethod.asm.txt b/test-output/switchMethod.asm.txt
new file mode 100644
index 0000000..ca1687e
--- /dev/null
+++ b/test-output/switchMethod.asm.txt
@@ -0,0 +1,37 @@
+ Method: switchMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ILOAD 1
+ 7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26
+ 8: // label
+ 9: // line number information
+ 10: // stack frame map
+ 11: ICONST_0
+ 12: ISTORE 2
+ 13: GOTO 31
+ 14: // label
+ 15: // line number information
+ 16: // stack frame map
+ 17: ICONST_1
+ 18: ISTORE 2
+ 19: GOTO 31
+ 20: // label
+ 21: // line number information
+ 22: // stack frame map
+ 23: ICONST_2
+ 24: ISTORE 2
+ 25: GOTO 31
+ 26: // label
+ 27: // line number information
+ 28: // stack frame map
+ 29: ICONST_M1
+ 30: ISTORE 2
+ 31: // label
+ 32: // line number information
+ 33: // stack frame map
+ 34: ILOAD 2
+ 35: IRETURN
diff --git a/test-output/switchMethod.cfg.dot b/test-output/switchMethod.cfg.dot
new file mode 100644
index 0000000..695ff2f
--- /dev/null
+++ b/test-output/switchMethod.cfg.dot
@@ -0,0 +1,23 @@
+digraph switchMethod {
+
+ node [shape=record]
+ "switchMethodbb-1" [shape=circle,label="e",xlabel="switchMethod"]
+ "switchMethodbb-2" [shape=circle,label="x"]
+ "switchMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26}"]
+ "switchMethodbb8" [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"]
+ "switchMethodbb14" [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"]
+ "switchMethodbb20" [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"]
+ "switchMethodbb26" [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"]
+ "switchMethodbb31" [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"]
+
+ "switchMethodbb-1" -> "switchMethodbb0"
+ "switchMethodbb26" -> "switchMethodbb31"
+ "switchMethodbb31" -> "switchMethodbb-2"
+ "switchMethodbb0" -> "switchMethodbb8" [label="0"]
+ "switchMethodbb0" -> "switchMethodbb14" [label="1"]
+ "switchMethodbb0" -> "switchMethodbb20" [label="2"]
+ "switchMethodbb0" -> "switchMethodbb26" [label="default"]
+ "switchMethodbb8" -> "switchMethodbb31" [label="T"]
+ "switchMethodbb14" -> "switchMethodbb31" [label="T"]
+ "switchMethodbb20" -> "switchMethodbb31" [label="T"]
+}
diff --git a/test-output/switchMethod.combined.dot b/test-output/switchMethod.combined.dot
new file mode 100644
index 0000000..6b937cb
--- /dev/null
+++ b/test-output/switchMethod.combined.dot
@@ -0,0 +1,28 @@
+digraph combined {
+ label="switchMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ILOAD 1\l|7: TABLESWITCH 0: 8, 1: 14, 2: 20, default: 26\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: // stack frame map\l|11: ICONST_0 \l|12: ISTORE 2\l|13: GOTO 31\l}"]
+ 14 [shape=record,label="14|{14: // label\l|15: // line number information\l|16: // stack frame map\l|17: ICONST_1 \l|18: ISTORE 2\l|19: GOTO 31\l}"]
+ 20 [shape=record,label="20|{20: // label\l|21: // line number information\l|22: // stack frame map\l|23: ICONST_2 \l|24: ISTORE 2\l|25: GOTO 31\l}"]
+ 26 [shape=record,label="26|{26: // label\l|27: // line number information\l|28: // stack frame map\l|29: ICONST_M1 \l|30: ISTORE 2\l}"]
+ 31 [shape=record,label="31|{31: // label\l|32: // line number information\l|33: // stack frame map\l|34: ILOAD 2\l|35: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 26 -> 31 [label=""]
+ 31 -> -2 [label=""]
+ 0 -> 8 [label="0"]
+ 0 -> 14 [label="1"]
+ 0 -> 20 [label="2"]
+ 0 -> 26 [label="default"]
+ 8 -> 31 [label="T"]
+ 14 -> 31 [label="T"]
+ 20 -> 31 [label="T"]
+ 31 -> -2 [style=dotted]
+ -1 -> 0 [style=dotted]
+ 0 -> 26 [style=dotted]
+ 0 -> 8 [style=dotted]
+ 0 -> 31 [style=dotted]
+ 0 -> 20 [style=dotted]
+ 0 -> 14 [style=dotted]
+}
diff --git a/test-output/switchMethod.dt.dot b/test-output/switchMethod.dt.dot
new file mode 100644
index 0000000..5716e21
--- /dev/null
+++ b/test-output/switchMethod.dt.dot
@@ -0,0 +1,18 @@
+digraph dominatorTree {
+ label="switchMethod"
+ "D(-1)" [style=filled]
+ "D(31)"
+ "D(-2)"
+ "D(0)"
+ "D(26)"
+ "D(8)"
+ "D(20)"
+ "D(14)"
+ "D(31)" -> "D(-2)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(26)"
+ "D(0)" -> "D(8)"
+ "D(0)" -> "D(31)"
+ "D(0)" -> "D(20)"
+ "D(0)" -> "D(14)"
+}
diff --git a/test-output/switchMethod2.asm.txt b/test-output/switchMethod2.asm.txt
new file mode 100644
index 0000000..db070f2
--- /dev/null
+++ b/test-output/switchMethod2.asm.txt
@@ -0,0 +1,37 @@
+ Method: switchMethod2(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: ILOAD 1
+ 7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26
+ 8: // label
+ 9: // line number information
+ 10: // stack frame map
+ 11: ICONST_0
+ 12: ISTORE 2
+ 13: GOTO 31
+ 14: // label
+ 15: // line number information
+ 16: // stack frame map
+ 17: ICONST_1
+ 18: ISTORE 2
+ 19: GOTO 31
+ 20: // label
+ 21: // line number information
+ 22: // stack frame map
+ 23: ICONST_2
+ 24: ISTORE 2
+ 25: GOTO 31
+ 26: // label
+ 27: // line number information
+ 28: // stack frame map
+ 29: ICONST_M1
+ 30: ISTORE 2
+ 31: // label
+ 32: // line number information
+ 33: // stack frame map
+ 34: ILOAD 2
+ 35: IRETURN
diff --git a/test-output/switchMethod2.cfg.dot b/test-output/switchMethod2.cfg.dot
new file mode 100644
index 0000000..ca3be64
--- /dev/null
+++ b/test-output/switchMethod2.cfg.dot
@@ -0,0 +1,23 @@
+digraph switchMethod2 {
+
+ node [shape=record]
+ "switchMethod2bb-1" [shape=circle,label="e",xlabel="switchMethod2"]
+ "switchMethod2bb-2" [shape=circle,label="x"]
+ "switchMethod2bb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2|4: // label|5: // line number information|6: ILOAD 1|7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26}"]
+ "switchMethod2bb8" [label="8|{8: // label|9: // line number information|10: // stack frame map|11: ICONST_0 |12: ISTORE 2|13: GOTO 31}"]
+ "switchMethod2bb14" [label="14|{14: // label|15: // line number information|16: // stack frame map|17: ICONST_1 |18: ISTORE 2|19: GOTO 31}"]
+ "switchMethod2bb20" [label="20|{20: // label|21: // line number information|22: // stack frame map|23: ICONST_2 |24: ISTORE 2|25: GOTO 31}"]
+ "switchMethod2bb26" [label="26|{26: // label|27: // line number information|28: // stack frame map|29: ICONST_M1 |30: ISTORE 2}"]
+ "switchMethod2bb31" [label="31|{31: // label|32: // line number information|33: // stack frame map|34: ILOAD 2|35: IRETURN }"]
+
+ "switchMethod2bb-1" -> "switchMethod2bb0"
+ "switchMethod2bb26" -> "switchMethod2bb31"
+ "switchMethod2bb31" -> "switchMethod2bb-2"
+ "switchMethod2bb0" -> "switchMethod2bb8" [label="0"]
+ "switchMethod2bb0" -> "switchMethod2bb14" [label="1000"]
+ "switchMethod2bb0" -> "switchMethod2bb20" [label="2000"]
+ "switchMethod2bb0" -> "switchMethod2bb26" [label="default"]
+ "switchMethod2bb8" -> "switchMethod2bb31" [label="T"]
+ "switchMethod2bb14" -> "switchMethod2bb31" [label="T"]
+ "switchMethod2bb20" -> "switchMethod2bb31" [label="T"]
+}
diff --git a/test-output/switchMethod2.combined.dot b/test-output/switchMethod2.combined.dot
new file mode 100644
index 0000000..31f5823
--- /dev/null
+++ b/test-output/switchMethod2.combined.dot
@@ -0,0 +1,28 @@
+digraph combined {
+ label="switchMethod2"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l|4: // label\l|5: // line number information\l|6: ILOAD 1\l|7: LOOKUPSWITCH 0: 8, 1000: 14, 2000: 20, default: 26\l}"]
+ 8 [shape=record,label="8|{8: // label\l|9: // line number information\l|10: // stack frame map\l|11: ICONST_0 \l|12: ISTORE 2\l|13: GOTO 31\l}"]
+ 14 [shape=record,label="14|{14: // label\l|15: // line number information\l|16: // stack frame map\l|17: ICONST_1 \l|18: ISTORE 2\l|19: GOTO 31\l}"]
+ 20 [shape=record,label="20|{20: // label\l|21: // line number information\l|22: // stack frame map\l|23: ICONST_2 \l|24: ISTORE 2\l|25: GOTO 31\l}"]
+ 26 [shape=record,label="26|{26: // label\l|27: // line number information\l|28: // stack frame map\l|29: ICONST_M1 \l|30: ISTORE 2\l}"]
+ 31 [shape=record,label="31|{31: // label\l|32: // line number information\l|33: // stack frame map\l|34: ILOAD 2\l|35: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 26 -> 31 [label=""]
+ 31 -> -2 [label=""]
+ 0 -> 8 [label="0"]
+ 0 -> 14 [label="1000"]
+ 0 -> 20 [label="2000"]
+ 0 -> 26 [label="default"]
+ 8 -> 31 [label="T"]
+ 14 -> 31 [label="T"]
+ 20 -> 31 [label="T"]
+ 0 -> 31 [style=dotted]
+ 0 -> 8 [style=dotted]
+ 0 -> 14 [style=dotted]
+ 0 -> 20 [style=dotted]
+ -1 -> 0 [style=dotted]
+ 0 -> 26 [style=dotted]
+ 31 -> -2 [style=dotted]
+}
diff --git a/test-output/switchMethod2.dt.dot b/test-output/switchMethod2.dt.dot
new file mode 100644
index 0000000..dc4f332
--- /dev/null
+++ b/test-output/switchMethod2.dt.dot
@@ -0,0 +1,18 @@
+digraph dominatorTree {
+ label="switchMethod2"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(31)"
+ "D(8)"
+ "D(14)"
+ "D(20)"
+ "D(26)"
+ "D(-2)"
+ "D(0)" -> "D(31)"
+ "D(0)" -> "D(8)"
+ "D(0)" -> "D(14)"
+ "D(0)" -> "D(20)"
+ "D(-1)" -> "D(0)"
+ "D(0)" -> "D(26)"
+ "D(31)" -> "D(-2)"
+}
diff --git a/test-output/whileMethod.asm.txt b/test-output/whileMethod.asm.txt
new file mode 100644
index 0000000..72bea2f
--- /dev/null
+++ b/test-output/whileMethod.asm.txt
@@ -0,0 +1,25 @@
+ Method: whileMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: ICONST_0
+ 3: ISTORE 2
+ 4: // label
+ 5: // line number information
+ 6: // stack frame map
+ 7: ILOAD 1
+ 8: IFLE 19
+ 9: // label
+ 10: // line number information
+ 11: ILOAD 2
+ 12: ILOAD 1
+ 13: IADD
+ 14: ISTORE 2
+ 15: // label
+ 16: // line number information
+ 17: IINC 1 -1
+ 18: GOTO 4
+ 19: // label
+ 20: // line number information
+ 21: // stack frame map
+ 22: ILOAD 2
+ 23: IRETURN
diff --git a/test-output/whileMethod.cfg.dot b/test-output/whileMethod.cfg.dot
new file mode 100644
index 0000000..b2f3503
--- /dev/null
+++ b/test-output/whileMethod.cfg.dot
@@ -0,0 +1,17 @@
+digraph whileMethod {
+
+ node [shape=record]
+ "whileMethodbb-1" [shape=circle,label="e",xlabel="whileMethod"]
+ "whileMethodbb-2" [shape=circle,label="x"]
+ "whileMethodbb0" [label="0|{0: // label|1: // line number information|2: ICONST_0 |3: ISTORE 2}"]
+ "whileMethodbb4" [label="4|{4: // label|5: // line number information|6: // stack frame map|7: ILOAD 1|8: IFLE 19}"]
+ "whileMethodbb9" [label="9|{9: // label|10: // line number information|11: ILOAD 2|12: ILOAD 1|13: IADD |14: ISTORE 2|15: // label|16: // line number information|17: IINC 1 -1|18: GOTO 4}"]
+ "whileMethodbb19" [label="19|{19: // label|20: // line number information|21: // stack frame map|22: ILOAD 2|23: IRETURN }"]
+
+ "whileMethodbb-1" -> "whileMethodbb0"
+ "whileMethodbb0" -> "whileMethodbb4"
+ "whileMethodbb4" -> "whileMethodbb9"
+ "whileMethodbb19" -> "whileMethodbb-2"
+ "whileMethodbb9" -> "whileMethodbb4" [label="T"]
+ "whileMethodbb4" -> "whileMethodbb19" [label="T"]
+}
diff --git a/test-output/whileMethod.combined.dot b/test-output/whileMethod.combined.dot
new file mode 100644
index 0000000..0fd3c61
--- /dev/null
+++ b/test-output/whileMethod.combined.dot
@@ -0,0 +1,20 @@
+digraph combined {
+ label="whileMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: ICONST_0 \l|3: ISTORE 2\l}"]
+ 4 [shape=record,label="4|{4: // label\l|5: // line number information\l|6: // stack frame map\l|7: ILOAD 1\l|8: IFLE 19\l}"]
+ 9 [shape=record,label="9|{9: // label\l|10: // line number information\l|11: ILOAD 2\l|12: ILOAD 1\l|13: IADD \l|14: ISTORE 2\l|15: // label\l|16: // line number information\l|17: IINC 1 -1\l|18: GOTO 4\l}"]
+ 19 [shape=record,label="19|{19: // label\l|20: // line number information\l|21: // stack frame map\l|22: ILOAD 2\l|23: IRETURN \l}"]
+ -1 -> 0 [label=""]
+ 0 -> 4 [label=""]
+ 4 -> 9 [label=""]
+ 19 -> -2 [label=""]
+ 9 -> 4 [label="T"]
+ 4 -> 19 [label="T"]
+ 0 -> 4 [style=dotted]
+ -1 -> 0 [style=dotted]
+ 19 -> -2 [style=dotted]
+ 4 -> 9 [style=dotted]
+ 4 -> 19 [style=dotted]
+}
diff --git a/test-output/whileMethod.dt.dot b/test-output/whileMethod.dt.dot
new file mode 100644
index 0000000..8d3641f
--- /dev/null
+++ b/test-output/whileMethod.dt.dot
@@ -0,0 +1,14 @@
+digraph dominatorTree {
+ label="whileMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(4)"
+ "D(19)"
+ "D(-2)"
+ "D(9)"
+ "D(0)" -> "D(4)"
+ "D(-1)" -> "D(0)"
+ "D(19)" -> "D(-2)"
+ "D(4)" -> "D(9)"
+ "D(4)" -> "D(19)"
+}
diff --git a/test-output/whileTrueMethod.asm.txt b/test-output/whileTrueMethod.asm.txt
new file mode 100644
index 0000000..185b4da
--- /dev/null
+++ b/test-output/whileTrueMethod.asm.txt
@@ -0,0 +1,6 @@
+ Method: whileTrueMethod(I)I
+ 0: // label
+ 1: // line number information
+ 2: // stack frame map
+ 3: IINC 1 1
+ 4: GOTO 0
diff --git a/test-output/whileTrueMethod.cfg.dot b/test-output/whileTrueMethod.cfg.dot
new file mode 100644
index 0000000..11743c1
--- /dev/null
+++ b/test-output/whileTrueMethod.cfg.dot
@@ -0,0 +1,10 @@
+digraph whileTrueMethod {
+
+ node [shape=record]
+ "whileTrueMethodbb-1" [shape=circle,label="e",xlabel="whileTrueMethod"]
+ "whileTrueMethodbb-2" [shape=circle,label="e",xlabel="whileTrueMethod"]
+ "whileTrueMethodbb0" [label="0|{0: // label|1: // line number information|2: // stack frame map|3: IINC 1 1|4: GOTO 0}"]
+
+ "whileTrueMethodbb-1" -> "whileTrueMethodbb0"
+ "whileTrueMethodbb0" -> "whileTrueMethodbb0" [label="T"]
+}
diff --git a/test-output/whileTrueMethod.combined.dot b/test-output/whileTrueMethod.combined.dot
new file mode 100644
index 0000000..a6b8d8d
--- /dev/null
+++ b/test-output/whileTrueMethod.combined.dot
@@ -0,0 +1,9 @@
+digraph combined {
+ label="whileTrueMethod"
+ -1 [shape=record,style=filled,label="-1|entry"]
+ -2 [shape=record,label="-2|exit"]
+ 0 [shape=record,label="0|{0: // label\l|1: // line number information\l|2: // stack frame map\l|3: IINC 1 1\l|4: GOTO 0\l}"]
+ -1 -> 0 [label=""]
+ 0 -> 0 [label="T"]
+ -1 -> 0 [style=dotted]
+}
diff --git a/test-output/whileTrueMethod.dt.dot b/test-output/whileTrueMethod.dt.dot
new file mode 100644
index 0000000..4312a93
--- /dev/null
+++ b/test-output/whileTrueMethod.dt.dot
@@ -0,0 +1,6 @@
+digraph dominatorTree {
+ label="whileTrueMethod"
+ "D(-1)" [style=filled]
+ "D(0)"
+ "D(-1)" -> "D(0)"
+}