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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }