Skip to content

Commit 556e623

Browse files
committed
More optimizations
1 parent b00e24f commit 556e623

File tree

2 files changed

+68
-15
lines changed

2 files changed

+68
-15
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PythonCextBuiltins.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,7 @@ abstract static class PyTruffle_MemoryViewFromBuffer extends NativeBuiltin {
15711571
Object wrap(VirtualFrame frame, Object bufferStructPointer, Object ownerObj, Object lenObj,
15721572
Object readonlyObj, Object itemsizeObj, Object formatObj,
15731573
Object ndimObj, Object bufPointer, Object shapePointer, Object stridesPointer, Object suboffsetsPointer,
1574+
@Cached ConditionProfile zeroDimProfile,
15741575
@Cached MemoryViewNodes.InitFlagsNode initFlagsNode,
15751576
@CachedLibrary(limit = "1") InteropLibrary lib,
15761577
@Cached CastToJavaIntExactNode castToIntNode,
@@ -1588,8 +1589,7 @@ Object wrap(VirtualFrame frame, Object bufferStructPointer, Object ownerObj, Obj
15881589
int[] shape = null;
15891590
int[] strides = null;
15901591
int[] suboffsets = null;
1591-
// TODO profile
1592-
if (ndim > 0) {
1592+
if (zeroDimProfile.profile(ndim > 0)) {
15931593
if (!lib.isNull(shapePointer)) {
15941594
shape = new int[ndim];
15951595
for (int i = 0; i < ndim; i++) {
@@ -1616,7 +1616,6 @@ Object wrap(VirtualFrame frame, Object bufferStructPointer, Object ownerObj, Obj
16161616
}
16171617
}
16181618
int flags = initFlagsNode.execute(ndim, itemsize, shape, strides, suboffsets);
1619-
// TODO factory
16201619
ManagedBuffer managedBuffer = null;
16211620
if (!lib.isNull(bufferStructPointer)) {
16221621
managedBuffer = ManagedBuffer.createForNative(bufferStructPointer);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/MemoryViewNodes.java

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -471,8 +471,22 @@ private IsBuiltinClassProfile getIsOverflowErrorProfile() {
471471
abstract static class ReadBytesAtNode extends Node {
472472
public abstract void execute(byte[] dest, int destOffset, int len, PMemoryView self, Object ptr, int offset);
473473

474-
@Specialization(guards = "ptr != null")
475-
static void doNative(byte[] dest, int destOffset, int len, @SuppressWarnings("unused") PMemoryView self, Object ptr, int offset,
474+
@Specialization(guards = {"ptr != null", "cachedLen == len", "cachedLen <= 8"}, limit = "4")
475+
@ExplodeLoop
476+
static void doNativeCached(byte[] dest, int destOffset, @SuppressWarnings("unused") int len, @SuppressWarnings("unused") PMemoryView self, Object ptr, int offset,
477+
@Cached("len") int cachedLen,
478+
@CachedLibrary(limit = "1") InteropLibrary lib) {
479+
try {
480+
for (int i = 0; i < cachedLen; i++) {
481+
dest[destOffset + i] = (byte) lib.readArrayElement(ptr, offset + i);
482+
}
483+
} catch (UnsupportedMessageException | InvalidArrayIndexException e) {
484+
throw CompilerDirectives.shouldNotReachHere("native buffer read failed");
485+
}
486+
}
487+
488+
@Specialization(guards = "ptr != null", replaces = "doNativeCached")
489+
static void doNativeGeneric(byte[] dest, int destOffset, int len, @SuppressWarnings("unused") PMemoryView self, Object ptr, int offset,
476490
@CachedLibrary(limit = "1") InteropLibrary lib) {
477491
try {
478492
for (int i = 0; i < len; i++) {
@@ -483,8 +497,21 @@ static void doNative(byte[] dest, int destOffset, int len, @SuppressWarnings("un
483497
}
484498
}
485499

486-
@Specialization(guards = "ptr == null")
487-
static void doManaged(byte[] dest, int destOffset, int len, PMemoryView self, @SuppressWarnings("unused") Object ptr, int offset,
500+
@Specialization(guards = {"ptr == null", "cachedLen == len", "cachedLen <= 8"}, limit = "4")
501+
@ExplodeLoop
502+
static void doManagedCached(byte[] dest, int destOffset, @SuppressWarnings("unused") int len, PMemoryView self, @SuppressWarnings("unused") Object ptr, int offset,
503+
@Cached("len") int cachedLen,
504+
@Cached SequenceNodes.GetSequenceStorageNode getStorageNode,
505+
@Cached SequenceStorageNodes.GetItemScalarNode getItemNode) {
506+
// TODO assumes byte storage
507+
SequenceStorage storage = getStorageNode.execute(self.getOwner());
508+
for (int i = 0; i < cachedLen; i++) {
509+
dest[destOffset + i] = (byte) getItemNode.executeInt(storage, offset + i);
510+
}
511+
}
512+
513+
@Specialization(guards = "ptr == null", replaces = "doManagedCached")
514+
static void doManagedGeneric(byte[] dest, int destOffset, int len, PMemoryView self, @SuppressWarnings("unused") Object ptr, int offset,
488515
@Cached SequenceNodes.GetSequenceStorageNode getStorageNode,
489516
@Cached SequenceStorageNodes.GetItemScalarNode getItemNode) {
490517
// TODO assumes byte storage
@@ -499,8 +526,22 @@ static void doManaged(byte[] dest, int destOffset, int len, PMemoryView self, @S
499526
abstract static class WriteBytesAtNode extends Node {
500527
public abstract void execute(byte[] src, int srcOffset, int len, PMemoryView self, Object ptr, int offset);
501528

502-
@Specialization(guards = "ptr != null")
503-
static void doNative(byte[] src, int srcOffset, int len, @SuppressWarnings("unused") PMemoryView self, Object ptr, int offset,
529+
@Specialization(guards = {"ptr != null", "cachedLen == len", "cachedLen <= 8"}, limit = "4")
530+
@ExplodeLoop
531+
static void doNativeCached(byte[] src, int srcOffset, @SuppressWarnings("unused") int len, @SuppressWarnings("unused") PMemoryView self, Object ptr, int offset,
532+
@Cached("len") int cachedLen,
533+
@CachedLibrary(limit = "1") InteropLibrary lib) {
534+
try {
535+
for (int i = 0; i < cachedLen; i++) {
536+
lib.writeArrayElement(ptr, offset + i, src[srcOffset + i]);
537+
}
538+
} catch (UnsupportedMessageException | InvalidArrayIndexException | UnsupportedTypeException e) {
539+
throw CompilerDirectives.shouldNotReachHere("native buffer read failed");
540+
}
541+
}
542+
543+
@Specialization(guards = "ptr != null", replaces = "doNativeCached")
544+
static void doNativeGeneric(byte[] src, int srcOffset, int len, @SuppressWarnings("unused") PMemoryView self, Object ptr, int offset,
504545
@CachedLibrary(limit = "1") InteropLibrary lib) {
505546
try {
506547
for (int i = 0; i < len; i++) {
@@ -511,8 +552,21 @@ static void doNative(byte[] src, int srcOffset, int len, @SuppressWarnings("unus
511552
}
512553
}
513554

514-
@Specialization(guards = "ptr == null")
515-
static void doManaged(byte[] src, int srcOffset, int len, PMemoryView self, @SuppressWarnings("unused") Object ptr, int offset,
555+
@Specialization(guards = {"ptr == null", "cachedLen == len", "cachedLen <= 8"}, limit = "4")
556+
@ExplodeLoop
557+
static void doManagedCached(byte[] src, int srcOffset, @SuppressWarnings("unused") int len, PMemoryView self, @SuppressWarnings("unused") Object ptr, int offset,
558+
@Cached("len") int cachedLen,
559+
@Cached SequenceNodes.GetSequenceStorageNode getStorageNode,
560+
@Cached SequenceStorageNodes.SetItemScalarNode setItemNode) {
561+
// TODO assumes byte storage
562+
SequenceStorage storage = getStorageNode.execute(self.getOwner());
563+
for (int i = 0; i < cachedLen; i++) {
564+
setItemNode.execute(storage, offset + i, src[srcOffset + i]);
565+
}
566+
}
567+
568+
@Specialization(guards = "ptr == null", replaces = "doManagedCached")
569+
static void doManagedGeneric(byte[] src, int srcOffset, int len, PMemoryView self, @SuppressWarnings("unused") Object ptr, int offset,
516570
@Cached SequenceNodes.GetSequenceStorageNode getStorageNode,
517571
@Cached SequenceStorageNodes.SetItemScalarNode setItemNode) {
518572
// TODO assumes byte storage
@@ -526,7 +580,7 @@ static void doManaged(byte[] src, int srcOffset, int len, PMemoryView self, @Sup
526580
abstract static class ReadItemAtNode extends Node {
527581
public abstract Object execute(PMemoryView self, Object ptr, int offset);
528582

529-
@Specialization(guards = {"ptr != null", "cachedItemSize == self.getItemSize()", "cachedItemSize <= 8"})
583+
@Specialization(guards = {"ptr != null", "cachedItemSize == self.getItemSize()", "cachedItemSize <= 8"}, limit = "4")
530584
@ExplodeLoop
531585
static Object doNativeCached(PMemoryView self, Object ptr, int offset,
532586
@Cached("self.getItemSize()") int cachedItemSize,
@@ -559,7 +613,7 @@ static Object doNativeGeneric(PMemoryView self, Object ptr, int offset,
559613
return unpackValueNode.execute(self.getFormat(), self.getFormatString(), bytes);
560614
}
561615

562-
@Specialization(guards = {"ptr == null", "cachedItemSize == self.getItemSize()", "cachedItemSize <= 8"})
616+
@Specialization(guards = {"ptr == null", "cachedItemSize == self.getItemSize()", "cachedItemSize <= 8"}, limit = "4")
563617
@ExplodeLoop
564618
static Object doManagedCached(PMemoryView self, @SuppressWarnings("unused") Object ptr, int offset,
565619
@Cached("self.getItemSize()") int cachedItemSize,
@@ -592,7 +646,7 @@ static Object doManagedGeneric(PMemoryView self, @SuppressWarnings("unused") Obj
592646
abstract static class WriteItemAtNode extends Node {
593647
public abstract void execute(VirtualFrame frame, PMemoryView self, Object ptr, int offset, Object object);
594648

595-
@Specialization(guards = {"ptr != null", "cachedItemSize == self.getItemSize()", "cachedItemSize <= 8"})
649+
@Specialization(guards = {"ptr != null", "cachedItemSize == self.getItemSize()", "cachedItemSize <= 8"}, limit = "4")
596650
@ExplodeLoop
597651
static void doNativeCached(VirtualFrame frame, PMemoryView self, Object ptr, int offset, Object object,
598652
@Cached("self.getItemSize()") int cachedItemSize,
@@ -625,7 +679,7 @@ static void doNativeGeneric(VirtualFrame frame, PMemoryView self, Object ptr, in
625679
}
626680
}
627681

628-
@Specialization(guards = {"ptr == null", "cachedItemSize == self.getItemSize()", "cachedItemSize <= 8"})
682+
@Specialization(guards = {"ptr == null", "cachedItemSize == self.getItemSize()", "cachedItemSize <= 8"}, limit = "4")
629683
@ExplodeLoop
630684
static void doManagedCached(VirtualFrame frame, PMemoryView self, @SuppressWarnings("unused") Object ptr, int offset, Object object,
631685
@Cached("self.getItemSize()") int cachedItemSize,

0 commit comments

Comments
 (0)