gh-134584: JIT: Remove redundant refcount for _BINARY_OP_SUBSCR_DICT (GH-143724)

This commit is contained in:
Cajetan Rodrigues 2026-01-12 15:13:55 +01:00 committed by GitHub
parent 42f7c2dfba
commit 054a565c64
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 83 additions and 44 deletions

View file

@ -1056,9 +1056,9 @@ dummy_func(
}
macro(BINARY_OP_SUBSCR_DICT) =
_GUARD_NOS_DICT + unused/5 + _BINARY_OP_SUBSCR_DICT;
_GUARD_NOS_DICT + unused/5 + _BINARY_OP_SUBSCR_DICT + POP_TOP + POP_TOP;
op(_BINARY_OP_SUBSCR_DICT, (dict_st, sub_st -- res)) {
op(_BINARY_OP_SUBSCR_DICT, (dict_st, sub_st -- res, ds, ss)) {
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *dict = PyStackRef_AsPyObjectBorrow(dict_st);
@ -1069,9 +1069,13 @@ dummy_func(
if (rc == 0) {
_PyErr_SetKeyError(sub);
}
DECREF_INPUTS();
ERROR_IF(rc <= 0); // not found or error
if (rc <= 0) {
ERROR_NO_POP();
}
res = PyStackRef_FromPyObjectSteal(res_o);
ds = dict_st;
ss = sub_st;
INPUTS_DEAD();
}
op(_BINARY_OP_SUBSCR_CHECK_FUNC, (container, unused -- container, unused, getitem)) {

View file

@ -6034,12 +6034,14 @@
break;
}
case _BINARY_OP_SUBSCR_DICT_r21: {
case _BINARY_OP_SUBSCR_DICT_r23: {
CHECK_CURRENT_CACHED_VALUES(2);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef sub_st;
_PyStackRef dict_st;
_PyStackRef res;
_PyStackRef ds;
_PyStackRef ss;
_PyStackRef _stack_item_0 = _tos_cache0;
_PyStackRef _stack_item_1 = _tos_cache1;
sub_st = _stack_item_1;
@ -6061,27 +6063,19 @@
_PyErr_SetKeyError(sub);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyStackRef tmp = sub_st;
sub_st = PyStackRef_NULL;
stack_pointer[-1] = sub_st;
PyStackRef_CLOSE(tmp);
tmp = dict_st;
dict_st = PyStackRef_NULL;
stack_pointer[-2] = dict_st;
PyStackRef_CLOSE(tmp);
stack_pointer = _PyFrame_GetStackPointer(frame);
stack_pointer += -2;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
if (rc <= 0) {
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_ERROR();
}
res = PyStackRef_FromPyObjectSteal(res_o);
ds = dict_st;
ss = sub_st;
_tos_cache2 = ss;
_tos_cache1 = ds;
_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

@ -611,6 +611,9 @@
_PyStackRef dict_st;
_PyStackRef sub_st;
_PyStackRef res;
_PyStackRef ds;
_PyStackRef ss;
_PyStackRef value;
// _GUARD_NOS_DICT
{
nos = stack_pointer[-2];
@ -639,26 +642,31 @@
_PyErr_SetKeyError(sub);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyStackRef tmp = sub_st;
sub_st = PyStackRef_NULL;
stack_pointer[-1] = sub_st;
PyStackRef_CLOSE(tmp);
tmp = dict_st;
dict_st = PyStackRef_NULL;
stack_pointer[-2] = dict_st;
PyStackRef_CLOSE(tmp);
stack_pointer = _PyFrame_GetStackPointer(frame);
stack_pointer += -2;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
if (rc <= 0) {
JUMP_TO_LABEL(error);
}
res = PyStackRef_FromPyObjectSteal(res_o);
ds = dict_st;
ss = sub_st;
}
// _POP_TOP
{
value = ss;
stack_pointer[-2] = res;
stack_pointer[-1] = ds;
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_XCLOSE(value);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
// _POP_TOP
{
value = ds;
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

@ -380,6 +380,12 @@ dummy_func(void) {
ss = sub_st;
}
op(_BINARY_OP_SUBSCR_DICT, (dict_st, sub_st -- res, ds, ss)) {
res = sym_new_not_null(ctx);
ds = dict_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

@ -1072,11 +1072,21 @@
}
case _BINARY_OP_SUBSCR_DICT: {
JitOptRef sub_st;
JitOptRef dict_st;
JitOptRef res;
JitOptRef ds;
JitOptRef ss;
sub_st = stack_pointer[-1];
dict_st = stack_pointer[-2];
res = sym_new_not_null(ctx);
CHECK_STACK_BOUNDS(-1);
ds = dict_st;
ss = sub_st;
CHECK_STACK_BOUNDS(1);
stack_pointer[-2] = res;
stack_pointer += -1;
stack_pointer[-1] = ds;
stack_pointer[0] = ss;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
break;
}