Skip to content

Commit 02c88ee

Browse files
committed
add NodeClassMap and remove EncodedGraph.types
1 parent c4f350b commit 02c88ee

File tree

13 files changed

+208
-89
lines changed

13 files changed

+208
-89
lines changed

compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalFeature.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import java.lang.reflect.Constructor;
3232
import java.lang.reflect.Field;
3333
import java.lang.reflect.Method;
34-
import java.lang.reflect.Modifier;
3534
import java.nio.file.Path;
3635
import java.util.ArrayList;
3736
import java.util.Collections;
@@ -199,7 +198,7 @@ public void duringSetup(DuringSetupAccess access) {
199198
// (see jdk.graal.compiler.graph.NodeClass.allocateInstance).
200199
access.registerObjectReachabilityHandler(nodeClass -> {
201200
Class<?> clazz = nodeClass.getClazz();
202-
if (!Modifier.isAbstract(clazz.getModifiers())) {
201+
if (!nodeClass.isAbstract()) {
203202
/* Support for NodeClass.allocateInstance. */
204203
beforeAnalysisAccess.registerAsUnsafeAllocated(clazz);
205204
}
@@ -375,9 +374,12 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
375374
EncodedSnippets encodedSnippets = (EncodedSnippets) libgraalObjects.get("encodedSnippets");
376375
checkNodeClasses(encodedSnippets, (String) libgraalObjects.get("snippetNodeClasses"));
377376

378-
// Mark all the Node classes as allocated so they are available during graph decoding.
377+
// Mark all non-abstract Node classes as allocated so they
378+
// are available during graph decoding.
379379
for (NodeClass<?> nodeClass : encodedSnippets.getSnippetNodeClasses()) {
380-
access.registerAsInHeap(nodeClass.getClazz());
380+
if (!nodeClass.isAbstract()) {
381+
access.registerAsInHeap(nodeClass.getClazz());
382+
}
381383
}
382384
HotSpotReplacementsImpl.setEncodedSnippets(encodedSnippets);
383385

@@ -389,7 +391,7 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
389391

390392
private static void checkNodeClasses(EncodedSnippets encodedSnippets, String actual) {
391393
String expect = CompilerConfig.snippetNodeClassesToJSON(encodedSnippets);
392-
GraalError.guarantee(actual.equals(expect), "%s != %s", actual, expect);
394+
GraalError.guarantee(actual.equals(expect), "%n%s%n !=%n%s", actual, expect);
393395
}
394396

395397
/**

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/graph/NodeClass.java

+9-10
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,9 @@ public static <T> NodeClass<T> get(Class<T> clazz) {
149149

150150
private final int leafId;
151151

152-
@LibGraalSupport.HostedOnly
153-
public NodeClass(Class<T> clazz, NodeClass<? super T> superNodeClass) {
154-
this(clazz, superNodeClass, null, 0);
155-
}
156-
157152
@SuppressWarnings("try")
158153
@LibGraalSupport.HostedOnly
159-
private NodeClass(Class<T> clazz, NodeClass<? super T> superNodeClass, int[] presetIterableIds, int presetIterableId) {
154+
public NodeClass(Class<T> clazz, NodeClass<? super T> superNodeClass) {
160155
super(clazz);
161156
DebugContext debug = DebugContext.forCurrentThread();
162157
this.superNodeClass = superNodeClass;
@@ -201,10 +196,7 @@ private NodeClass(Class<T> clazz, NodeClass<? super T> superNodeClass, int[] pre
201196
GraalError.guarantee(!allowedUsageTypes.contains(InputType.Memory) || MemoryKillMarker.class.isAssignableFrom(clazz),
202197
"Node of type %s with allowedUsageType of memory must inherit from MemoryKill", clazz);
203198

204-
if (presetIterableIds != null) {
205-
this.iterableIds = presetIterableIds;
206-
this.iterableId = presetIterableId;
207-
} else if (IterableNodeType.class.isAssignableFrom(clazz)) {
199+
if (IterableNodeType.class.isAssignableFrom(clazz)) {
208200
ITERABLE_NODE_TYPES.increment(debug);
209201
this.iterableId = nextIterableId.getAndIncrement();
210202

@@ -332,6 +324,13 @@ public boolean valueNumberable() {
332324
return canGVN;
333325
}
334326

327+
/**
328+
* Determines if this node type is abstract.
329+
*/
330+
public boolean isAbstract() {
331+
return Modifier.isAbstract(this.getClazz().getModifiers());
332+
}
333+
335334
/**
336335
* Determines if this node type is {@link CanonicalizableMarker canonicalizable}.
337336
*/

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/CompilerConfig.java

+6
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.List;
3535
import java.util.Locale;
3636

37+
import jdk.graal.compiler.nodes.GraphEncoder;
3738
import org.graalvm.collections.EconomicMap;
3839
import org.graalvm.collections.MapCursor;
3940

@@ -81,6 +82,11 @@ public static void main(String[] args) throws Exception {
8182
EncodedSnippets encodedSnippets = getEncodedSnippets(replacements, options);
8283
List<Field> externalValueFields = ObjectCopier.getExternalValueFields();
8384

85+
// The NodeClassMap value read from GraphEncoder.GLOBAL_NODE_CLASS_MAP
86+
// must not be treated as an external value when being serialized
87+
// across processes.
88+
externalValueFields.remove(ObjectCopier.getField(GraphEncoder.class, "GLOBAL_NODE_CLASS_MAP"));
89+
8490
EconomicMap<String, Object> encodedObjects = EconomicMap.create();
8591
encodedObjects.put("encodedSnippets", encodedSnippets);
8692
encodedObjects.put("snippetNodeClasses", snippetNodeClassesToJSON(encodedSnippets));

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/EncodedSnippets.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.concurrent.ConcurrentHashMap;
3333

3434
import jdk.graal.compiler.core.common.LibGraalSupport;
35+
import jdk.graal.compiler.nodes.NodeClassMap;
3536
import org.graalvm.collections.UnmodifiableEconomicMap;
3637

3738
import jdk.graal.compiler.api.replacements.SnippetReflectionProvider;
@@ -42,7 +43,6 @@
4243
import jdk.graal.compiler.core.common.type.SymbolicJVMCIReference;
4344
import jdk.graal.compiler.debug.DebugContext;
4445
import jdk.graal.compiler.debug.GraalError;
45-
import jdk.graal.compiler.graph.NodeClass;
4646
import jdk.graal.compiler.nodeinfo.Verbosity;
4747
import jdk.graal.compiler.nodes.ConstantNode;
4848
import jdk.graal.compiler.nodes.EncodedGraph;
@@ -170,11 +170,11 @@ int getStartOffset(Class<?> aClass) {
170170

171171
private final byte[] snippetEncoding;
172172
private final Object[] snippetObjects;
173-
private final NodeClass<?>[] snippetNodeClasses;
173+
private final NodeClassMap snippetNodeClasses;
174174
private final UnmodifiableEconomicMap<String, GraphData> graphDatas;
175175
private final UnmodifiableEconomicMap<Class<?>, SnippetResolvedJavaType> snippetTypes;
176176

177-
EncodedSnippets(byte[] snippetEncoding, Object[] snippetObjects, NodeClass<?>[] snippetNodeClasses, UnmodifiableEconomicMap<String, GraphData> graphDatas,
177+
EncodedSnippets(byte[] snippetEncoding, Object[] snippetObjects, NodeClassMap snippetNodeClasses, UnmodifiableEconomicMap<String, GraphData> graphDatas,
178178
UnmodifiableEconomicMap<Class<?>, SnippetResolvedJavaType> snippetTypes) {
179179
this.snippetEncoding = snippetEncoding;
180180
this.snippetObjects = snippetObjects;
@@ -183,7 +183,7 @@ int getStartOffset(Class<?> aClass) {
183183
this.snippetTypes = snippetTypes;
184184
}
185185

186-
public NodeClass<?>[] getSnippetNodeClasses() {
186+
public NodeClassMap getSnippetNodeClasses() {
187187
return snippetNodeClasses;
188188
}
189189

@@ -398,8 +398,8 @@ static class SymbolicEncodedGraph extends EncodedGraph {
398398
private final ResolvedJavaType[] accessingClasses;
399399
private final String originalMethod;
400400

401-
SymbolicEncodedGraph(byte[] encoding, int startOffset, Object[] objects, NodeClass<?>[] types, String originalMethod, ResolvedJavaType... accessingClasses) {
402-
super(encoding, startOffset, objects, types, null, null, false, false);
401+
SymbolicEncodedGraph(byte[] encoding, int startOffset, Object[] objects, NodeClassMap nodeClasses, String originalMethod, ResolvedJavaType... accessingClasses) {
402+
super(encoding, startOffset, objects, nodeClasses, null, null, false, false);
403403
this.accessingClasses = accessingClasses;
404404
this.originalMethod = originalMethod;
405405
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SymbolicSnippetEncoder.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ private boolean verifySingle(DebugContext debug, StructuredGraph graph) {
513513
}
514514

515515
private synchronized EncodedSnippets encodeSnippets(DebugContext debug, EconomicMap<SnippetKey, StructuredGraph> preparedSnippetGraphs) {
516-
GraphEncoder encoder = new GraphEncoder(HotSpotJVMCIRuntime.runtime().getHostJVMCIBackend().getTarget().arch, debug);
516+
GraphEncoder encoder = new GraphEncoder(HotSpotJVMCIRuntime.runtime().getHostJVMCIBackend().getTarget().arch, debug, null);
517517
for (StructuredGraph graph : preparedSnippetGraphs.getValues()) {
518518
graph.resetDebug(debug);
519519
assert verifySingle(debug, graph);
@@ -549,6 +549,7 @@ private synchronized EncodedSnippets encodeSnippets(DebugContext debug, Economic
549549
debug.log("snippetObjects[%d] = %s -> %s", i, o != null ? o.getClass().getSimpleName() : null, o);
550550
snippetObjects[i] = o;
551551
}
552+
552553
debug.log("Encoded %d snippet preparedSnippetGraphs using %d bytes with %d objects", graphDatas.size(), snippetEncoding.length, snippetObjects.length);
553554
return new EncodedSnippets(snippetEncoding, snippetObjects, encoder.getNodeClasses(), graphDatas, snippetTypes);
554555
}
@@ -816,8 +817,7 @@ private Object filterStamp(DebugContext debug, Stamp stamp) {
816817
if (cached != null) {
817818
return cached;
818819
}
819-
if (stamp instanceof AbstractObjectStamp) {
820-
AbstractObjectStamp objectStamp = (AbstractObjectStamp) stamp;
820+
if (stamp instanceof AbstractObjectStamp objectStamp) {
821821
ResolvedJavaType type = objectStamp.type();
822822
if (type == null) {
823823
return stamp;
@@ -959,7 +959,7 @@ private static String getCanonicalGraphString(StructuredGraph graph, boolean exc
959959
constantsLinesResult.append('\n');
960960
}
961961

962-
return constantsLinesResult.toString() + result.toString();
962+
return constantsLinesResult + result.toString();
963963
}
964964

965965
private static int filteredUsageCount(Node node) {

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/EncodedGraph.java

+12-8
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void clear() {
8383
private final byte[] encoding;
8484
private final int startOffset;
8585
protected final Object[] objects;
86-
private final NodeClass<?>[] types;
86+
private final NodeClassMap nodeClasses;
8787
private final Assumptions assumptions;
8888
private final List<ResolvedJavaMethod> inlinedMethods;
8989
private final boolean trackNodeSourcePosition;
@@ -95,11 +95,11 @@ public void clear() {
9595
*/
9696
protected int[] nodeStartOffsets;
9797

98-
public EncodedGraph(byte[] encoding, int startOffset, Object[] objects, NodeClass<?>[] types, StructuredGraph sourceGraph) {
98+
public EncodedGraph(byte[] encoding, int startOffset, Object[] objects, NodeClassMap nodeClasses, StructuredGraph sourceGraph) {
9999
this(encoding,
100100
startOffset,
101101
objects,
102-
types,
102+
nodeClasses,
103103
sourceGraph.getAssumptions(),
104104
sourceGraph.isRecordingInlinedMethods() ? sourceGraph.getMethods() : null,
105105
sourceGraph.hasUnsafeAccess(),
@@ -110,7 +110,7 @@ public EncodedGraph(EncodedGraph original) {
110110
this(original.encoding,
111111
original.startOffset,
112112
original.objects,
113-
original.types,
113+
original.nodeClasses,
114114
original.assumptions,
115115
original.inlinedMethods,
116116
original.hasUnsafeAccess,
@@ -122,12 +122,12 @@ public EncodedGraph(EncodedGraph original) {
122122
this.nodeStartOffsets = null;
123123
}
124124

125-
public EncodedGraph(byte[] encoding, int startOffset, Object[] objects, NodeClass<?>[] types, Assumptions assumptions, List<ResolvedJavaMethod> inlinedMethods,
125+
public EncodedGraph(byte[] encoding, int startOffset, Object[] objects, NodeClassMap nodeClasses, Assumptions assumptions, List<ResolvedJavaMethod> inlinedMethods,
126126
boolean hasUnsafeAccess, boolean trackNodeSourcePosition) {
127127
this.encoding = encoding;
128128
this.startOffset = startOffset;
129129
this.objects = objects;
130-
this.types = types;
130+
this.nodeClasses = nodeClasses;
131131
this.assumptions = assumptions;
132132
this.inlinedMethods = inlinedMethods;
133133
this.trackNodeSourcePosition = trackNodeSourcePosition;
@@ -158,8 +158,12 @@ public void setObject(int i, Object object) {
158158
objects[i] = object;
159159
}
160160

161-
public NodeClass<?>[] getNodeClasses() {
162-
return types;
161+
public NodeClassMap getNodeClasses() {
162+
return nodeClasses;
163+
}
164+
165+
public NodeClass<?> getNodeClass(int id) {
166+
return nodeClasses.get(id);
163167
}
164168

165169
public Assumptions getAssumptions() {

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/GraphDecoder.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ protected LoopScope processNextNode(MethodScope methodScope, LoopScope loopScope
797797

798798
methodScope.reader.setByteIndex(methodScope.encodedGraph.nodeStartOffsets[nodeOrderId]);
799799
int typeId = methodScope.reader.getUVInt();
800-
assert node.getNodeClass() == methodScope.encodedGraph.getNodeClasses()[typeId] : Assertions.errorMessage(node, methodScope.encodedGraph.getNodeClasses()[typeId]);
800+
assert node.getNodeClass() == methodScope.encodedGraph.getNodeClass(typeId) : Assertions.errorMessage(node, methodScope.encodedGraph.getNodeClass(typeId));
801801
makeFixedNodeInputs(methodScope, loopScope, node);
802802
readProperties(methodScope, node);
803803

@@ -1597,7 +1597,7 @@ protected Node decodeFloatingNode(MethodScope methodScope, LoopScope loopScope,
15971597
long readerByteIndex = methodScope.reader.getByteIndex();
15981598

15991599
methodScope.reader.setByteIndex(methodScope.encodedGraph.nodeStartOffsets[nodeOrderId]);
1600-
NodeClass<?> nodeClass = methodScope.encodedGraph.getNodeClasses()[methodScope.reader.getUVInt()];
1600+
NodeClass<?> nodeClass = methodScope.encodedGraph.getNodeClass(methodScope.reader.getUVInt());
16011601
Node node = allocateFloatingNode(nodeClass);
16021602
if (node instanceof FixedNode) {
16031603
/*
@@ -1715,7 +1715,7 @@ protected NodeClass<?> getNodeClass(MethodScope methodScope, LoopScope loopScope
17151715

17161716
long readerByteIndex = methodScope.reader.getByteIndex();
17171717
methodScope.reader.setByteIndex(methodScope.encodedGraph.nodeStartOffsets[nodeOrderId]);
1718-
NodeClass<?> nodeClass = methodScope.encodedGraph.getNodeClasses()[methodScope.reader.getUVInt()];
1718+
NodeClass<?> nodeClass = methodScope.encodedGraph.getNodeClass(methodScope.reader.getUVInt());
17191719
methodScope.reader.setByteIndex(readerByteIndex);
17201720
return nodeClass;
17211721
}
@@ -1731,7 +1731,7 @@ protected FixedNode makeStubNode(MethodScope methodScope, LoopScope loopScope, i
17311731

17321732
long readerByteIndex = methodScope.reader.getByteIndex();
17331733
methodScope.reader.setByteIndex(methodScope.encodedGraph.nodeStartOffsets[nodeOrderId]);
1734-
NodeClass<?> nodeClass = methodScope.encodedGraph.getNodeClasses()[methodScope.reader.getUVInt()];
1734+
NodeClass<?> nodeClass = methodScope.encodedGraph.getNodeClass(methodScope.reader.getUVInt());
17351735
Node stubNode = nodeClass.allocateInstance();
17361736
if (graph.trackNodeSourcePosition()) {
17371737
stubNode.setNodeSourcePosition(NodeSourcePosition.placeholder(graph.method()));

0 commit comments

Comments
 (0)