@@ -26,13 +26,37 @@ public DFS(final Node startNode) {
2626 for (final Node .UseEdge edge : user .uses ) {
2727 if (edge .node () == currentNode ) {
2828 if (edge .use () instanceof final ControlFlowUse cfu && cfu .type == ControlType .FORWARD ) {
29- forwardNodes .add (user );
29+ final Set <Node > preds = predecessorsOf (user );
30+ if (marked .containsAll (preds )) {
31+ //System.out.println("All predecessors of node " + currentNode + " visited, continuing");
32+ forwardNodes .add (user );
33+ } else {
34+ //System.out.println("Not all preds of node " + currentNode + " visited yet, skipping for now");
35+ }
3036 } else if (edge .use () instanceof DefinedByUse ) {
31- forwardNodes .add (user );
37+ final Set <Node > preds = predecessorsOf (user );
38+ if (marked .containsAll (preds )) {
39+ //System.out.println("All predecessors of node " + currentNode + " visited, continuing");
40+ forwardNodes .add (user );
41+ } else {
42+ //System.out.println("Not all preds of node " + currentNode + " visited yet, skipping for now");
43+ }
3244 } else if (edge .use () instanceof DataFlowUse ) {
33- forwardNodes .add (user );
45+ final Set <Node > preds = predecessorsOf (user );
46+ if (marked .containsAll (preds )) {
47+ //System.out.println("All predecessors of node " + currentNode + " visited, continuing");
48+ forwardNodes .add (user );
49+ } else {
50+ //System.out.println("Not all preds of node " + currentNode + " visited yet, skipping for now");
51+ }
3452 } else if (edge .use () instanceof MemoryUse ) {
35- forwardNodes .add (user );
53+ final Set <Node > preds = predecessorsOf (user );
54+ if (marked .containsAll (preds )) {
55+ //System.out.println("All predecessors of node " + currentNode + " visited, continuing");
56+ forwardNodes .add (user );
57+ } else {
58+ //System.out.println("Not all preds of node " + currentNode + " visited yet, skipping for now");
59+ }
3660 }
3761 }
3862 }
@@ -65,6 +89,18 @@ public DFS(final Node startNode) {
6589 }
6690 }
6791
92+ private Set <Node > predecessorsOf (final Node node ) {
93+ final Set <Node > predecessors = new HashSet <>();
94+ for (final Node .UseEdge edge : node .uses ) {
95+ if (edge .use () instanceof final ControlFlowUse cfu ) {
96+ if (cfu .type == ControlType .FORWARD ) {
97+ predecessors .add (edge .node ());
98+ }
99+ } else predecessors .add (edge .node ());
100+ }
101+ return predecessors ;
102+ }
103+
68104 public List <Node > getTopologicalOrder () {
69105 return nodesInOrder ;
70106 }
0 commit comments