Skip to content

Commit 9cd1f39

Browse files
committed
add 2nd level specializations to SpecialCallNodes to guard on the call target
1 parent 379aed3 commit 9cd1f39

File tree

5 files changed

+177
-19
lines changed

5 files changed

+177
-19
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallBinaryMethodNode.java

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.oracle.graal.python.builtins.objects.function.PKeyword;
4545
import com.oracle.graal.python.nodes.call.CallNode;
4646
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
47+
import com.oracle.truffle.api.RootCallTarget;
4748
import com.oracle.truffle.api.dsl.Cached;
4849
import com.oracle.truffle.api.dsl.Specialization;
4950
import com.oracle.truffle.api.nodes.UnexpectedResultException;
@@ -71,62 +72,125 @@ public static CallBinaryMethodNode create() {
7172

7273
public abstract Object executeObject(Object callable, Object arg1, Object arg2);
7374

74-
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
75+
@Specialization(guards = {"func == cachedFunc",
76+
"builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class, assumptions = "singleContextAssumption()")
7577
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, boolean arg1, boolean arg2,
7678
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
7779
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
7880
return builtinNode.executeBool(arg1, arg2);
7981
}
8082

81-
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
83+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
84+
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, boolean arg1, boolean arg2,
85+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
86+
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
87+
return builtinNode.executeBool(arg1, arg2);
88+
}
89+
90+
@Specialization(guards = {"func == cachedFunc",
91+
"builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class, assumptions = "singleContextAssumption()")
8292
int callInt(@SuppressWarnings("unused") PBuiltinFunction func, int arg1, int arg2,
8393
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
8494
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
8595
return builtinNode.executeInt(arg1, arg2);
8696
}
8797

88-
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
98+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
99+
int callInt(@SuppressWarnings("unused") PBuiltinFunction func, int arg1, int arg2,
100+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
101+
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
102+
return builtinNode.executeInt(arg1, arg2);
103+
}
104+
105+
@Specialization(guards = {"func == cachedFunc",
106+
"builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class, assumptions = "singleContextAssumption()")
89107
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, int arg1, int arg2,
90108
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
91109
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
92110
return builtinNode.executeBool(arg1, arg2);
93111
}
94112

95-
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
113+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
114+
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, int arg1, int arg2,
115+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
116+
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
117+
return builtinNode.executeBool(arg1, arg2);
118+
}
119+
120+
@Specialization(guards = {"func == cachedFunc",
121+
"builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class, assumptions = "singleContextAssumption()")
96122
long callLong(@SuppressWarnings("unused") PBuiltinFunction func, long arg1, long arg2,
97123
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
98124
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
99125
return builtinNode.executeLong(arg1, arg2);
100126
}
101127

102-
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
128+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
129+
long callLong(@SuppressWarnings("unused") PBuiltinFunction func, long arg1, long arg2,
130+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
131+
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
132+
return builtinNode.executeLong(arg1, arg2);
133+
}
134+
135+
@Specialization(guards = {"func == cachedFunc",
136+
"builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class, assumptions = "singleContextAssumption()")
103137
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, long arg1, long arg2,
104138
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
105139
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
106140
return builtinNode.executeBool(arg1, arg2);
107141
}
108142

109-
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
143+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
144+
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, long arg1, long arg2,
145+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
146+
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
147+
return builtinNode.executeBool(arg1, arg2);
148+
}
149+
150+
@Specialization(guards = {"func == cachedFunc",
151+
"builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class, assumptions = "singleContextAssumption()")
110152
double callDouble(@SuppressWarnings("unused") PBuiltinFunction func, double arg1, double arg2,
111153
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
112154
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
113155
return builtinNode.executeDouble(arg1, arg2);
114156
}
115157

116-
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
158+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
159+
double callDouble(@SuppressWarnings("unused") PBuiltinFunction func, double arg1, double arg2,
160+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
161+
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
162+
return builtinNode.executeDouble(arg1, arg2);
163+
}
164+
165+
@Specialization(guards = {"func == cachedFunc",
166+
"builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class, assumptions = "singleContextAssumption()")
117167
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, double arg1, double arg2,
118168
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
119169
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
120170
return builtinNode.executeBool(arg1, arg2);
121171
}
122172

123-
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()")
124-
Object callObject(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2,
173+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
174+
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, double arg1, double arg2,
175+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
176+
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
177+
return builtinNode.executeBool(arg1, arg2);
178+
}
179+
180+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
181+
Object callObjectSingleContext(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2,
125182
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
126183
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) {
127184
return builtinNode.execute(arg1, arg2);
128185
}
129186

187+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()")
188+
Object callObject(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2,
189+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
190+
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) {
191+
return builtinNode.execute(arg1, arg2);
192+
}
193+
130194
@Specialization
131195
Object call(Object func, Object arg1, Object arg2,
132196
@Cached("create()") CallNode callNode) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallSpecialMethodNode.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
*/
4141
package com.oracle.graal.python.nodes.call.special;
4242

43+
import com.oracle.graal.python.PythonLanguage;
4344
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4445
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4546
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
@@ -48,6 +49,7 @@
4849
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
4950
import com.oracle.graal.python.nodes.truffle.PythonTypes;
5051
import com.oracle.graal.python.runtime.PythonOptions;
52+
import com.oracle.truffle.api.Assumption;
5153
import com.oracle.truffle.api.dsl.ImportStatic;
5254
import com.oracle.truffle.api.dsl.NodeFactory;
5355
import com.oracle.truffle.api.dsl.TypeSystemReference;
@@ -70,6 +72,10 @@ private static <T extends PythonBuiltinBaseNode> T getBuiltin(PBuiltinFunction f
7072
}
7173
}
7274

75+
protected Assumption singleContextAssumption() {
76+
return PythonLanguage.singleContextAssumption;
77+
}
78+
7379
protected static PythonUnaryBuiltinNode getUnary(PBuiltinFunction func) {
7480
return getBuiltin(func, PythonUnaryBuiltinNode.class);
7581
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallTernaryMethodNode.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.oracle.graal.python.builtins.objects.function.PKeyword;
4545
import com.oracle.graal.python.nodes.call.CallNode;
4646
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
47+
import com.oracle.truffle.api.RootCallTarget;
4748
import com.oracle.truffle.api.dsl.Cached;
4849
import com.oracle.truffle.api.dsl.Specialization;
4950

@@ -70,6 +71,20 @@ Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Obje
7071
return builtinNode.execute(arg1, arg2, arg3);
7172
}
7273

74+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
75+
Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, int arg2, Object arg3,
76+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
77+
@Cached("getTernary(func)") PythonTernaryBuiltinNode builtinNode) {
78+
return builtinNode.execute(arg1, arg2, arg3);
79+
}
80+
81+
@Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
82+
Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2, Object arg3,
83+
@SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct,
84+
@Cached("getTernary(func)") PythonTernaryBuiltinNode builtinNode) {
85+
return builtinNode.execute(arg1, arg2, arg3);
86+
}
87+
7388
@Specialization
7489
Object call(Object func, Object arg1, Object arg2, Object arg3,
7590
@Cached("create()") CallNode callNode) {

0 commit comments

Comments
 (0)