Skip to content

Commit 8716739

Browse files
committed
Micro-optimize raw edges iterator.
1 parent 1299101 commit 8716739

File tree

1 file changed

+27
-30
lines changed
  • compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/graph

1 file changed

+27
-30
lines changed

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

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -953,8 +953,7 @@ public boolean hasNext() {
953953

954954
private Node forward() {
955955
while (mask != 0) {
956-
Node next = getInput();
957-
mask = advanceInput();
956+
Node next = getAndAdvanceInput();
958957
if (next != null) {
959958
return next;
960959
}
@@ -978,47 +977,45 @@ public Node next() {
978977
}
979978
}
980979

981-
public final long advanceInput() {
982-
int state = (int) mask & 0x03;
980+
private Node getAndAdvanceInput() {
981+
long state = mask & 0x03;
982+
Node result;
983983
if (state == 0) {
984-
// Skip normal field.
985-
return mask >>> NEXT_EDGE;
984+
result = Edges.getNodeUnsafe(node, mask & 0xFC);
985+
mask = mask >>> NEXT_EDGE;
986986
} else if (state == 1) {
987987
// We are iterating a node list.
988+
NodeList<?> nodeList = Edges.getNodeListUnsafe(node, mask & 0xFC);
989+
result = nodeList.nodes[nodeList.size() - 1 - (int) ((mask >>> NEXT_EDGE) & 0xFFFF)];
988990
if ((mask & 0xFFFF00) != 0) {
989991
// Node list count is non-zero, decrease by 1.
990-
return mask - 0x100;
992+
mask = mask - 0x100;
991993
} else {
992994
// Node list is finished => go to next input.
993-
return mask >>> 24;
995+
mask = mask >>> 24;
994996
}
995997
} else {
996-
// Need to expand node list.
998+
// Node list needs to expand first.
999+
result = null;
9971000
NodeList<?> nodeList = Edges.getNodeListUnsafe(node, mask & 0xFC);
998-
if (nodeList != null) {
999-
int size = nodeList.size();
1000-
if (size != 0) {
1001-
// Set pointer to upper most index of node list.
1002-
return ((mask >>> NEXT_EDGE) << 24) | (mask & 0xFD) | ((long) (size - 1) << NEXT_EDGE);
1001+
int size;
1002+
if (nodeList != null && ((size = nodeList.size()) != 0)) {
1003+
// Set pointer to upper most index of node list.
1004+
mask = ((mask >>> NEXT_EDGE) << 24) | (mask & 0xFD) | ((long) (size - 1) << NEXT_EDGE);
1005+
result = nodeList.nodes[size - 1 - (int) ((mask >>> NEXT_EDGE) & 0xFFFF)];
1006+
if ((mask & 0xFFFF00) != 0) {
1007+
// Node list count is non-zero, decrease by 1.
1008+
mask = mask - 0x100;
1009+
} else {
1010+
// Node list is finished => go to next input.
1011+
mask = mask >>> 24;
10031012
}
1013+
} else {
1014+
// Node list is empty or null => skip.
1015+
mask = mask >>> NEXT_EDGE;
10041016
}
1005-
// Node list is empty or null => skip.
1006-
return mask >>> NEXT_EDGE;
1007-
}
1008-
}
1009-
1010-
public Node getInput() {
1011-
int state = (int) mask & 0x03;
1012-
if (state == 0) {
1013-
return Edges.getNodeUnsafe(node, mask & 0xFC);
1014-
} else if (state == 1) {
1015-
// We are iterating a node list.
1016-
NodeList<?> nodeList = Edges.getNodeListUnsafe(node, mask & 0xFC);
1017-
return nodeList.nodes[nodeList.size() - 1 - (int) ((mask >>> NEXT_EDGE) & 0xFFFF)];
1018-
} else {
1019-
// Node list needs to expand first.
1020-
return null;
10211017
}
1018+
return result;
10221019
}
10231020

10241021
@Override

0 commit comments

Comments
 (0)