gh-134584 : Optimize and eliminate redundant ref-counting for MAKE_FUNCTION in the JIT (GH-144963)

This commit is contained in:
Sacul 2026-04-09 22:22:53 +08:00 committed by GitHub
parent 2acb8d9257
commit 38d3aef375
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 1152 additions and 1107 deletions

View file

@ -5511,20 +5511,25 @@ dummy_func(
_DO_CALL_FUNCTION_EX +
_CHECK_PERIODIC_AT_END;
inst(MAKE_FUNCTION, (codeobj_st -- func)) {
op(_MAKE_FUNCTION, (codeobj_st -- func, co)) {
PyObject *codeobj = PyStackRef_AsPyObjectBorrow(codeobj_st);
PyFunctionObject *func_obj = (PyFunctionObject *)
PyFunction_New(codeobj, GLOBALS());
PyStackRef_CLOSE(codeobj_st);
ERROR_IF(func_obj == NULL);
if (func_obj == NULL) {
ERROR_NO_POP();
}
co = codeobj_st;
DEAD(codeobj_st);
_PyFunction_SetVersion(
func_obj, ((PyCodeObject *)codeobj)->co_version);
func = PyStackRef_FromPyObjectSteal((PyObject *)func_obj);
}
macro(MAKE_FUNCTION) = _MAKE_FUNCTION + POP_TOP;
inst(SET_FUNCTION_ATTRIBUTE, (attr_st, func_in -- func_out)) {
PyObject *func = PyStackRef_AsPyObjectBorrow(func_in);
PyObject *attr = PyStackRef_AsPyObjectSteal(attr_st);

View file

@ -18504,11 +18504,12 @@
break;
}
case _MAKE_FUNCTION_r11: {
case _MAKE_FUNCTION_r12: {
CHECK_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef codeobj_st;
_PyStackRef func;
_PyStackRef co;
_PyStackRef _stack_item_0 = _tos_cache0;
codeobj_st = _stack_item_0;
PyObject *codeobj = PyStackRef_AsPyObjectBorrow(codeobj_st);
@ -18519,22 +18520,20 @@
PyFunctionObject *func_obj = (PyFunctionObject *)
PyFunction_New(codeobj, GLOBALS());
stack_pointer = _PyFrame_GetStackPointer(frame);
stack_pointer += -1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_CLOSE(codeobj_st);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (func_obj == NULL) {
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_ERROR();
}
co = codeobj_st;
_PyFunction_SetVersion(
func_obj, ((PyCodeObject *)codeobj)->co_version);
func = PyStackRef_FromPyObjectSteal((PyObject *)func_obj);
_tos_cache1 = co;
_tos_cache0 = func;
_tos_cache1 = PyStackRef_ZERO_BITS;
_tos_cache2 = PyStackRef_ZERO_BITS;
SET_CURRENT_CACHED_VALUES(1);
SET_CURRENT_CACHED_VALUES(2);
stack_pointer += -1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}

View file

@ -10008,26 +10008,32 @@
INSTRUCTION_STATS(MAKE_FUNCTION);
_PyStackRef codeobj_st;
_PyStackRef func;
codeobj_st = stack_pointer[-1];
PyObject *codeobj = PyStackRef_AsPyObjectBorrow(codeobj_st);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyFunctionObject *func_obj = (PyFunctionObject *)
PyFunction_New(codeobj, GLOBALS());
stack_pointer = _PyFrame_GetStackPointer(frame);
stack_pointer += -1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_CLOSE(codeobj_st);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (func_obj == NULL) {
JUMP_TO_LABEL(error);
}
_PyFunction_SetVersion(
_PyStackRef co;
_PyStackRef value;
// _MAKE_FUNCTION
{
codeobj_st = stack_pointer[-1];
PyObject *codeobj = PyStackRef_AsPyObjectBorrow(codeobj_st);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyFunctionObject *func_obj = (PyFunctionObject *)
PyFunction_New(codeobj, GLOBALS());
stack_pointer = _PyFrame_GetStackPointer(frame);
if (func_obj == NULL) {
JUMP_TO_LABEL(error);
}
co = codeobj_st;
_PyFunction_SetVersion(
func_obj, ((PyCodeObject *)codeobj)->co_version);
func = PyStackRef_FromPyObjectSteal((PyObject *)func_obj);
stack_pointer[0] = func;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
func = PyStackRef_FromPyObjectSteal((PyObject *)func_obj);
}
// _POP_TOP
{
value = co;
stack_pointer[-1] = func;
_PyFrame_SetStackPointer(frame, stack_pointer);
PyStackRef_XCLOSE(value);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
DISPATCH();
}

View file

@ -2106,6 +2106,11 @@ dummy_func(void) {
ss = sub_st;
}
op(_MAKE_FUNCTION, (codeobj_st -- func, co)) {
func = sym_new_type(ctx, &PyFunction_Type);
co = codeobj_st;
}
op(_MATCH_CLASS, (subject, type, names -- attrs, s, tp, n)) {
attrs = sym_new_not_null(ctx);
s = subject;

View file

@ -4562,9 +4562,17 @@
}
case _MAKE_FUNCTION: {
JitOptRef codeobj_st;
JitOptRef func;
func = sym_new_not_null(ctx);
JitOptRef co;
codeobj_st = stack_pointer[-1];
func = sym_new_type(ctx, &PyFunction_Type);
co = codeobj_st;
CHECK_STACK_BOUNDS(1);
stack_pointer[-1] = func;
stack_pointer[0] = co;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
break;
}