Mercurial > hg > truffle
annotate graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphEncoder.java @ 21554:b1530a6cce8c
renamed com.oracle.graal.[debug|options|hotspotvmconfig]* modules to com.oracle.jvmci.[debug|options|hotspotvmconfig]* modules (JBS:GRAAL-53)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Tue, 26 May 2015 23:21:15 +0200 |
parents | fe0531d98fbe |
children | 48c1ebd24120 |
rev | line source |
---|---|
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
1 /* |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
2 * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
4 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
8 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
14 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
18 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
21 * questions. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
22 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
23 package com.oracle.graal.nodes; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
24 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
25 import java.util.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
26 |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
27 import com.oracle.graal.api.code.*; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
28 import com.oracle.graal.compiler.common.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
29 import com.oracle.graal.compiler.common.util.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
30 import com.oracle.graal.graph.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
31 import com.oracle.graal.graph.iterators.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
32 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions; |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
33 import com.oracle.graal.nodes.java.*; |
21554
b1530a6cce8c
renamed com.oracle.graal.[debug|options|hotspotvmconfig]* modules to com.oracle.jvmci.[debug|options|hotspotvmconfig]* modules (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21107
diff
changeset
|
34 import com.oracle.jvmci.debug.*; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
35 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
36 /** |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
37 * Encodes a {@link StructuredGraph} to a compact byte[] array. All nodes of the graph and edges |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
38 * between the nodes are encoded. Primitive data fields of nodes are stored in the byte[] array. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
39 * Object data fields of nodes are stored in a separate Object[] array. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
40 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
41 * One encoder instance can be used to encode multiple graphs. This requires that {@link #prepare} |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
42 * is called for all graphs first, followed by one call to {@link #finishPrepare}. Then |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
43 * {@link #encode} can be called for all graphs. The {@link #getObjects() objects} and |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
44 * {@link #getNodeClasses() node classes} arrays do not change anymore after preparation. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
45 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
46 * Multiple encoded graphs share the Object[] array, and elements of the Object[] array are |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
47 * de-duplicated using {@link Object#equals Object equality}. This uses the assumption and good |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
48 * coding practice that data objects are immutable if {@link Object#equals} is implemented. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
49 * Unfortunately, this cannot be enforced. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
50 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
51 * The Graal {@link NodeClass} does not have a unique id that allows class lookup from an id. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
52 * Therefore, the encoded graph contains a {@link NodeClass}[] array for lookup, and type ids are |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
53 * encoding-local. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
54 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
55 * The encoded graph has the following structure: First, all nodes and their edges are serialized. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
56 * The start offset of every node is then known. The raw node data is followed by a |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
57 * "table of contents" that lists the start offset for every node. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
58 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
59 * The beginning of that table of contents is the return value of {@link #encode} and stored in |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
60 * {@link EncodedGraph#getStartOffset()}. The order of nodes in the table of contents is the |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
61 * {@link NodeOrder#orderIds orderId} of a node. Note that the orderId is not the regular node id |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
62 * that every Graal graph node gets assigned. The orderId is computed and used just for encoding and |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
63 * decoding. The orderId of fixed nodes is assigned in reverse postorder. The decoder processes |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
64 * nodes using that order, which ensures that all predecessors of a node (including all |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
65 * {@link EndNode predecessors} of a {@link AbstractBeginNode block}) are decoded before the node. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
66 * The order id of floating node does not matter during decoding, so floating nodes get order ids |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
67 * after all fixed nodes. The order id is used to encode edges between nodes |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
68 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
69 * Structure of an encoded node: |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
70 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
71 * <pre> |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
72 * struct Node { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
73 * unsigned typeId |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
74 * signed[] properties |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
75 * unsigned[] successorOrderIds |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
76 * unsigned[] inputOrderIds |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
77 * } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
78 * </pre> |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
79 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
80 * All numbers (unsigned and signed) are stored using a variable-length encoding as defined in |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
81 * {@link TypeReader} and {@link TypeWriter}. Especially orderIds are small, so the variable-length |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
82 * encoding is important to keep the encoding compact. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
83 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
84 * The properties, successors, and inputs are written in the order as defined in |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
85 * {@link NodeClass#getData}, {@link NodeClass#getSuccessorEdges()}, and |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
86 * {@link NodeClass#getInputEdges()}. For variable-length successors and input lists, first the |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
87 * length is written and then the orderIds. There is a distinction between null lists (encoded as |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
88 * length -1) and empty lists (encoded as length 0). No reverse edges are written (predecessors, |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
89 * usages) since that information can be easily restored during decoding. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
90 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
91 * Some nodes have additional information written after the properties, successors, and inputs: <li> |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
92 * <item>{@link AbstractEndNode}: the orderId of the merge node and then all {@link PhiNode phi |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
93 * mappings} from this end to the merge node are written. <item>{@link LoopExitNode}: the orderId of |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
94 * all {@link ProxyNode proxy nodes} of the loop exit is written.</li> |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
95 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
96 public class GraphEncoder { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
97 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
98 /** The orderId that always represents {@code null}. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
99 public static final int NULL_ORDER_ID = 0; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
100 /** The orderId of the {@link StructuredGraph#start() start node} of the encoded graph. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
101 public static final int START_NODE_ORDER_ID = 1; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
102 /** The orderId of the first actual node after the {@link StructuredGraph#start() start node}. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
103 public static final int FIRST_NODE_ORDER_ID = 2; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
104 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
105 /** |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
106 * The known offset between the orderId of a {@link AbstractBeginNode} and its |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
107 * {@link AbstractBeginNode#next() successor}. |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
108 */ |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
109 protected static final int BEGIN_NEXT_ORDER_ID_OFFSET = 1; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
110 |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
111 protected final Architecture architecture; |
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
112 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
113 /** |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
114 * Collects all non-primitive data referenced from nodes. The encoding uses an index into an |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
115 * array for decoding. Because of the variable-length encoding, it is beneficial that frequently |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
116 * used objects have the small indices. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
117 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
118 protected final FrequencyEncoder<Object> objects; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
119 /** |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
120 * Collects all node classes referenced in graphs. This is necessary because {@link NodeClass} |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
121 * currently does not have a unique id. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
122 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
123 protected final FrequencyEncoder<NodeClass<?>> nodeClasses; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
124 /** The writer for the encoded graphs. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
125 protected final UnsafeArrayTypeWriter writer; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
126 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
127 /** The last snapshot of {@link #objects} that was retrieved. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
128 protected Object[] objectsArray; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
129 /** The last snapshot of {@link #nodeClasses} that was retrieved. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
130 protected NodeClass<?>[] nodeClassesArray; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
131 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
132 /** |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
133 * Utility method that does everything necessary to encode a single graph. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
134 */ |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
135 public static EncodedGraph encodeSingleGraph(StructuredGraph graph, Architecture architecture) { |
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
136 GraphEncoder encoder = new GraphEncoder(architecture); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
137 encoder.prepare(graph); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
138 encoder.finishPrepare(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
139 long startOffset = encoder.encode(graph); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
140 return new EncodedGraph(encoder.getEncoding(), startOffset, encoder.getObjects(), encoder.getNodeClasses(), graph.getAssumptions(), graph.getInlinedMethods()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
141 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
142 |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
143 public GraphEncoder(Architecture architecture) { |
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
144 this.architecture = architecture; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
145 objects = FrequencyEncoder.createEqualityEncoder(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
146 nodeClasses = FrequencyEncoder.createIdentityEncoder(); |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
147 writer = UnsafeArrayTypeWriter.create(architecture.supportsUnalignedMemoryAccess()); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
148 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
149 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
150 /** |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
151 * Must be invoked before {@link #finishPrepare()} and {@link #encode}. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
152 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
153 public void prepare(StructuredGraph graph) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
154 for (Node node : graph.getNodes()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
155 nodeClasses.addObject(node.getNodeClass()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
156 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
157 NodeClass<?> nodeClass = node.getNodeClass(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
158 for (int i = 0; i < nodeClass.getData().getCount(); i++) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
159 if (!nodeClass.getData().getType(i).isPrimitive()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
160 objects.addObject(nodeClass.getData().get(node, i)); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
161 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
162 } |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
163 if (node instanceof Invoke) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
164 objects.addObject(((Invoke) node).getContextType()); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
165 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
166 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
167 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
168 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
169 public void finishPrepare() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
170 objectsArray = objects.encodeAll(new Object[objects.getLength()]); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
171 nodeClassesArray = nodeClasses.encodeAll(new NodeClass[nodeClasses.getLength()]); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
172 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
173 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
174 public Object[] getObjects() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
175 return objectsArray; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
176 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
177 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
178 public NodeClass<?>[] getNodeClasses() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
179 return nodeClassesArray; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
180 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
181 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
182 /** |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
183 * Compresses a graph to a byte array. Multiple graphs can be compressed with the same |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
184 * {@link GraphEncoder}. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
185 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
186 * @param graph The graph to encode |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
187 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
188 public long encode(StructuredGraph graph) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
189 assert objectsArray != null && nodeClassesArray != null : "finishPrepare() must be called before encode()"; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
190 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
191 NodeOrder nodeOrder = new NodeOrder(graph); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
192 int nodeCount = nodeOrder.nextOrderId; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
193 assert nodeOrder.orderIds.get(graph.start()) == START_NODE_ORDER_ID; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
194 assert nodeOrder.orderIds.get(graph.start().next()) == FIRST_NODE_ORDER_ID; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
195 assert nodeCount == graph.getNodeCount() + 1; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
196 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
197 long[] nodeStartOffsets = new long[nodeCount]; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
198 for (Map.Entry<Node, Integer> entry : nodeOrder.orderIds.entries()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
199 Node node = entry.getKey(); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
200 Integer orderId = entry.getValue(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
201 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
202 assert !(node instanceof AbstractBeginNode) || nodeOrder.orderIds.get(((AbstractBeginNode) node).next()) == orderId + BEGIN_NEXT_ORDER_ID_OFFSET; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
203 nodeStartOffsets[orderId] = writer.getBytesWritten(); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
204 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
205 /* Write out the type, properties, and edges. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
206 NodeClass<?> nodeClass = node.getNodeClass(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
207 writer.putUV(nodeClasses.getIndex(nodeClass)); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
208 writeProperties(node, nodeClass.getData()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
209 writeEdges(node, nodeClass.getEdges(Edges.Type.Successors), nodeOrder); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
210 writeEdges(node, nodeClass.getEdges(Edges.Type.Inputs), nodeOrder); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
211 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
212 /* Special handling for some nodes that require additional information for decoding. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
213 if (node instanceof AbstractEndNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
214 AbstractEndNode end = (AbstractEndNode) node; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
215 AbstractMergeNode merge = end.merge(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
216 /* |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
217 * Write the orderId of the merge. The merge is not a successor in the Graal graph |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
218 * (only the merge has an input edge to the EndNode). |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
219 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
220 writeOrderId(merge, nodeOrder); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
221 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
222 /* |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
223 * Write all phi mappings (the oderId of the phi input for this EndNode, and the |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
224 * orderId of the phi node. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
225 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
226 writer.putUV(merge.phis().count()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
227 for (PhiNode phi : merge.phis()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
228 writeOrderId(phi.valueAt(end), nodeOrder); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
229 writeOrderId(phi, nodeOrder); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
230 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
231 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
232 } else if (node instanceof LoopExitNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
233 LoopExitNode exit = (LoopExitNode) node; |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
234 writeOrderId(exit.stateAfter(), nodeOrder); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
235 /* Write all proxy nodes of the LoopExitNode. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
236 writer.putUV(exit.proxies().count()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
237 for (ProxyNode proxy : exit.proxies()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
238 writeOrderId(proxy, nodeOrder); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
239 } |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
240 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
241 } else if (node instanceof Invoke) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
242 Invoke invoke = (Invoke) node; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
243 assert invoke.stateDuring() == null : "stateDuring is not used in high-level graphs"; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
244 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
245 writeObjectId(invoke.getContextType()); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
246 writeOrderId(invoke.callTarget(), nodeOrder); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
247 writeOrderId(invoke.stateAfter(), nodeOrder); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
248 writeOrderId(invoke.next(), nodeOrder); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
249 if (invoke instanceof InvokeWithExceptionNode) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
250 InvokeWithExceptionNode invokeWithExcpetion = (InvokeWithExceptionNode) invoke; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
251 ExceptionObjectNode exceptionEdge = (ExceptionObjectNode) invokeWithExcpetion.exceptionEdge(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
252 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
253 writeOrderId(invokeWithExcpetion.next().next(), nodeOrder); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
254 writeOrderId(invokeWithExcpetion.exceptionEdge(), nodeOrder); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
255 writeOrderId(exceptionEdge.stateAfter(), nodeOrder); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
256 writeOrderId(exceptionEdge.next(), nodeOrder); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
257 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
258 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
259 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
260 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
261 /* Write out the table of contents with the start offset for all nodes. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
262 long nodeTableStart = writer.getBytesWritten(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
263 writer.putUV(nodeCount); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
264 for (int i = 0; i < nodeCount; i++) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
265 assert i == NULL_ORDER_ID || i == START_NODE_ORDER_ID || nodeStartOffsets[i] > 0; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
266 writer.putUV(nodeTableStart - nodeStartOffsets[i]); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
267 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
268 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
269 /* Check that the decoding of the encode graph is the same as the input. */ |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
270 assert verifyEncoding(graph, new EncodedGraph(getEncoding(), nodeTableStart, getObjects(), getNodeClasses(), graph.getAssumptions(), graph.getInlinedMethods()), architecture); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
271 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
272 return nodeTableStart; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
273 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
274 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
275 public byte[] getEncoding() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
276 return writer.toArray(new byte[TypeConversion.asS4(writer.getBytesWritten())]); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
277 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
278 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
279 static class NodeOrder { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
280 protected final NodeMap<Integer> orderIds; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
281 protected int nextOrderId; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
282 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
283 public NodeOrder(StructuredGraph graph) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
284 this.orderIds = new NodeMap<>(graph); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
285 this.nextOrderId = START_NODE_ORDER_ID; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
286 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
287 /* Order the fixed nodes of the graph in reverse postorder. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
288 Deque<AbstractBeginNode> nodeQueue = new ArrayDeque<>(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
289 FixedNode current = graph.start(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
290 do { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
291 add(current); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
292 if (current instanceof AbstractBeginNode) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
293 add(((AbstractBeginNode) current).next()); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
294 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
295 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
296 if (current instanceof FixedWithNextNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
297 current = ((FixedWithNextNode) current).next; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
298 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
299 if (current instanceof ControlSplitNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
300 for (Node successor : current.successors()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
301 if (successor != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
302 nodeQueue.addFirst((AbstractBeginNode) successor); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
303 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
304 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
305 } else if (current instanceof EndNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
306 AbstractMergeNode merge = ((AbstractEndNode) current).merge(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
307 boolean allForwardEndsVisited = true; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
308 for (int i = 0; i < merge.forwardEndCount(); i++) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
309 if (orderIds.get(merge.forwardEndAt(i)) == null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
310 allForwardEndsVisited = false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
311 break; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
312 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
313 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
314 if (allForwardEndsVisited) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
315 nodeQueue.add(merge); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
316 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
317 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
318 current = nodeQueue.pollFirst(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
319 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
320 } while (current != null); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
321 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
322 for (Node node : graph.getNodes()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
323 assert (node instanceof FixedNode) == (orderIds.get(node) != null) : "all fixed nodes must be ordered"; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
324 add(node); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
325 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
326 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
327 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
328 private void add(Node node) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
329 if (orderIds.get(node) == null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
330 orderIds.set(node, nextOrderId); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
331 nextOrderId++; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
332 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
333 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
334 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
335 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
336 protected void writeProperties(Node node, Fields fields) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
337 for (int idx = 0; idx < fields.getCount(); idx++) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
338 if (fields.getType(idx).isPrimitive()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
339 long primitive = fields.getRawPrimitive(node, idx); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
340 writer.putSV(primitive); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
341 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
342 Object property = fields.get(node, idx); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
343 writeObjectId(property); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
344 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
345 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
346 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
347 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
348 protected void writeEdges(Node node, Edges edges, NodeOrder nodeOrder) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
349 for (int idx = 0; idx < edges.getDirectCount(); idx++) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
350 if (GraphDecoder.skipEdge(node, edges, idx, true, false)) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
351 /* Edge is not needed for decoding, so we must not write it. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
352 continue; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
353 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
354 Node edge = Edges.getNode(node, edges.getOffsets(), idx); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
355 writeOrderId(edge, nodeOrder); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
356 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
357 for (int idx = edges.getDirectCount(); idx < edges.getCount(); idx++) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
358 if (GraphDecoder.skipEdge(node, edges, idx, false, false)) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
359 /* Edge is not needed for decoding, so we must not write it. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
360 continue; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
361 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
362 NodeList<Node> edgeList = Edges.getNodeList(node, edges.getOffsets(), idx); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
363 if (edgeList == null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
364 writer.putSV(-1); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
365 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
366 writer.putSV(edgeList.size()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
367 for (Node edge : edgeList) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
368 writeOrderId(edge, nodeOrder); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
369 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
370 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
371 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
372 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
373 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
374 protected void writeOrderId(Node node, NodeOrder nodeOrder) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
375 writer.putUV(node == null ? NULL_ORDER_ID : nodeOrder.orderIds.get(node)); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
376 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
377 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
378 protected void writeObjectId(Object object) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
379 writer.putUV(objects.getIndex(object)); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
380 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
381 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
382 /** |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
383 * Verification code that checks that the decoding of an encode graph is the same as the |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
384 * original graph. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
385 */ |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
386 public static boolean verifyEncoding(StructuredGraph originalGraph, EncodedGraph encodedGraph, Architecture architecture) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
387 StructuredGraph decodedGraph = new StructuredGraph(originalGraph.method(), AllowAssumptions.YES); |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
388 GraphDecoder decoder = new GraphDecoder(architecture); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
389 decoder.decode(decodedGraph, encodedGraph); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
390 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
391 decodedGraph.verify(); |
21107
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
392 try { |
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
393 GraphComparison.verifyGraphsEqual(originalGraph, decodedGraph); |
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
394 } catch (Throwable ex) { |
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
395 try (Debug.Scope scope = Debug.scope("GraphEncoder")) { |
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
396 Debug.dump(originalGraph, "Original Graph"); |
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
397 Debug.dump(decodedGraph, "Decoded Graph"); |
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
398 } |
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
399 throw ex; |
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
400 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
401 return true; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
402 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
403 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
404 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
405 class GraphComparison { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
406 public static boolean verifyGraphsEqual(StructuredGraph expectedGraph, StructuredGraph actualGraph) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
407 NodeMap<Node> nodeMapping = new NodeMap<>(expectedGraph); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
408 Deque<Pair<Node, Node>> workList = new ArrayDeque<>(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
409 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
410 pushToWorklist(expectedGraph.start(), actualGraph.start(), nodeMapping, workList); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
411 while (!workList.isEmpty()) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
412 Pair<Node, Node> pair = workList.removeFirst(); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
413 Node expectedNode = pair.first; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
414 Node actualNode = pair.second; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
415 assert expectedNode.getClass() == actualNode.getClass(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
416 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
417 NodeClass<?> nodeClass = expectedNode.getNodeClass(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
418 assert nodeClass == actualNode.getNodeClass(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
419 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
420 if (expectedNode instanceof MergeNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
421 /* The order of the ends can be different, so ignore them. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
422 verifyNodesEqual(expectedNode.inputs(), actualNode.inputs(), nodeMapping, workList, true); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
423 } else if (expectedNode instanceof PhiNode) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
424 verifyPhi((PhiNode) expectedNode, (PhiNode) actualNode, nodeMapping, workList); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
425 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
426 verifyNodesEqual(expectedNode.inputs(), actualNode.inputs(), nodeMapping, workList, false); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
427 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
428 verifyNodesEqual(expectedNode.successors(), actualNode.successors(), nodeMapping, workList, false); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
429 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
430 if (expectedNode instanceof LoopEndNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
431 LoopEndNode actualLoopEnd = (LoopEndNode) actualNode; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
432 assert actualLoopEnd.loopBegin().loopEnds().snapshot().indexOf(actualLoopEnd) == actualLoopEnd.endIndex(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
433 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
434 for (int i = 0; i < nodeClass.getData().getCount(); i++) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
435 Object expectedProperty = nodeClass.getData().get(expectedNode, i); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
436 Object actualProperty = nodeClass.getData().get(actualNode, i); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
437 assert Objects.equals(expectedProperty, actualProperty); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
438 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
439 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
440 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
441 if (expectedNode instanceof EndNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
442 /* Visit the merge node, which is the one and only usage of the EndNode. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
443 assert expectedNode.usages().count() == 1; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
444 assert actualNode.usages().count() == 1; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
445 verifyNodesEqual(expectedNode.usages(), actualNode.usages(), nodeMapping, workList, false); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
446 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
447 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
448 if (expectedNode instanceof AbstractEndNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
449 /* Visit the input values of the merge phi functions for this EndNode. */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
450 verifyPhis((AbstractEndNode) expectedNode, (AbstractEndNode) actualNode, nodeMapping, workList); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
451 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
452 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
453 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
454 return true; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
455 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
456 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
457 protected static void verifyPhi(PhiNode expectedPhi, PhiNode actualPhi, NodeMap<Node> nodeMapping, Deque<Pair<Node, Node>> workList) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
458 AbstractMergeNode expectedMergeNode = expectedPhi.merge(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
459 AbstractMergeNode actualMergeNode = actualPhi.merge(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
460 assert actualMergeNode == nodeMapping.get(expectedMergeNode); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
461 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
462 for (EndNode expectedEndNode : expectedMergeNode.ends) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
463 EndNode actualEndNode = (EndNode) nodeMapping.get(expectedEndNode); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
464 if (actualEndNode != null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
465 ValueNode expectedPhiInput = expectedPhi.valueAt(expectedEndNode); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
466 ValueNode actualPhiInput = actualPhi.valueAt(actualEndNode); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
467 verifyNodeEqual(expectedPhiInput, actualPhiInput, nodeMapping, workList, false); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
468 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
469 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
470 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
471 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
472 protected static void verifyPhis(AbstractEndNode expectedEndNode, AbstractEndNode actualEndNode, NodeMap<Node> nodeMapping, Deque<Pair<Node, Node>> workList) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
473 AbstractMergeNode expectedMergeNode = expectedEndNode.merge(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
474 AbstractMergeNode actualMergeNode = (AbstractMergeNode) nodeMapping.get(expectedMergeNode); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
475 assert actualMergeNode != null; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
476 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
477 for (PhiNode expectedPhi : expectedMergeNode.phis()) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
478 PhiNode actualPhi = (PhiNode) nodeMapping.get(expectedPhi); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
479 if (actualPhi != null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
480 ValueNode expectedPhiInput = expectedPhi.valueAt(expectedEndNode); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
481 ValueNode actualPhiInput = actualPhi.valueAt(actualEndNode); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
482 verifyNodeEqual(expectedPhiInput, actualPhiInput, nodeMapping, workList, false); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
483 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
484 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
485 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
486 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
487 private static void verifyNodesEqual(NodeIterable<Node> expectedNodes, NodeIterable<Node> actualNodes, NodeMap<Node> nodeMapping, Deque<Pair<Node, Node>> workList, boolean ignoreEndNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
488 Iterator<Node> actualIter = actualNodes.iterator(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
489 for (Node expectedNode : expectedNodes) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
490 verifyNodeEqual(expectedNode, actualIter.next(), nodeMapping, workList, ignoreEndNode); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
491 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
492 assert !actualIter.hasNext(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
493 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
494 |
21107
fe0531d98fbe
GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21075
diff
changeset
|
495 protected static void verifyNodeEqual(Node expectedNode, Node actualNode, NodeMap<Node> nodeMapping, Deque<Pair<Node, Node>> workList, boolean ignoreEndNode) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
496 assert expectedNode.getClass() == actualNode.getClass(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
497 if (ignoreEndNode && expectedNode instanceof EndNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
498 return; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
499 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
500 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
501 Node existing = nodeMapping.get(expectedNode); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
502 if (existing != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
503 assert existing == actualNode; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
504 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
505 pushToWorklist(expectedNode, actualNode, nodeMapping, workList); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
506 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
507 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
508 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
509 protected static void pushToWorklist(Node expectedNode, Node actualNode, NodeMap<Node> nodeMapping, Deque<Pair<Node, Node>> workList) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
510 nodeMapping.set(expectedNode, actualNode); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
511 if (expectedNode instanceof AbstractEndNode) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
512 /* To ensure phi nodes have been added, we handle everything before block ends. */ |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
513 workList.addLast(new Pair<>(expectedNode, actualNode)); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
514 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
515 workList.addFirst(new Pair<>(expectedNode, actualNode)); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20827
diff
changeset
|
516 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
517 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
518 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
519 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
520 class Pair<F, S> { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
521 public final F first; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
522 public final S second; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
523 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
524 public Pair(F first, S second) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
525 this.first = first; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
526 this.second = second; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
527 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
528 } |