gh-100239: specialize BINARY_OP/SUBSCR for list-slice (#132626)

This commit is contained in:
Irit Katriel 2025-05-01 11:28:52 +01:00 committed by GitHub
parent 3831752689
commit 5529213d4e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 552 additions and 354 deletions

View file

@ -519,6 +519,11 @@ dummy_func(
EXIT_IF(!PyList_CheckExact(o));
}
op(_GUARD_TOS_SLICE, (tos -- tos)) {
PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
EXIT_IF(!PySlice_Check(o));
}
macro(TO_BOOL_LIST) = _GUARD_TOS_LIST + unused/1 + unused/2 + _TO_BOOL_LIST;
op(_TO_BOOL_LIST, (value -- res)) {
@ -591,6 +596,7 @@ dummy_func(
BINARY_OP_SUBTRACT_FLOAT,
BINARY_OP_ADD_UNICODE,
BINARY_OP_SUBSCR_LIST_INT,
BINARY_OP_SUBSCR_LIST_SLICE,
BINARY_OP_SUBSCR_TUPLE_INT,
BINARY_OP_SUBSCR_STR_INT,
BINARY_OP_SUBSCR_DICT,
@ -900,6 +906,24 @@ dummy_func(
DECREF_INPUTS();
}
macro(BINARY_OP_SUBSCR_LIST_SLICE) =
_GUARD_TOS_SLICE + _GUARD_NOS_LIST + unused/5 + _BINARY_OP_SUBSCR_LIST_SLICE;
op(_BINARY_OP_SUBSCR_LIST_SLICE, (list_st, sub_st -- res)) {
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
assert(PySlice_Check(sub));
assert(PyList_CheckExact(list));
PyObject *res_o = _PyList_SliceSubscript(list, sub);
DEOPT_IF(res_o == NULL);
STAT_INC(BINARY_OP, hit);
res = PyStackRef_FromPyObjectSteal(res_o);
STAT_INC(BINARY_OP, hit);
DECREF_INPUTS();
}
macro(BINARY_OP_SUBSCR_STR_INT) =
_GUARD_TOS_INT + _GUARD_NOS_UNICODE + unused/5 + _BINARY_OP_SUBSCR_STR_INT;