Skip to content

Commit b215a73

Browse files
committed
Parser speeedups
1 parent 4501ea2 commit b215a73

File tree

5 files changed

+197
-101
lines changed

5 files changed

+197
-101
lines changed

visualizer/IdealGraphVisualizer/Data/src/main/java/jdk/graal/compiler/graphio/parsing/BinaryReader.java

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,31 @@
2424
*/
2525
package jdk.graal.compiler.graphio.parsing;
2626

27+
import jdk.graal.compiler.graphio.parsing.Builder.Length;
28+
import jdk.graal.compiler.graphio.parsing.Builder.LengthToString;
29+
import jdk.graal.compiler.graphio.parsing.Builder.ModelControl;
30+
import jdk.graal.compiler.graphio.parsing.Builder.Node;
31+
import jdk.graal.compiler.graphio.parsing.Builder.NodeClass;
32+
import jdk.graal.compiler.graphio.parsing.Builder.Port;
33+
import jdk.graal.compiler.graphio.parsing.Builder.TypedPort;
34+
import jdk.graal.compiler.graphio.parsing.model.GraphDocument;
35+
import jdk.graal.compiler.graphio.parsing.model.Group;
36+
import jdk.graal.compiler.graphio.parsing.model.InputGraph;
37+
38+
import java.io.EOFException;
39+
import java.io.IOException;
40+
import java.util.ArrayList;
41+
import java.util.Arrays;
42+
import java.util.Deque;
43+
import java.util.LinkedList;
44+
import java.util.List;
45+
import java.util.Objects;
46+
import java.util.function.BiConsumer;
47+
import java.util.function.Function;
48+
import java.util.function.Supplier;
49+
import java.util.logging.Level;
50+
import java.util.logging.Logger;
51+
2752
import static jdk.graal.compiler.graphio.parsing.BinaryStreamDefs.BEGIN_GRAPH;
2853
import static jdk.graal.compiler.graphio.parsing.BinaryStreamDefs.BEGIN_GROUP;
2954
import static jdk.graal.compiler.graphio.parsing.BinaryStreamDefs.CLOSE_GROUP;
@@ -51,31 +76,6 @@
5176
import static jdk.graal.compiler.graphio.parsing.BinaryStreamDefs.PROPERTY_TRUE;
5277
import static jdk.graal.compiler.graphio.parsing.BinaryStreamDefs.STREAM_PROPERTIES;
5378

54-
import java.io.EOFException;
55-
import java.io.IOException;
56-
import java.util.ArrayList;
57-
import java.util.Arrays;
58-
import java.util.Deque;
59-
import java.util.LinkedList;
60-
import java.util.List;
61-
import java.util.Objects;
62-
import java.util.function.BiConsumer;
63-
import java.util.function.Function;
64-
import java.util.function.Supplier;
65-
import java.util.logging.Level;
66-
import java.util.logging.Logger;
67-
68-
import jdk.graal.compiler.graphio.parsing.Builder.Length;
69-
import jdk.graal.compiler.graphio.parsing.Builder.LengthToString;
70-
import jdk.graal.compiler.graphio.parsing.Builder.ModelControl;
71-
import jdk.graal.compiler.graphio.parsing.Builder.Node;
72-
import jdk.graal.compiler.graphio.parsing.Builder.NodeClass;
73-
import jdk.graal.compiler.graphio.parsing.Builder.Port;
74-
import jdk.graal.compiler.graphio.parsing.Builder.TypedPort;
75-
import jdk.graal.compiler.graphio.parsing.model.GraphDocument;
76-
import jdk.graal.compiler.graphio.parsing.model.Group;
77-
import jdk.graal.compiler.graphio.parsing.model.InputGraph;
78-
7979
/**
8080
* The class reads the Graal binary dump format. All model object creation or property value
8181
* computation / logic is delegated to the {@link ModelBuilder} class. While the BinaryReader should
@@ -474,15 +474,33 @@ public boolean equals(Object obj) {
474474

475475
public static final class EnumKlass extends Klass {
476476
public final String[] values;
477+
public final EnumValue[] enums;
478+
private volatile int hashCode = 0;
477479

478480
public EnumKlass(String name, String[] values) {
479481
super(name);
480482
this.values = values;
483+
this.enums = new EnumValue[values.length];
484+
for (int i = 0; i < values.length; i++) {
485+
this.enums[i] = new EnumValue(this, i);
486+
}
487+
}
488+
489+
EnumValue get(int ordinal) {
490+
if (ordinal >= 0 && ordinal < enums.length) {
491+
return enums[ordinal];
492+
}
493+
return new EnumValue(this, ordinal);
481494
}
482495

483496
@Override
484497
public int hashCode() {
485-
return super.hash * 31 + Arrays.hashCode(values);
498+
int h = hashCode;
499+
if (h == 0) {
500+
h = Objects.hash(super.hashCode(), Arrays.hashCode(values));
501+
hashCode = h;
502+
}
503+
return h;
486504
}
487505

488506
@Override
@@ -648,7 +666,7 @@ private Object addPoolEntry(Class<?> klass) throws IOException {
648666
case POOL_ENUM: {
649667
EnumKlass enumClass = readPoolObject(EnumKlass.class);
650668
int ordinal = dataSource.readInt();
651-
obj = new EnumValue(enumClass, ordinal);
669+
obj = enumClass.get(ordinal);
652670
break;
653671
}
654672
case POOL_NODE_CLASS: {

visualizer/IdealGraphVisualizer/Data/src/main/java/jdk/graal/compiler/graphio/parsing/Builder.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,21 @@
2525

2626
package jdk.graal.compiler.graphio.parsing;
2727

28-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyValues.CLASS_ENDNODE;
29-
30-
import java.util.ArrayList;
31-
import java.util.List;
32-
import java.util.Objects;
33-
3428
import jdk.graal.compiler.graphio.parsing.BinaryReader.EnumValue;
3529
import jdk.graal.compiler.graphio.parsing.BinaryReader.Method;
30+
import jdk.graal.compiler.graphio.parsing.TemplateParser.TemplatePart;
3631
import jdk.graal.compiler.graphio.parsing.model.GraphDocument;
3732
import jdk.graal.compiler.graphio.parsing.model.Group;
3833
import jdk.graal.compiler.graphio.parsing.model.InputBlock;
3934
import jdk.graal.compiler.graphio.parsing.model.InputGraph;
4035
import jdk.graal.compiler.graphio.parsing.model.Properties;
4136

37+
import java.util.ArrayList;
38+
import java.util.List;
39+
import java.util.Objects;
40+
41+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyValues.CLASS_ENDNODE;
42+
4243
/**
4344
* Interface for building IGV data from the stream.
4445
*/
@@ -219,16 +220,23 @@ public String toString() {
219220
final class NodeClass {
220221
public final String className;
221222
public final String nameTemplate;
223+
private final List<TemplatePart> templateParts;
222224
public final List<TypedPort> inputs;
223225
public final List<Port> sux;
226+
private String shortString;
224227

225228
NodeClass(String className, String nameTemplate, List<TypedPort> inputs, List<Port> sux) {
226229
this.className = className;
227230
this.nameTemplate = nameTemplate;
231+
this.templateParts = jdk.graal.compiler.graphio.parsing.TemplateParser.parseTemplate(nameTemplate);
228232
this.inputs = inputs;
229233
this.sux = sux;
230234
}
231235

236+
public List<TemplatePart> getTemplateParts() {
237+
return templateParts;
238+
}
239+
232240
@Override
233241
public String toString() {
234242
return className;
@@ -265,13 +273,18 @@ public boolean equals(Object obj) {
265273
}
266274

267275
String toShortString() {
268-
int lastDot = className.lastIndexOf('.');
269-
String localShortName = className.substring(lastDot + 1);
270-
if (localShortName.endsWith("Node") && !localShortName.equals("StartNode") && !localShortName.equals(CLASS_ENDNODE)) {
271-
return localShortName.substring(0, localShortName.length() - 4);
272-
} else {
273-
return localShortName;
276+
String s = shortString;
277+
if (s == null) {
278+
int lastDot = className.lastIndexOf('.');
279+
String localShortName = className.substring(lastDot + 1);
280+
if (localShortName.endsWith("Node") && !localShortName.equals("StartNode") && !localShortName.equals(CLASS_ENDNODE)) {
281+
s = localShortName.substring(0, localShortName.length() - 4);
282+
} else {
283+
s = localShortName;
284+
}
285+
shortString = s;
274286
}
287+
return shortString;
275288
}
276289
}
277290
}

visualizer/IdealGraphVisualizer/Data/src/main/java/jdk/graal/compiler/graphio/parsing/ModelBuilder.java

Lines changed: 45 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,19 @@
2525

2626
package jdk.graal.compiler.graphio.parsing;
2727

28-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_BLOCK;
29-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_CLASS;
30-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_DUPLICATE;
31-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_HAS_PREDECESSOR;
32-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_ID;
33-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_IDX;
34-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_NAME;
35-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_SHORT_NAME;
36-
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyValues.CLASS_ENDNODE;
28+
import jdk.graal.compiler.graphio.parsing.BinaryReader.EnumValue;
29+
import jdk.graal.compiler.graphio.parsing.BinaryReader.Method;
30+
import jdk.graal.compiler.graphio.parsing.model.Folder;
31+
import jdk.graal.compiler.graphio.parsing.model.FolderElement;
32+
import jdk.graal.compiler.graphio.parsing.model.GraphClassifier;
33+
import jdk.graal.compiler.graphio.parsing.model.GraphDocument;
34+
import jdk.graal.compiler.graphio.parsing.model.Group;
35+
import jdk.graal.compiler.graphio.parsing.model.InputBlock;
36+
import jdk.graal.compiler.graphio.parsing.model.InputEdge;
37+
import jdk.graal.compiler.graphio.parsing.model.InputGraph;
38+
import jdk.graal.compiler.graphio.parsing.model.InputMethod;
39+
import jdk.graal.compiler.graphio.parsing.model.InputNode;
40+
import jdk.graal.compiler.graphio.parsing.model.Properties;
3741

3842
import java.util.ArrayDeque;
3943
import java.util.ArrayList;
@@ -47,22 +51,16 @@
4751
import java.util.Objects;
4852
import java.util.Set;
4953
import java.util.logging.Logger;
50-
import java.util.regex.Matcher;
51-
import java.util.regex.Pattern;
5254

53-
import jdk.graal.compiler.graphio.parsing.BinaryReader.EnumValue;
54-
import jdk.graal.compiler.graphio.parsing.BinaryReader.Method;
55-
import jdk.graal.compiler.graphio.parsing.model.Folder;
56-
import jdk.graal.compiler.graphio.parsing.model.FolderElement;
57-
import jdk.graal.compiler.graphio.parsing.model.GraphClassifier;
58-
import jdk.graal.compiler.graphio.parsing.model.GraphDocument;
59-
import jdk.graal.compiler.graphio.parsing.model.Group;
60-
import jdk.graal.compiler.graphio.parsing.model.InputBlock;
61-
import jdk.graal.compiler.graphio.parsing.model.InputEdge;
62-
import jdk.graal.compiler.graphio.parsing.model.InputGraph;
63-
import jdk.graal.compiler.graphio.parsing.model.InputMethod;
64-
import jdk.graal.compiler.graphio.parsing.model.InputNode;
65-
import jdk.graal.compiler.graphio.parsing.model.Properties;
55+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_BLOCK;
56+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_CLASS;
57+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_DUPLICATE;
58+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_HAS_PREDECESSOR;
59+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_ID;
60+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_IDX;
61+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_NAME;
62+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyNames.PROPNAME_SHORT_NAME;
63+
import static jdk.graal.compiler.graphio.parsing.model.KnownPropertyValues.CLASS_ENDNODE;
6664

6765
/**
6866
* Builds a model based on SAX-like events. The expected sequence of events is:
@@ -684,7 +682,7 @@ protected final void reportProgress() {
684682
@Override
685683
public void setNodeName(NodeClass nodeClass) {
686684
assert currentNode != null;
687-
getProperties().setProperty(PROPNAME_NAME, createName(nodeClass, nodeEdges, nodeClass.nameTemplate));
685+
getProperties().setProperty(PROPNAME_NAME, createName(nodeClass, nodeEdges));
688686
getProperties().setProperty(PROPNAME_CLASS, nodeClass.className);
689687
switch (nodeClass.className) {
690688
case "BeginNode":
@@ -696,35 +694,38 @@ public void setNodeName(NodeClass nodeClass) {
696694
}
697695
}
698696

699-
static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\{([pi])#([a-zA-Z0-9$_]+)(/([lms]))?}");
700-
701-
private String createName(NodeClass nodeClass, List<EdgeInfo> edges, String template) {
702-
if (template.isEmpty()) {
697+
private String createName(NodeClass nodeClass, List<EdgeInfo> edges) {
698+
if (nodeClass.nameTemplate.isEmpty()) {
703699
return nodeClass.toShortString();
704700
}
705-
Matcher m = TEMPLATE_PATTERN.matcher(template);
706-
StringBuilder sb = new StringBuilder();
701+
702+
StringBuilder sb = new StringBuilder(nodeClass.nameTemplate.length());
707703
Properties p = getProperties();
708-
while (m.find()) {
709-
String name = m.group(2);
710-
String type = m.group(1);
711-
String result;
704+
List<TemplateParser.TemplatePart> templateParts = nodeClass.getTemplateParts();
705+
for (TemplateParser.TemplatePart template : templateParts) {
706+
if (!template.isReplacement) {
707+
sb.append(template.value);
708+
continue;
709+
}
710+
String name = template.name;
711+
String type = template.type;
712712
switch (type) {
713713
case "i":
714-
StringBuilder inputString = new StringBuilder();
714+
boolean first = true;
715715
for (EdgeInfo edge : edges) {
716716
if (edge.label.startsWith(name) && (name.length() == edge.label.length() || edge.label.charAt(name.length()) == '[')) {
717-
if (inputString.length() > 0) {
718-
inputString.append(", ");
717+
if (!first) {
718+
sb.append(", ");
719719
}
720-
inputString.append(edge.from);
720+
first = false;
721+
sb.append(edge.from);
721722
}
722723
}
723-
result = inputString.toString();
724724
break;
725725
case "p":
726726
Object prop = p.get(name);
727-
String length = m.group(4);
727+
String length = template.length;
728+
String result;
728729
if (prop == null) {
729730
result = "?";
730731
} else if (length != null && prop instanceof LengthToString lengthProp) {
@@ -735,36 +736,21 @@ private String createName(NodeClass nodeClass, List<EdgeInfo> edges, String temp
735736
case "m":
736737
result = lengthProp.toString(Length.M);
737738
break;
738-
default:
739739
case "l":
740+
default:
740741
result = lengthProp.toString(Length.L);
741742
break;
742743
}
743744
} else {
744745
result = prop.toString();
745746
}
747+
sb.append(result);
746748
break;
747749
default:
748-
result = "#?#";
750+
sb.append("#?#");
749751
break;
750752
}
751-
752-
// Escape '\' and '$' to not interfere with the regular expression.
753-
StringBuilder newResult = new StringBuilder();
754-
for (int i = 0; i < result.length(); ++i) {
755-
char c = result.charAt(i);
756-
if (c == '\\') {
757-
newResult.append("\\\\");
758-
} else if (c == '$') {
759-
newResult.append("\\$");
760-
} else {
761-
newResult.append(c);
762-
}
763-
}
764-
result = newResult.toString();
765-
m.appendReplacement(sb, result);
766753
}
767-
m.appendTail(sb);
768754
return sb.toString();
769755
}
770756

0 commit comments

Comments
 (0)