Skip to content

Commit afdc0b8

Browse files
committed
Bytecode DSL: tune starred arguments: remove unnecessary @ExplodeLoop and fix virtual call in PE
1 parent 9592e53 commit afdc0b8

File tree

3 files changed

+46
-38
lines changed

3 files changed

+46
-38
lines changed

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

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,15 @@
4343
import static com.oracle.graal.python.nodes.ErrorMessages.IS_NOT_A_SEQUENCE;
4444
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4545

46+
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
4647
import com.oracle.graal.python.builtins.objects.common.SequenceNodesFactory.CachedGetObjectArrayNodeGen;
4748
import com.oracle.graal.python.builtins.objects.common.SequenceNodesFactory.GetObjectArrayNodeGen;
4849
import com.oracle.graal.python.builtins.objects.common.SequenceNodesFactory.SetSequenceStorageNodeGen;
4950
import com.oracle.graal.python.builtins.objects.ints.PInt;
51+
import com.oracle.graal.python.builtins.objects.list.PList;
5052
import com.oracle.graal.python.builtins.objects.str.PString;
5153
import com.oracle.graal.python.builtins.objects.str.StringNodes;
54+
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
5255
import com.oracle.graal.python.lib.PySequenceCheckNode;
5356
import com.oracle.graal.python.nodes.PGuards;
5457
import com.oracle.graal.python.nodes.PNodeWithContext;
@@ -122,6 +125,32 @@ static boolean doWithStorage(Node inliningTarget, PSequence seq, long idx,
122125
}
123126
}
124127

128+
@GenerateUncached
129+
@GenerateInline(inlineByDefault = true)
130+
public abstract static class GetPSequenceStorageNode extends PNodeWithContext {
131+
public abstract SequenceStorage execute(Node inliningTarget, PSequence seq);
132+
133+
@Specialization
134+
static SequenceStorage doTuple(PTuple seq) {
135+
return seq.getSequenceStorage();
136+
}
137+
138+
@Specialization
139+
static SequenceStorage doBytesLike(PBytesLike seq) {
140+
return seq.getSequenceStorage();
141+
}
142+
143+
@Specialization
144+
static SequenceStorage doList(PList seq) {
145+
return seq.getSequenceStorage();
146+
}
147+
148+
@Specialization
149+
static SequenceStorage doSequence(@SuppressWarnings("unused") PSequence seq) {
150+
throw CompilerDirectives.shouldNotReachHere();
151+
}
152+
}
153+
125154
@GenerateUncached
126155
@GenerateInline(inlineByDefault = true)
127156
public abstract static class GetSequenceStorageNode extends PNodeWithContext {
@@ -136,15 +165,10 @@ public final SequenceStorage executeCached(Object seq) {
136165
return execute(this, seq);
137166
}
138167

139-
@Specialization(guards = {"seq.getClass() == cachedClass"}, limit = "2")
140-
static SequenceStorage doSequenceCached(PSequence seq,
141-
@Cached("seq.getClass()") Class<? extends PSequence> cachedClass) {
142-
return CompilerDirectives.castExact(seq, cachedClass).getSequenceStorage();
143-
}
144-
145-
@Specialization(replaces = "doSequenceCached")
146-
static SequenceStorage doSequence(PSequence seq) {
147-
return seq.getSequenceStorage();
168+
@Specialization
169+
static SequenceStorage doSequence(Node inliningTarget, PSequence seq,
170+
@Cached GetPSequenceStorageNode getPSequenceStorageNode) {
171+
return getPSequenceStorageNode.execute(inliningTarget, seq);
148172
}
149173

150174
// Note: this does not seem currently used but is good to accept foreign lists in more

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2084,8 +2084,14 @@ private void emitUnstar(ExprTy[] args) {
20842084
* @param args the sequence of expressions to unstar
20852085
*/
20862086
private void emitUnstar(Runnable initialElementsProducer, ExprTy[] args) {
2087-
if (len(args) == 0 && initialElementsProducer == null) {
2087+
if (initialElementsProducer == null && len(args) == 0) {
20882088
b.emitLoadConstant(PythonUtils.EMPTY_OBJECT_ARRAY);
2089+
} else if (initialElementsProducer == null && len(args) == 1 && args[0] instanceof ExprTy.Starred) {
2090+
// Optimization for single starred argument: we can just upack it. For generic
2091+
// algorithm see the next branch
2092+
b.beginUnpackStarred();
2093+
((ExprTy.Starred) args[0]).value.accept(this);
2094+
b.endUnpackStarred();
20892095
} else if (anyIsStarred(args)) {
20902096
/**
20912097
* We emit one or more arrays and concatenate them using Unstar. Each array

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@
256256
import com.oracle.truffle.api.object.DynamicObjectLibrary;
257257
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
258258
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
259+
import com.oracle.truffle.api.profiles.InlinedIntValueProfile;
259260
import com.oracle.truffle.api.source.Source;
260261
import com.oracle.truffle.api.source.SourceSection;
261262
import com.oracle.truffle.api.strings.TruffleString;
@@ -2479,18 +2480,9 @@ public static PCell[] doMakeCellArray(@Variadic Object[] cells) {
24792480
@Operation
24802481
@ConstantOperand(type = int.class, specifyAtEnd = true)
24812482
public static final class Unstar {
2482-
@Specialization
2483-
public static Object[] perform(@Variadic Object[] values,
2484-
int length) {
2485-
if (length <= EXPLODE_LOOP_THRESHOLD) {
2486-
return doExploded(values, length);
2487-
} else {
2488-
return doRegular(values, length);
2489-
}
2490-
}
2491-
2492-
@ExplodeLoop
2493-
private static Object[] doExploded(Object[] values, int length) {
2483+
@Specialization(guards = "length != 1")
2484+
public static Object[] perform(@Variadic Object[] values, int length) {
2485+
assert length > 1; // we should emit load constant: empty array, or emit just unpack starred
24942486
CompilerAsserts.partialEvaluationConstant(length);
24952487
int totalLength = 0;
24962488
for (int i = 0; i < length; i++) {
@@ -2505,21 +2497,6 @@ private static Object[] doExploded(Object[] values, int length) {
25052497
}
25062498
return result;
25072499
}
2508-
2509-
private static Object[] doRegular(Object[] values, int length) {
2510-
int totalLength = 0;
2511-
for (int i = 0; i < length; i++) {
2512-
totalLength += ((Object[]) values[i]).length;
2513-
}
2514-
Object[] result = new Object[totalLength];
2515-
int idx = 0;
2516-
for (int i = 0; i < length; i++) {
2517-
int nl = ((Object[]) values[i]).length;
2518-
System.arraycopy(values[i], 0, result, idx, nl);
2519-
idx += nl;
2520-
}
2521-
return result;
2522-
}
25232500
}
25242501

25252502
@Operation
@@ -2561,8 +2538,9 @@ public static boolean isListOrTuple(PSequence obj, Node inliningTarget, InlinedC
25612538
static Object[] fromListOrTuple(PSequence seq,
25622539
@Bind Node inliningTarget,
25632540
@SuppressWarnings("unused") @Cached InlinedConditionProfile isListProfile,
2541+
@Exclusive @Cached SequenceNodes.GetPSequenceStorageNode getStorage,
25642542
@Exclusive @Cached SequenceStorageNodes.ToArrayNode toArrayNode) {
2565-
return toArrayNode.execute(inliningTarget, seq.getSequenceStorage());
2543+
return toArrayNode.execute(inliningTarget, getStorage.execute(inliningTarget, seq));
25662544
}
25672545

25682546
@Specialization(guards = "isNoValue(none)")

0 commit comments

Comments
 (0)