mirror of
https://github.com/python/cpython.git
synced 2026-04-20 10:51:00 +00:00
gh-134584 : Optimize and eliminate redundant ref-counting for MAKE_FUNCTION in the JIT (GH-144963)
This commit is contained in:
parent
2acb8d9257
commit
38d3aef375
11 changed files with 1152 additions and 1107 deletions
|
|
@ -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);
|
||||
|
|
|
|||
15
Python/executor_cases.c.h
generated
15
Python/executor_cases.c.h
generated
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
44
Python/generated_cases.c.h
generated
44
Python/generated_cases.c.h
generated
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
10
Python/optimizer_cases.c.h
generated
10
Python/optimizer_cases.c.h
generated
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue