gh-134584: Optimize _BINARY_OP_SUBSCR_LIST_SLICE (GH-144659)

This commit is contained in:
Sacul 2026-02-10 22:33:32 +08:00 committed by GitHub
parent 40a82abe93
commit 6c8ca1c378
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 108 additions and 60 deletions

View file

@ -938,9 +938,9 @@ dummy_func(
}
macro(BINARY_OP_SUBSCR_LIST_SLICE) =
_GUARD_TOS_SLICE + _GUARD_NOS_LIST + unused/5 + _BINARY_OP_SUBSCR_LIST_SLICE;
_GUARD_TOS_SLICE + _GUARD_NOS_LIST + unused/5 + _BINARY_OP_SUBSCR_LIST_SLICE + POP_TOP + POP_TOP;
op(_BINARY_OP_SUBSCR_LIST_SLICE, (list_st, sub_st -- res)) {
op(_BINARY_OP_SUBSCR_LIST_SLICE, (list_st, sub_st -- res, ls, ss)) {
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
@ -949,9 +949,13 @@ dummy_func(
PyObject *res_o = _PyList_SliceSubscript(list, sub);
STAT_INC(BINARY_OP, hit);
DECREF_INPUTS();
ERROR_IF(res_o == NULL);
if (res_o == NULL) {
ERROR_NO_POP();
}
res = PyStackRef_FromPyObjectSteal(res_o);
ls = list_st;
ss = sub_st;
INPUTS_DEAD();
}
macro(BINARY_OP_SUBSCR_STR_INT) =

View file

@ -5368,12 +5368,14 @@
break;
}
case _BINARY_OP_SUBSCR_LIST_SLICE_r21: {
case _BINARY_OP_SUBSCR_LIST_SLICE_r23: {
CHECK_CURRENT_CACHED_VALUES(2);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef sub_st;
_PyStackRef list_st;
_PyStackRef res;
_PyStackRef ls;
_PyStackRef ss;
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
sub_st = _stack_item_1;
@ -5390,27 +5392,19 @@
PyObject *res_o = _PyList_SliceSubscript(list, sub);
stack_pointer = _PyFrame_GetStackPointer(frame);
STAT_INC(BINARY_OP, hit);
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyStackRef tmp = sub_st;
sub_st = PyStackRef_NULL;
stack_pointer[-1] = sub_st;
PyStackRef_CLOSE(tmp);
tmp = list_st;
list_st = PyStackRef_NULL;
stack_pointer[-2] = list_st;
PyStackRef_CLOSE(tmp);
stack_pointer = _PyFrame_GetStackPointer(frame);
stack_pointer += -2;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
if (res_o == NULL) {
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_ERROR();
}
res = PyStackRef_FromPyObjectSteal(res_o);
ls = list_st;
ss = sub_st;
_tos_cache2 = ss;
_tos_cache1 = ls;
_tos_cache0 = res;
_tos_cache1 = PyStackRef_ZERO_BITS;
_tos_cache2 = PyStackRef_ZERO_BITS;
SET_CURRENT_CACHED_VALUES(1);
SET_CURRENT_CACHED_VALUES(3);
stack_pointer += -2;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}

View file

@ -892,6 +892,9 @@
_PyStackRef list_st;
_PyStackRef sub_st;
_PyStackRef res;
_PyStackRef ls;
_PyStackRef ss;
_PyStackRef value;
// _GUARD_TOS_SLICE
{
tos = stack_pointer[-1];
@ -925,26 +928,31 @@
PyObject *res_o = _PyList_SliceSubscript(list, sub);
stack_pointer = _PyFrame_GetStackPointer(frame);
STAT_INC(BINARY_OP, hit);
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyStackRef tmp = sub_st;
sub_st = PyStackRef_NULL;
stack_pointer[-1] = sub_st;
PyStackRef_CLOSE(tmp);
tmp = list_st;
list_st = PyStackRef_NULL;
stack_pointer[-2] = list_st;
PyStackRef_CLOSE(tmp);
stack_pointer = _PyFrame_GetStackPointer(frame);
stack_pointer += -2;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
if (res_o == NULL) {
JUMP_TO_LABEL(error);
}
res = PyStackRef_FromPyObjectSteal(res_o);
ls = list_st;
ss = sub_st;
}
// _POP_TOP
{
value = ss;
stack_pointer[-2] = res;
stack_pointer[-1] = ls;
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_XCLOSE(value);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
// _POP_TOP
{
value = ls;
stack_pointer += -1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_XCLOSE(value);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
stack_pointer[0] = res;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
DISPATCH();
}

View file

@ -422,6 +422,12 @@ dummy_func(void) {
ss = sub_st;
}
op(_BINARY_OP_SUBSCR_LIST_SLICE, (list_st, sub_st -- res, ls, ss)) {
res = sym_new_type(ctx, &PyList_Type);
ls = list_st;
ss = sub_st;
}
op(_TO_BOOL, (value -- res)) {
int already_bool = optimize_to_bool(this_instr, ctx, value, &res, false);
if (!already_bool) {

View file

@ -957,11 +957,21 @@
}
case _BINARY_OP_SUBSCR_LIST_SLICE: {
JitOptRef sub_st;
JitOptRef list_st;
JitOptRef res;
res = sym_new_not_null(ctx);
CHECK_STACK_BOUNDS(-1);
JitOptRef ls;
JitOptRef ss;
sub_st = stack_pointer[-1];
list_st = stack_pointer[-2];
res = sym_new_type(ctx, &PyList_Type);
ls = list_st;
ss = sub_st;
CHECK_STACK_BOUNDS(1);
stack_pointer[-2] = res;
stack_pointer += -1;
stack_pointer[-1] = ls;
stack_pointer[0] = ss;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
break;
}