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