gh-130704: Strength reduce LOAD_FAST{_LOAD_FAST} (#130708)
Optimize `LOAD_FAST` opcodes into faster versions that load borrowed references onto the operand stack when we can prove that the lifetime of the local outlives the lifetime of the temporary that is loaded onto the stack.
This commit is contained in:
@@ -544,6 +544,12 @@ visit_decref(PyObject *op, void *parent)
|
||||
int
|
||||
_PyGC_VisitStackRef(_PyStackRef *ref, visitproc visit, void *arg)
|
||||
{
|
||||
// This is a bit tricky! We want to ignore stackrefs with embedded
|
||||
// refcounts when computing the incoming references, but otherwise treat
|
||||
// them like normal.
|
||||
if (!PyStackRef_RefcountOnObject(*ref) && (visit == visit_decref)) {
|
||||
return 0;
|
||||
}
|
||||
Py_VISIT(PyStackRef_AsPyObjectBorrow(*ref));
|
||||
return 0;
|
||||
}
|
||||
@@ -554,7 +560,7 @@ _PyGC_VisitFrameStack(_PyInterpreterFrame *frame, visitproc visit, void *arg)
|
||||
_PyStackRef *ref = _PyFrame_GetLocalsArray(frame);
|
||||
/* locals and stack */
|
||||
for (; ref < frame->stackpointer; ref++) {
|
||||
Py_VISIT(PyStackRef_AsPyObjectBorrow(*ref));
|
||||
_Py_VISIT_STACKREF(*ref);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user