comparison graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java @ 4642:9f781aae2470

separate GraphOrder from EscapeAnalysisPhase
author Lukas Stadler <lukas.stadler@jku.at>
date Mon, 20 Feb 2012 14:20:28 +0100
parents a3882fd1ae61
children a59fe7906f0b
comparison
equal deleted inserted replaced
4641:5d9013afbfff 4642:9f781aae2470
26 26
27 import com.oracle.max.cri.ci.*; 27 import com.oracle.max.cri.ci.*;
28 import com.oracle.max.criutils.*; 28 import com.oracle.max.criutils.*;
29 import com.oracle.max.graal.compiler.*; 29 import com.oracle.max.graal.compiler.*;
30 import com.oracle.max.graal.compiler.graph.*; 30 import com.oracle.max.graal.compiler.graph.*;
31 import com.oracle.max.graal.compiler.util.*;
31 import com.oracle.max.graal.cri.*; 32 import com.oracle.max.graal.cri.*;
32 import com.oracle.max.graal.debug.*; 33 import com.oracle.max.graal.debug.*;
33 import com.oracle.max.graal.graph.*; 34 import com.oracle.max.graal.graph.*;
34 import com.oracle.max.graal.nodes.*; 35 import com.oracle.max.graal.nodes.*;
35 import com.oracle.max.graal.nodes.PhiNode.PhiType; 36 import com.oracle.max.graal.nodes.PhiNode.PhiType;
38 import com.oracle.max.graal.nodes.spi.*; 39 import com.oracle.max.graal.nodes.spi.*;
39 import com.oracle.max.graal.nodes.virtual.*; 40 import com.oracle.max.graal.nodes.virtual.*;
40 41
41 42
42 public class EscapeAnalysisPhase extends Phase { 43 public class EscapeAnalysisPhase extends Phase {
43 public static class GraphOrder implements Iterable<Node> {
44
45 private final ArrayList<Node> nodes = new ArrayList<>();
46
47 public GraphOrder(Graph graph) {
48 NodeBitMap visited = graph.createNodeBitMap();
49
50 for (ReturnNode node : graph.getNodes(ReturnNode.class)) {
51 visit(visited, node);
52 }
53 for (UnwindNode node : graph.getNodes(UnwindNode.class)) {
54 visit(visited, node);
55 }
56 for (DeoptimizeNode node : graph.getNodes(DeoptimizeNode.class)) {
57 visit(visited, node);
58 }
59 }
60
61 private void visit(NodeBitMap visited, Node node) {
62 if (node != null && !visited.isMarked(node)) {
63 visited.mark(node);
64 for (Node input : node.inputs()) {
65 visit(visited, input);
66 }
67 if (node.predecessor() != null) {
68 visit(visited, node.predecessor());
69 }
70 nodes.add(node);
71 }
72 }
73
74 @Override
75 public Iterator<Node> iterator() {
76 return new Iterator<Node>() {
77
78 private int pos = 0;
79
80 private void removeDeleted() {
81 while (pos < nodes.size() && nodes.get(pos).isDeleted()) {
82 pos++;
83 }
84 }
85
86 @Override
87 public boolean hasNext() {
88 removeDeleted();
89 return pos < nodes.size();
90 }
91
92 @Override
93 public Node next() {
94 return nodes.get(pos++);
95 }
96
97 @Override
98 public void remove() {
99 throw new UnsupportedOperationException();
100 }
101 };
102 }
103 }
104 44
105 public static class BlockExitState implements MergeableState<BlockExitState> { 45 public static class BlockExitState implements MergeableState<BlockExitState> {
106 public final ValueNode[] fieldState; 46 public final ValueNode[] fieldState;
107 public final VirtualObjectNode virtualObject; 47 public final VirtualObjectNode virtualObject;
108 public ValueNode virtualObjectField; 48 public ValueNode virtualObjectField;