Mercurial > hg > truffle
annotate graal/com.oracle.graal.phases/src/com/oracle/graal/phases/util/GraphOrder.java @ 18995:a2cb19764970
Rename MergeNode to AbstractMergeNode.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Wed, 28 Jan 2015 01:04:20 +0100 |
parents | e349dfa54db1 |
children | c6b2677bcbef |
rev | line source |
---|---|
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
1 /* |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
4 * |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
8 * |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
13 * accompanied this code). |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
14 * |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
18 * |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
21 * questions. |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
22 */ |
6525
2c913b643422
rename packages in graal.phases to match project name
Doug Simon <doug.simon@oracle.com>
parents:
6522
diff
changeset
|
23 package com.oracle.graal.phases.util; |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
24 |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
25 import java.util.*; |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
26 |
15193
96bb07a5d667
Spit up and move GraalInternalError.
Josef Eisl <josef.eisl@jku.at>
parents:
15192
diff
changeset
|
27 import com.oracle.graal.compiler.common.*; |
15192
644dfe49c0f4
Move packages com.oracle.graal.cfg to com.oracle.graal.compiler.common.cfg.
Josef Eisl <josef.eisl@jku.at>
parents:
15157
diff
changeset
|
28 import com.oracle.graal.compiler.common.cfg.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
29 import com.oracle.graal.graph.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
30 import com.oracle.graal.nodes.*; |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
31 import com.oracle.graal.nodes.VirtualState.NodeClosure; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
32 import com.oracle.graal.nodes.cfg.*; |
15288
2a6897a82a7e
loosen restrictions a bit in GraphOrder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15243
diff
changeset
|
33 import com.oracle.graal.nodes.virtual.*; |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
34 import com.oracle.graal.phases.graph.*; |
14991
64dcb92ee75a
Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
14889
diff
changeset
|
35 import com.oracle.graal.phases.graph.ReentrantBlockIterator.BlockIteratorClosure; |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
36 import com.oracle.graal.phases.schedule.*; |
14991
64dcb92ee75a
Truffle: Change signature for Truffle calls from (PackedFrame, Arguments) to (Object[]).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
14889
diff
changeset
|
37 import com.oracle.graal.phases.schedule.SchedulePhase.SchedulingStrategy; |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
38 |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
39 public final class GraphOrder { |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
40 |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
41 private GraphOrder() { |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
42 } |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
43 |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
44 /** |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
45 * Quick (and imprecise) assertion that there are no (invalid) cycles in the given graph. First, |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
46 * an ordered list of all nodes in the graph (a total ordering) is created. A second run over |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
47 * this list checks whether inputs are scheduled before their usages. |
15002
06e50d290784
isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14991
diff
changeset
|
48 * |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
49 * @param graph the graph to be checked. |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
50 * @throws AssertionError if a cycle was detected. |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
51 */ |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
52 public static boolean assertNonCyclicGraph(StructuredGraph graph) { |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
53 List<Node> order = createOrder(graph); |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
54 NodeBitMap visited = graph.createNodeBitMap(); |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
55 visited.clearAll(); |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
56 for (Node node : order) { |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
57 if (node instanceof PhiNode && ((PhiNode) node).merge() instanceof LoopBeginNode) { |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
58 assert visited.isMarked(((PhiNode) node).valueAt(0)); |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
59 // nothing to do |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
60 } else { |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
61 for (Node input : node.inputs()) { |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
62 if (!visited.isMarked(input)) { |
15243
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
63 if (input instanceof FrameState) { |
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
64 // nothing to do - frame states are known, allowed cycles |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
65 } else { |
15035
bfad6492cce9
re-enable graph ordering assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15002
diff
changeset
|
66 assert false : "unexpected cycle detected at input " + node + " -> " + input; |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
67 } |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
68 } |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
69 } |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
70 } |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
71 visited.mark(node); |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
72 } |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
73 return true; |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
74 } |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
75 |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
76 private static List<Node> createOrder(StructuredGraph graph) { |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
77 final ArrayList<Node> nodes = new ArrayList<>(); |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
78 final NodeBitMap visited = graph.createNodeBitMap(); |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
79 |
14889
5accc969c8c7
use StatelessPostOrderNodeIterator in GraphOrder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14760
diff
changeset
|
80 new StatelessPostOrderNodeIterator(graph.start()) { |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
81 @Override |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
82 protected void node(FixedNode node) { |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
83 visitForward(nodes, visited, node, false); |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
84 } |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
85 }.apply(); |
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
86 return nodes; |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
87 } |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
88 |
13729
9a6faa08bffe
cyclic graph verification
Lukas Stadler <lukas.stadler@jku.at>
parents:
11641
diff
changeset
|
89 private static void visitForward(ArrayList<Node> nodes, NodeBitMap visited, Node node, boolean floatingOnly) { |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
90 try { |
14547
0d5923064a88
fixed some findbugs issues
Doug Simon <doug.simon@oracle.com>
parents:
14534
diff
changeset
|
91 assert node == null || node.isAlive() : node + " not alive"; |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
92 if (node != null && !visited.isMarked(node)) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
93 if (floatingOnly && node instanceof FixedNode) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
94 throw new GraalInternalError("unexpected reference to fixed node: %s (this indicates an unexpected cycle)", node); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
95 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
96 visited.mark(node); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
97 FrameState stateAfter = null; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
98 if (node instanceof StateSplit) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
99 stateAfter = ((StateSplit) node).stateAfter(); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
100 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
101 for (Node input : node.inputs()) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
102 if (input != stateAfter) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
103 visitForward(nodes, visited, input, true); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
104 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
105 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
106 if (node instanceof EndNode) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
107 EndNode end = (EndNode) node; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
108 for (PhiNode phi : end.merge().phis()) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
109 visitForward(nodes, visited, phi.valueAt(end), true); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
110 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
111 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
112 nodes.add(node); |
18995
a2cb19764970
Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18971
diff
changeset
|
113 if (node instanceof AbstractMergeNode) { |
a2cb19764970
Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18971
diff
changeset
|
114 for (PhiNode phi : ((AbstractMergeNode) node).phis()) { |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
115 visited.mark(phi); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
116 nodes.add(phi); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
117 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
118 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
119 if (stateAfter != null) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
120 visitForward(nodes, visited, stateAfter, true); |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
121 } |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
122 } |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
123 } catch (GraalInternalError e) { |
15196
593f7d0a6f50
GraalGraphInternalError: improve method names and documentation.
Josef Eisl <josef.eisl@jku.at>
parents:
15193
diff
changeset
|
124 throw GraalGraphInternalError.transformAndAddContext(e, node); |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
125 } |
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
126 } |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
127 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
128 /** |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
129 * This method schedules the graph and makes sure that, for every node, all inputs are available |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
130 * at the position where it is scheduled. This is a very expensive assertion. |
15002
06e50d290784
isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14991
diff
changeset
|
131 * |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
132 * Also, this phase assumes ProxyNodes to exist at LoopExitNodes, so that it cannot be run after |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
133 * phases that remove loop proxies or move proxies to BeginNodes. |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
134 */ |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
135 public static boolean assertSchedulableGraph(final StructuredGraph graph) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
136 try { |
18965
53fcb13db742
Always use read aware memory scheduling.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18941
diff
changeset
|
137 final SchedulePhase schedule = new SchedulePhase(SchedulingStrategy.LATEST_OUT_OF_LOOPS); |
18383
1518c3296cc8
use deterministic iteration order Set and Map data structures when in the scope of a replay compilation context
Doug Simon <doug.simon@oracle.com>
parents:
17300
diff
changeset
|
138 final Map<LoopBeginNode, NodeBitMap> loopEntryStates = Node.newIdentityMap(); |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
139 schedule.apply(graph, false); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
140 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
141 BlockIteratorClosure<NodeBitMap> closure = new BlockIteratorClosure<NodeBitMap>() { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
142 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
143 @Override |
15107 | 144 protected List<NodeBitMap> processLoop(Loop<Block> loop, NodeBitMap initialState) { |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
145 return ReentrantBlockIterator.processLoop(this, loop, initialState).exitStates; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
146 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
147 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
148 @Override |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
149 protected NodeBitMap processBlock(final Block block, final NodeBitMap currentState) { |
18941
c943ba97b2a7
Remove class ScheduledNode from the node class hierarchy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18383
diff
changeset
|
150 final List<ValueNode> list = schedule.getBlockToNodesMap().get(block); |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
151 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
152 /* |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
153 * A stateAfter is not valid directly after its associated state split, but |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
154 * right before the next fixed node. Therefore a pending stateAfter is kept that |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
155 * will be checked at the correct position. |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
156 */ |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
157 FrameState pendingStateAfter = null; |
18941
c943ba97b2a7
Remove class ScheduledNode from the node class hierarchy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18383
diff
changeset
|
158 for (final ValueNode node : list) { |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
159 FrameState stateAfter = node instanceof StateSplit ? ((StateSplit) node).stateAfter() : null; |
16573
a2ec1ac769e4
Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
16415
diff
changeset
|
160 if (node instanceof FullInfopointNode) { |
a2ec1ac769e4
Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
16415
diff
changeset
|
161 stateAfter = ((FullInfopointNode) node).getState(); |
15243
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
162 } |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
163 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
164 if (pendingStateAfter != null && node instanceof FixedNode) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
165 pendingStateAfter.applyToNonVirtual(new NodeClosure<Node>() { |
18971
e349dfa54db1
Simplifications in PEA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18965
diff
changeset
|
166 @Override |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
167 public void apply(Node usage, Node nonVirtualNode) { |
15288
2a6897a82a7e
loosen restrictions a bit in GraphOrder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15243
diff
changeset
|
168 assert currentState.isMarked(nonVirtualNode) || nonVirtualNode instanceof VirtualObjectNode : nonVirtualNode + " not available at virtualstate " + usage + |
2a6897a82a7e
loosen restrictions a bit in GraphOrder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15243
diff
changeset
|
169 " before " + node + " in block " + block + " \n" + list; |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
170 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
171 }); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
172 pendingStateAfter = null; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
173 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
174 |
18995
a2cb19764970
Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18971
diff
changeset
|
175 if (node instanceof AbstractMergeNode) { |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
176 // phis aren't scheduled, so they need to be added explicitly |
18995
a2cb19764970
Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18971
diff
changeset
|
177 currentState.markAll(((AbstractMergeNode) node).phis()); |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
178 if (node instanceof LoopBeginNode) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
179 // remember the state at the loop entry, it's restored at exits |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
180 loopEntryStates.put((LoopBeginNode) node, currentState.copy()); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
181 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
182 } else if (node instanceof ProxyNode) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
183 for (Node input : node.inputs()) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
184 if (input != ((ProxyNode) node).proxyPoint()) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
185 assert currentState.isMarked(input) : input + " not available at " + node + " in block " + block + "\n" + list; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
186 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
187 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
188 } else if (node instanceof LoopExitNode) { |
16415
24af0805e135
hasValueProxies on StructuredGraph
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15742
diff
changeset
|
189 if (graph.hasValueProxies()) { |
15243
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
190 // loop contents are only accessible via proxies at the exit |
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
191 currentState.clearAll(); |
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
192 currentState.markAll(loopEntryStates.get(((LoopExitNode) node).loopBegin())); |
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
193 } |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
194 // Loop proxies aren't scheduled, so they need to be added explicitly |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
195 currentState.markAll(((LoopExitNode) node).proxies()); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
196 } else { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
197 for (Node input : node.inputs()) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
198 if (input != stateAfter) { |
15243
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
199 if (input instanceof FrameState) { |
18971
e349dfa54db1
Simplifications in PEA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18965
diff
changeset
|
200 ((FrameState) input).applyToNonVirtual(new VirtualState.NodeClosure<Node>() { |
e349dfa54db1
Simplifications in PEA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18965
diff
changeset
|
201 @Override |
e349dfa54db1
Simplifications in PEA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18965
diff
changeset
|
202 public void apply(Node usage, Node nonVirtual) { |
e349dfa54db1
Simplifications in PEA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18965
diff
changeset
|
203 assert currentState.isMarked(nonVirtual) : nonVirtual + " not available at " + node + " in block " + block + "\n" + list; |
e349dfa54db1
Simplifications in PEA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18965
diff
changeset
|
204 } |
15243
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
205 }); |
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
206 } else { |
15288
2a6897a82a7e
loosen restrictions a bit in GraphOrder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15243
diff
changeset
|
207 assert currentState.isMarked(input) || input instanceof VirtualObjectNode : input + " not available at " + node + " in block " + block + "\n" + list; |
15243
43f26891ed2e
slightly more relaxed GraphOrder assertion
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15196
diff
changeset
|
208 } |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
209 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
210 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
211 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
212 if (node instanceof AbstractEndNode) { |
18995
a2cb19764970
Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18971
diff
changeset
|
213 AbstractMergeNode merge = ((AbstractEndNode) node).merge(); |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
214 for (PhiNode phi : merge.phis()) { |
17300
a926a44acfc6
fix NPE in graph scheduling validation
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16573
diff
changeset
|
215 ValueNode phiValue = phi.valueAt((AbstractEndNode) node); |
a926a44acfc6
fix NPE in graph scheduling validation
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16573
diff
changeset
|
216 assert phiValue == null || currentState.isMarked(phiValue) : phiValue + " not available at phi " + phi + " / end " + node + " in block " + block; |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
217 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
218 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
219 if (stateAfter != null) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
220 assert pendingStateAfter == null; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
221 pendingStateAfter = stateAfter; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
222 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
223 currentState.mark(node); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
224 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
225 if (pendingStateAfter != null) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
226 pendingStateAfter.applyToNonVirtual(new NodeClosure<Node>() { |
18971
e349dfa54db1
Simplifications in PEA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18965
diff
changeset
|
227 @Override |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
228 public void apply(Node usage, Node nonVirtualNode) { |
15742
928475f5c2f1
small fix in GraphOrder.assertSchedulableGraph
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15551
diff
changeset
|
229 assert currentState.isMarked(nonVirtualNode) || nonVirtualNode instanceof VirtualObjectNode : nonVirtualNode + " not available at virtualstate " + usage + |
928475f5c2f1
small fix in GraphOrder.assertSchedulableGraph
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15551
diff
changeset
|
230 " at end of block " + block + " \n" + list; |
14534
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
231 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
232 }); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
233 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
234 return currentState; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
235 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
236 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
237 @Override |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
238 protected NodeBitMap merge(Block merge, List<NodeBitMap> states) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
239 NodeBitMap result = states.get(0); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
240 for (int i = 1; i < states.size(); i++) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
241 result.intersect(states.get(i)); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
242 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
243 return result; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
244 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
245 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
246 @Override |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
247 protected NodeBitMap getInitialState() { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
248 return graph.createNodeBitMap(); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
249 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
250 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
251 @Override |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
252 protected NodeBitMap cloneState(NodeBitMap oldState) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
253 return oldState.copy(); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
254 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
255 }; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
256 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
257 ReentrantBlockIterator.apply(closure, schedule.getCFG().getStartBlock()); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
258 |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
259 } catch (Throwable t) { |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
260 throw new AssertionError("unschedulable graph", t); |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
261 } |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
262 return true; |
ccf090d3be47
new graph ordering assertion mechanism
Lukas Stadler <lukas.stadler@oracle.com>
parents:
13783
diff
changeset
|
263 } |
4642
9f781aae2470
separate GraphOrder from EscapeAnalysisPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
264 } |