src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphEncoder.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphEncoder.java Mon Aug 28 14:09:43 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphEncoder.java Mon Aug 28 14:09:42 2017
*** 207,225 ****
--- 207,225 ----
NodeOrder nodeOrder = new NodeOrder(graph);
int nodeCount = nodeOrder.nextOrderId;
assert nodeOrder.orderIds.get(graph.start()) == START_NODE_ORDER_ID;
assert nodeOrder.orderIds.get(graph.start().next()) == FIRST_NODE_ORDER_ID;
assert nodeCount == graph.getNodeCount() + 1;
long[] nodeStartOffsets = new long[nodeCount];
UnmodifiableMapCursor<Node, Integer> cursor = nodeOrder.orderIds.getEntries();
while (cursor.advance()) {
Node node = cursor.getKey();
Integer orderId = cursor.getValue();
assert !(node instanceof AbstractBeginNode) || nodeOrder.orderIds.get(((AbstractBeginNode) node).next()) == orderId + BEGIN_NEXT_ORDER_ID_OFFSET;
+ assert nodeStartOffsets[orderId] == 0;
nodeStartOffsets[orderId] = writer.getBytesWritten();
/* Write out the type, properties, and edges. */
NodeClass<?> nodeClass = node.getNodeClass();
writer.putUV(nodeClasses.getIndex(nodeClass));
*** 282,292 ****
--- 282,291 ----
*/
int metadataStart = TypeConversion.asS4(writer.getBytesWritten());
writer.putUV(nodeOrder.maxFixedNodeOrderId);
writer.putUV(nodeCount);
for (int i = 0; i < nodeCount; i++) {
assert i == NULL_ORDER_ID || i == START_NODE_ORDER_ID || nodeStartOffsets[i] > 0;
writer.putUV(metadataStart - nodeStartOffsets[i]);
}
/* Check that the decoding of the encode graph is the same as the input. */
assert verifyEncoding(graph, new EncodedGraph(getEncoding(), metadataStart, getObjects(), getNodeClasses(), graph.getAssumptions(), graph.getMethods()),
*** 342,353 ****
--- 341,369 ----
current = nodeQueue.pollFirst();
}
} while (current != null);
maxFixedNodeOrderId = nextOrderId - 1;
+
+ /*
+ * Emit all parameters consecutively at a known location (after all fixed nodes). This
+ * allows substituting parameters when inlining during decoding by pre-initializing the
+ * decoded node list.
+ *
+ * Note that not all parameters must be present (unused parameters are deleted after
+ * parsing). This leads to holes in the orderId, i.e., unused orderIds.
+ */
+ int parameterCount = graph.method().getSignature().getParameterCount(!graph.method().isStatic());
+ for (ParameterNode node : graph.getNodes(ParameterNode.TYPE)) {
+ assert orderIds.get(node) == null : "Parameter node must not be ordered yet";
+ assert node.index() < parameterCount : "Parameter index out of range";
+ orderIds.set(node, nextOrderId + node.index());
+ }
+ nextOrderId += parameterCount;
+
for (Node node : graph.getNodes()) {
! assert (node instanceof FixedNode || node instanceof ParameterNode) == (orderIds.get(node) != null) : "all fixed nodes and ParameterNodes must be ordered: " + node;
add(node);
}
}
private void add(Node node) {
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphEncoder.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File