Skip to content

Commit 073911d

Browse files
committed
[GR-35113] Add more profiling and fast-paths to SequenceStorageNodes
PullRequest: graalpython/2030
2 parents 60ab4a7 + d40de6b commit 073911d

File tree

11 files changed

+331
-116
lines changed

11 files changed

+331
-116
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java

Lines changed: 178 additions & 105 deletions
Large diffs are not rendered by default.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorNodes.java

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,22 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.iterator;
4242

43+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PIterator;
4344
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
4445
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LENGTH_HINT__;
4546
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LEN__;
4647

48+
import java.util.ArrayList;
49+
import java.util.List;
50+
4751
import com.oracle.graal.python.builtins.objects.PNone;
4852
import com.oracle.graal.python.builtins.objects.PNotImplemented;
4953
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetSequenceStorageNode;
5054
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
55+
import com.oracle.graal.python.builtins.objects.iterator.IteratorNodesFactory.GetInternalIteratorSequenceStorageNodeGen;
56+
import com.oracle.graal.python.builtins.objects.list.PList;
5157
import com.oracle.graal.python.builtins.objects.str.PString;
58+
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
5259
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
5360
import com.oracle.graal.python.lib.PyIndexCheckNode;
5461
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
@@ -73,7 +80,9 @@
7380
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
7481
import com.oracle.truffle.api.CompilerDirectives;
7582
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
83+
import com.oracle.truffle.api.dsl.Bind;
7684
import com.oracle.truffle.api.dsl.Cached;
85+
import com.oracle.truffle.api.dsl.Fallback;
7786
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
7887
import com.oracle.truffle.api.dsl.GenerateUncached;
7988
import com.oracle.truffle.api.dsl.ImportStatic;
@@ -85,8 +94,6 @@
8594
import com.oracle.truffle.api.nodes.Node;
8695
import com.oracle.truffle.api.profiles.ConditionProfile;
8796
import com.oracle.truffle.api.profiles.LoopConditionProfile;
88-
import java.util.ArrayList;
89-
import java.util.List;
9097

9198
public abstract class IteratorNodes {
9299

@@ -181,6 +188,114 @@ int length(VirtualFrame frame, Object iterable,
181188
}
182189
}
183190

191+
@ImportStatic(PGuards.class)
192+
@GenerateUncached
193+
public abstract static class GetInternalIteratorSequenceStorage extends Node {
194+
public static GetInternalIteratorSequenceStorage getUncached() {
195+
return GetInternalIteratorSequenceStorageNodeGen.getUncached();
196+
}
197+
198+
/**
199+
* The argument must be a builtin iterator, which points to the first element of the
200+
* internal sequence storage. Returns {@code null} if the sequence storage is not available
201+
* or if the iterator is not pointing to the first item in the storage.
202+
*/
203+
public final SequenceStorage execute(PBuiltinIterator iterator) {
204+
assert GetClassNode.getUncached().execute(iterator) == PIterator;
205+
assert iterator.index == 0 && !iterator.isExhausted();
206+
return executeInternal(iterator);
207+
}
208+
209+
protected abstract SequenceStorage executeInternal(PBuiltinIterator iterator);
210+
211+
@Specialization(guards = "isList(it.sequence)")
212+
static SequenceStorage doSequenceList(PSequenceIterator it) {
213+
return ((PList) it.sequence).getSequenceStorage();
214+
}
215+
216+
@Specialization
217+
static SequenceStorage doSequenceLong(PLongSequenceIterator it) {
218+
return it.sequence;
219+
}
220+
221+
@Specialization
222+
static SequenceStorage doSequenceDouble(PDoubleSequenceIterator it) {
223+
return it.sequence;
224+
}
225+
226+
@Specialization
227+
static SequenceStorage doSequenceObj(PObjectSequenceIterator it) {
228+
return it.sequence;
229+
}
230+
231+
@Specialization
232+
static SequenceStorage doSequenceIntSeq(PIntegerSequenceIterator it) {
233+
return it.sequence;
234+
}
235+
236+
@Specialization(guards = "isPTuple(it.sequence)")
237+
static SequenceStorage doSequenceTuple(PSequenceIterator it) {
238+
return ((PTuple) it.sequence).getSequenceStorage();
239+
}
240+
241+
@Fallback
242+
static SequenceStorage doOthers(PBuiltinIterator it) {
243+
return null;
244+
}
245+
}
246+
247+
@ImportStatic(PGuards.class)
248+
public abstract static class BuiltinIteratorLengthHint extends Node {
249+
/**
250+
* The argument must be a builtin iterator. Returns {@code -1} if the length hint is not
251+
* available and rewrites itself to generic fallback that always returns {@code -1}.
252+
*/
253+
public final int execute(PBuiltinIterator iterator) {
254+
assert GetClassNode.getUncached().execute(iterator) == PIterator;
255+
return executeInternal(iterator);
256+
}
257+
258+
protected abstract int executeInternal(PBuiltinIterator iterator);
259+
260+
protected static SequenceStorage getStorage(GetInternalIteratorSequenceStorage getSeqStorage, PBuiltinIterator it) {
261+
return it.index != 0 || it.isExhausted() ? null : getSeqStorage.execute(it);
262+
}
263+
264+
@Specialization(guards = "storage != null")
265+
static int doSeqStorage(@SuppressWarnings("unused") PBuiltinIterator it,
266+
@SuppressWarnings("unused") @Cached GetInternalIteratorSequenceStorage getSeqStorage,
267+
@Bind("getStorage(getSeqStorage, it)") SequenceStorage storage) {
268+
return ensurePositive(storage.length());
269+
}
270+
271+
@Specialization
272+
static int doString(PStringIterator it) {
273+
return ensurePositive(it.value.length());
274+
}
275+
276+
@Specialization
277+
static int doSequenceArr(PArrayIterator it) {
278+
return ensurePositive(it.array.getLength());
279+
}
280+
281+
@Specialization
282+
static int doSequenceIntRange(PIntRangeIterator it) {
283+
return ensurePositive(it.getLength());
284+
}
285+
286+
@Specialization(replaces = {"doSeqStorage", "doString", "doSequenceArr", "doSequenceIntRange"})
287+
static int doGeneric(@SuppressWarnings("unused") PBuiltinIterator it) {
288+
return -1;
289+
}
290+
291+
static int ensurePositive(int len) {
292+
if (len < 0) {
293+
throw CompilerDirectives.shouldNotReachHere();
294+
}
295+
return len;
296+
}
297+
}
298+
184299
@GenerateUncached
185300
public abstract static class IsIteratorObjectNode extends Node {
186301

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/generator/GeneratorIfNode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class GeneratorIfNode extends StatementNode implements GeneratorControlNo
4848
protected final ConditionProfile needsConditionProfile = ConditionProfile.createBinaryProfile();
4949
protected final ConditionProfile needsThenUpdateProfile = ConditionProfile.createBinaryProfile();
5050
private final ConditionProfile needsElseUpdateProfile = ConditionProfile.createBinaryProfile();
51+
private final ConditionProfile conditionProfile = ConditionProfile.createCountingProfile();
5152
protected final BranchProfile seenYield = BranchProfile.create();
5253
protected final BranchProfile seenThen = BranchProfile.create();
5354
protected final BranchProfile seenElse = BranchProfile.create();
@@ -80,7 +81,7 @@ public void executeVoid(VirtualFrame frame) {
8081
if (needsConditionProfile.profile(!startThenFlag && !startElseFlag)) {
8182
thenFlag = condition.executeBoolean(frame);
8283
}
83-
if (thenFlag) {
84+
if (conditionProfile.profile(thenFlag)) {
8485
seenThen.enter();
8586
then.executeVoid(frame);
8687
} else {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/BoolSequenceStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ protected void increaseCapacityExact(int newCapacity) {
6767

6868
@Override
6969
public SequenceStorage copy() {
70-
return new BoolSequenceStorage(Arrays.copyOf(values, length));
70+
return new BoolSequenceStorage(PythonUtils.arrayCopyOf(values, length));
7171
}
7272

7373
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/ByteSequenceStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ protected void increaseCapacityExact(int newCapacity) {
7575

7676
@Override
7777
public SequenceStorage copy() {
78-
return new ByteSequenceStorage(Arrays.copyOf(values, length));
78+
return new ByteSequenceStorage(PythonUtils.arrayCopyOf(values, length));
7979
}
8080

8181
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/DoubleSequenceStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ protected void increaseCapacityExact(int newCapacity) {
6969

7070
@Override
7171
public SequenceStorage copy() {
72-
return new DoubleSequenceStorage(Arrays.copyOf(values, length));
72+
return new DoubleSequenceStorage(PythonUtils.arrayCopyOf(values, length));
7373
}
7474

7575
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/IntSequenceStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ protected void increaseCapacityExact(int newCapacity) {
6969

7070
@Override
7171
public SequenceStorage copy() {
72-
return new IntSequenceStorage(Arrays.copyOf(values, length));
72+
return new IntSequenceStorage(PythonUtils.arrayCopyOf(values, length));
7373
}
7474

7575
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/LongSequenceStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ protected void increaseCapacityExact(int newCapacity) {
7171

7272
@Override
7373
public SequenceStorage copy() {
74-
return new LongSequenceStorage(Arrays.copyOf(values, length));
74+
return new LongSequenceStorage(PythonUtils.arrayCopyOf(values, length));
7575
}
7676

7777
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/MroSequenceStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public String getClassName() {
143143

144144
@Override
145145
public SequenceStorage copy() {
146-
return new MroSequenceStorage(getClassName(), Arrays.copyOf(values, length));
146+
return new MroSequenceStorage(getClassName(), PythonUtils.arrayCopyOf(values, length));
147147
}
148148

149149
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/ObjectSequenceStorage.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ public Object[] getInternalArray() {
112112

113113
@Override
114114
public Object[] getCopyOfInternalArray() {
115-
return Arrays.copyOf(values, length);
115+
return PythonUtils.arrayCopyOf(values, length);
116116
}
117117

118118
@Override
119119
public void increaseCapacityExactWithCopy(int newCapacity) {
120-
values = Arrays.copyOf(values, newCapacity);
120+
values = PythonUtils.arrayCopyOf(values, newCapacity);
121121
capacity = values.length;
122122
}
123123

0 commit comments

Comments
 (0)