-
-
Notifications
You must be signed in to change notification settings - Fork 32.1k
gh-115999: Add partial free-thread specialization for BINARY_SUBSCR #127227
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
1a901a3
919be91
6e2f5fe
8c3a4dc
0637d48
f0b8a8f
7f69f2d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -704,7 +704,7 @@ dummy_func( | |||||||||||||||||||||
}; | ||||||||||||||||||||||
|
||||||||||||||||||||||
specializing op(_SPECIALIZE_BINARY_SUBSCR, (counter/1, container, sub -- container, sub)) { | ||||||||||||||||||||||
#if ENABLE_SPECIALIZATION | ||||||||||||||||||||||
#if ENABLE_SPECIALIZATION_FT | ||||||||||||||||||||||
assert(frame->stackpointer == NULL); | ||||||||||||||||||||||
if (ADAPTIVE_COUNTER_TRIGGERS(counter)) { | ||||||||||||||||||||||
next_instr = this_instr; | ||||||||||||||||||||||
|
@@ -713,7 +713,7 @@ dummy_func( | |||||||||||||||||||||
} | ||||||||||||||||||||||
OPCODE_DEFERRED_INC(BINARY_SUBSCR); | ||||||||||||||||||||||
ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); | ||||||||||||||||||||||
#endif /* ENABLE_SPECIALIZATION */ | ||||||||||||||||||||||
#endif /* ENABLE_SPECIALIZATION_FT */ | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
op(_BINARY_SUBSCR, (container, sub -- res)) { | ||||||||||||||||||||||
|
@@ -790,11 +790,17 @@ dummy_func( | |||||||||||||||||||||
// Deopt unless 0 <= sub < PyList_Size(list) | ||||||||||||||||||||||
DEOPT_IF(!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)); | ||||||||||||||||||||||
Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0]; | ||||||||||||||||||||||
#ifdef Py_GIL_DISABLED | ||||||||||||||||||||||
STAT_INC(BINARY_SUBSCR, hit); | ||||||||||||||||||||||
mpage marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||
PyObject *res_o = _PyList_GetItemRef(list, index); | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The default build of list_get_item_ref is almost same as current implementation, Lines 352 to 361 in 328187c
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would certainly be cleaner, but it might come with some performance cost in the default build.
mpage marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||
DEOPT_IF(res_o == NULL); | ||||||||||||||||||||||
#else | ||||||||||||||||||||||
DEOPT_IF(index >= PyList_GET_SIZE(list)); | ||||||||||||||||||||||
STAT_INC(BINARY_SUBSCR, hit); | ||||||||||||||||||||||
PyObject *res_o = PyList_GET_ITEM(list, index); | ||||||||||||||||||||||
assert(res_o != NULL); | ||||||||||||||||||||||
Py_INCREF(res_o); | ||||||||||||||||||||||
corona10 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||
#endif | ||||||||||||||||||||||
PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free); | ||||||||||||||||||||||
DEAD(sub_st); | ||||||||||||||||||||||
PyStackRef_CLOSE(list_st); | ||||||||||||||||||||||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1717,15 +1717,15 @@ _Py_Specialize_BinarySubscr( | |
PyObject *container = PyStackRef_AsPyObjectBorrow(container_st); | ||
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); | ||
|
||
assert(ENABLE_SPECIALIZATION); | ||
assert(ENABLE_SPECIALIZATION_FT); | ||
assert(_PyOpcode_Caches[BINARY_SUBSCR] == | ||
INLINE_CACHE_ENTRIES_BINARY_SUBSCR); | ||
_PyBinarySubscrCache *cache = (_PyBinarySubscrCache *)(instr + 1); | ||
PyTypeObject *container_type = Py_TYPE(container); | ||
uint8_t specialized_op; | ||
if (container_type == &PyList_Type) { | ||
if (PyLong_CheckExact(sub)) { | ||
if (_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) { | ||
instr->op.code = BINARY_SUBSCR_LIST_INT; | ||
specialized_op = BINARY_SUBSCR_LIST_INT; | ||
goto success; | ||
} | ||
SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_RANGE); | ||
|
@@ -1738,7 +1738,7 @@ _Py_Specialize_BinarySubscr( | |
if (container_type == &PyTuple_Type) { | ||
if (PyLong_CheckExact(sub)) { | ||
if (_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) { | ||
instr->op.code = BINARY_SUBSCR_TUPLE_INT; | ||
specialized_op = BINARY_SUBSCR_TUPLE_INT; | ||
goto success; | ||
} | ||
SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_RANGE); | ||
|
@@ -1751,7 +1751,7 @@ _Py_Specialize_BinarySubscr( | |
if (container_type == &PyUnicode_Type) { | ||
if (PyLong_CheckExact(sub)) { | ||
if (_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) { | ||
instr->op.code = BINARY_SUBSCR_STR_INT; | ||
specialized_op = BINARY_SUBSCR_STR_INT; | ||
goto success; | ||
} | ||
SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_RANGE); | ||
|
@@ -1762,9 +1762,10 @@ _Py_Specialize_BinarySubscr( | |
goto fail; | ||
} | ||
if (container_type == &PyDict_Type) { | ||
instr->op.code = BINARY_SUBSCR_DICT; | ||
specialized_op = BINARY_SUBSCR_DICT; | ||
goto success; | ||
} | ||
#ifndef Py_GIL_DISABLED | ||
PyTypeObject *cls = Py_TYPE(container); | ||
PyObject *descriptor = _PyType_Lookup(cls, &_Py_ID(__getitem__)); | ||
if (descriptor && Py_TYPE(descriptor) == &PyFunction_Type) { | ||
|
@@ -1797,21 +1798,17 @@ _Py_Specialize_BinarySubscr( | |
// struct _specialization_cache): | ||
ht->_spec_cache.getitem = descriptor; | ||
ht->_spec_cache.getitem_version = version; | ||
Comment on lines
1799
to
1800
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It should make to be thread-safe by using LOCK_TYPE(), but it will be handled with separated PRs. |
||
instr->op.code = BINARY_SUBSCR_GETITEM; | ||
specialized_op = BINARY_SUBSCR_GETITEM; | ||
goto success; | ||
} | ||
#endif // Py_GIL_DISABLED | ||
SPECIALIZATION_FAIL(BINARY_SUBSCR, | ||
binary_subscr_fail_kind(container_type, sub)); | ||
fail: | ||
STAT_INC(BINARY_SUBSCR, failure); | ||
assert(!PyErr_Occurred()); | ||
instr->op.code = BINARY_SUBSCR; | ||
cache->counter = adaptive_counter_backoff(cache->counter); | ||
unspecialize(instr); | ||
return; | ||
success: | ||
STAT_INC(BINARY_SUBSCR, success); | ||
assert(!PyErr_Occurred()); | ||
cache->counter = adaptive_counter_cooldown(); | ||
specialize(instr, specialized_op); | ||
} | ||
|
||
|
||
|
Uh oh!
There was an error while loading. Please reload this page.