Mercurial > hg > truffle
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; |