Skip to content

Commit 61f93e3

Browse files
committed
avoid TruffleString.EqualNode calls for PE constant parameters
1 parent 96a908e commit 61f93e3

File tree

1 file changed

+51
-10
lines changed

1 file changed

+51
-10
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import java.util.Arrays;
5151
import java.util.List;
5252

53+
import com.oracle.graal.python.PythonLanguage;
5354
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5455
import com.oracle.graal.python.builtins.objects.code.CodeNodes;
5556
import com.oracle.graal.python.builtins.objects.code.PCode;
@@ -85,9 +86,11 @@
8586
import com.oracle.truffle.api.dsl.Bind;
8687
import com.oracle.truffle.api.dsl.Cached;
8788
import com.oracle.truffle.api.dsl.Cached.Exclusive;
89+
import com.oracle.truffle.api.dsl.Cached.Shared;
8890
import com.oracle.truffle.api.dsl.GenerateCached;
8991
import com.oracle.truffle.api.dsl.GenerateInline;
9092
import com.oracle.truffle.api.dsl.GenerateUncached;
93+
import com.oracle.truffle.api.dsl.Idempotent;
9194
import com.oracle.truffle.api.dsl.ImportStatic;
9295
import com.oracle.truffle.api.dsl.Specialization;
9396
import com.oracle.truffle.api.nodes.ExplodeLoop;
@@ -701,11 +704,26 @@ private static void storeKeywordsOrRaise(Object callee, Object[] arguments, PKey
701704
protected abstract static class SearchNamedParameterNode extends Node {
702705
public abstract int execute(TruffleString[] parameters, TruffleString name);
703706

704-
@Specialization(guards = {"cachedLen == parameters.length", "cachedLen <= 32"})
707+
@Idempotent // I think this is true, I would just like the assertion
708+
protected static boolean nameIsAtIndex(TruffleString[] parameters, TruffleString name, int index) {
709+
return uncached(parameters, name, TruffleString.EqualNode.getUncached()) == index;
710+
}
711+
712+
@SuppressWarnings("unused")
713+
@Specialization(guards = {"name == cachedName", "parameters == cachedParameters", "nameIsAtIndex(cachedParameters, cachedName, index)"}, limit = "1")
714+
static int cachedSingle(TruffleString[] parameters, TruffleString name,
715+
@Cached("name") TruffleString cachedName,
716+
@Cached(value = "parameters", dimensions = 0) TruffleString[] cachedParameters,
717+
@Shared @Cached TruffleString.EqualNode equalNode,
718+
@Cached("uncached(parameters, name, equalNode)") int index) {
719+
return index;
720+
}
721+
722+
@Specialization(guards = {"cachedLen == parameters.length", "cachedLen <= 32"}, replaces = "cachedSingle")
705723
@ExplodeLoop
706-
int cached(TruffleString[] parameters, TruffleString name,
724+
static int cached(TruffleString[] parameters, TruffleString name,
707725
@Cached("parameters.length") int cachedLen,
708-
@Cached TruffleString.EqualNode equalNode) {
726+
@Shared @Cached TruffleString.EqualNode equalNode) {
709727
int idx = -1;
710728
for (int i = 0; i < cachedLen; i++) {
711729
if (equalNode.execute(parameters[i], name, TS_ENCODING)) {
@@ -716,8 +734,8 @@ int cached(TruffleString[] parameters, TruffleString name,
716734
}
717735

718736
@Specialization(replaces = "cached")
719-
int uncached(TruffleString[] parameters, TruffleString name,
720-
@Cached TruffleString.EqualNode equalNode) {
737+
static int uncached(TruffleString[] parameters, TruffleString name,
738+
@Shared @Cached TruffleString.EqualNode equalNode) {
721739
for (int i = 0; i < parameters.length; i++) {
722740
if (equalNode.execute(parameters[i], name, TS_ENCODING)) {
723741
return i;
@@ -914,11 +932,34 @@ protected abstract static class FindKwDefaultNode extends Node {
914932

915933
public abstract PKeyword execute(PKeyword[] kwdefaults, TruffleString kwname);
916934

917-
@Specialization(guards = {"kwdefaults.length == cachedLength", "cachedLength < 32"})
935+
@Idempotent
936+
protected final boolean isSingleContext() {
937+
return PythonLanguage.get(this).isSingleContext();
938+
}
939+
940+
@Idempotent // I think this is true, I would just like the assertion
941+
protected static boolean kwIsCorrect(PKeyword[] kwdefaults, TruffleString kwname, PKeyword result) {
942+
return doUncached(kwdefaults, kwname, TruffleString.EqualNode.getUncached()) == result;
943+
}
944+
945+
protected static TruffleString.EqualNode getUncachedEqualNode() {
946+
return TruffleString.EqualNode.getUncached();
947+
}
948+
949+
@SuppressWarnings("unused")
950+
@Specialization(guards = {"kwname == cachedKwName", "kwdefaults == cachedKwdefaults", "isSingleContext()", "kwIsCorrect(cachedKwdefaults, cachedKwName, result)"}, limit = "1")
951+
PKeyword cachedSingle(PKeyword[] kwdefaults, TruffleString kwname,
952+
@Cached("kwname") TruffleString cachedKwName,
953+
@Cached(value = "kwdefaults", weak = true, dimensions = 0) PKeyword[] cachedKwdefaults,
954+
@Cached(value = "doUncached(kwdefaults, kwname, getUncachedEqualNode())", weak = true) PKeyword result) {
955+
return result;
956+
}
957+
958+
@Specialization(guards = {"kwdefaults.length == cachedLength", "cachedLength < 32"}, replaces = "cachedSingle")
918959
@ExplodeLoop(kind = LoopExplosionKind.FULL_UNROLL_UNTIL_RETURN)
919-
PKeyword doCached(PKeyword[] kwdefaults, TruffleString kwname,
960+
static PKeyword doCached(PKeyword[] kwdefaults, TruffleString kwname,
920961
@Cached("kwdefaults.length") int cachedLength,
921-
@Cached TruffleString.EqualNode equalNode) {
962+
@Shared @Cached TruffleString.EqualNode equalNode) {
922963
for (int j = 0; j < cachedLength; j++) {
923964
if (equalNode.execute(kwdefaults[j].getName(), kwname, TS_ENCODING)) {
924965
return kwdefaults[j];
@@ -928,8 +969,8 @@ PKeyword doCached(PKeyword[] kwdefaults, TruffleString kwname,
928969
}
929970

930971
@Specialization(replaces = "doCached")
931-
PKeyword doUncached(PKeyword[] kwdefaults, TruffleString kwname,
932-
@Cached TruffleString.EqualNode equalNode) {
972+
static PKeyword doUncached(PKeyword[] kwdefaults, TruffleString kwname,
973+
@Shared @Cached TruffleString.EqualNode equalNode) {
933974
for (int j = 0; j < kwdefaults.length; j++) {
934975
if (equalNode.execute(kwdefaults[j].getName(), kwname, TS_ENCODING)) {
935976
return kwdefaults[j];

0 commit comments

Comments
 (0)