Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
e4b7f51
Add unique reference tracking to JIT, optimize tuple unpacking
reidenong Jan 28, 2026
b32a8e2
Merge branch 'main' into branch-unique-reference-tracking
reidenong Jan 28, 2026
7aeac0e
Regenerate cases
reidenong Jan 28, 2026
f8b7e4e
Fix unique tuple unpacking checks
reidenong Jan 28, 2026
37d7c4b
Implement _PyTuple_ExactDealloc
reidenong Jan 29, 2026
7df2176
Rename symbol
reidenong Jan 29, 2026
6f66c56
Merge branch 'main' into branch-unique-reference-tracking
reidenong Jan 30, 2026
b251825
Merge branch 'main' into branch-unique-reference-tracking
reidenong Jan 30, 2026
bcd5654
Regenerate cases
reidenong Jan 30, 2026
acfa737
Add alignment checking
reidenong Jan 31, 2026
a0fd9e2
Change JIT reference tags to 2 bit scheme
reidenong Jan 31, 2026
645776a
📜🤖 Added by blurb_it.
blurb-it[bot] Jan 31, 2026
cdb4a05
Fix style
reidenong Feb 1, 2026
275732b
Remove unnecesssary deopt
reidenong Feb 2, 2026
dbde059
Regenerate cases
reidenong Feb 2, 2026
bd70ebd
Replace tuple deallocation with tuple free
reidenong Feb 3, 2026
d16f298
Merge branch 'main' into branch-unique-reference-tracking
reidenong Feb 5, 2026
bec7ee3
Regenerate cases
reidenong Feb 5, 2026
5c9b9c6
Add unique reference two tuple optimization
reidenong Feb 5, 2026
cdbe2e6
Add efficient unpacking for uniquely referenced three tuples
reidenong Feb 5, 2026
fb1d227
Move length checks to JIT
reidenong Feb 6, 2026
c7e53fb
Refactor JIT reference remove unique
reidenong Feb 3, 2026
6851962
Remove JIT reference uniqueness on store
reidenong Feb 3, 2026
8c8e0a9
Remove unnecessary DEOPT
reidenong Feb 6, 2026
a6fffdc
Remove redundant make unique ops
reidenong Feb 21, 2026
78978aa
Merge branch 'main' into branch-unique-reference-tracking
reidenong Feb 21, 2026
0b07ac4
Regen cases
reidenong Feb 21, 2026
14e5d3d
Merge branch 'main' into branch-unique-reference-tracking
reidenong Feb 21, 2026
8506038
Merge branch 'main' into branch-unique-reference-tracking
reidenong Mar 9, 2026
d67617f
Regen cases
reidenong Mar 9, 2026
100eeb5
Merge branch 'main' into branch-unique-reference-tracking
reidenong Mar 9, 2026
e476061
Merge branch 'main' into branch-unique-reference-tracking
reidenong Mar 11, 2026
06a9ec1
Merge branch 'main' into branch-unique-reference-tracking
reidenong Mar 11, 2026
6bce6b4
Merge remote-tracking branch 'upstream/main' into pr/144300
Fidget-Spinner Mar 22, 2026
89dc467
Mark unique tuple freeing as non-escaping
Fidget-Spinner Mar 22, 2026
4e6c792
fix a bugs in _COPY_FREE_VARS and frame creation
Fidget-Spinner Mar 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Mark unique tuple freeing as non-escaping
  • Loading branch information
Fidget-Spinner committed Mar 22, 2026
commit 89dc467e4d0f8f8a25edd7e7fb7113807b4310c4
2 changes: 1 addition & 1 deletion Include/internal/pycore_tuple.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ extern PyStatus _PyTuple_InitGlobalObjects(PyInterpreterState *);

/* other API */

PyAPI_FUNC(void) _PyTuple_Free(PyObject *self);
PyAPI_FUNC(void) _PyStolenTuple_Free(PyObject *self);

#define _PyTuple_ITEMS(op) _Py_RVALUE(_PyTuple_CAST(op)->ob_item)

Expand Down
15 changes: 9 additions & 6 deletions Include/internal/pycore_uop_ids.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 14 additions & 8 deletions Include/internal/pycore_uop_metadata.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 7 additions & 3 deletions Objects/tupleobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,16 +234,20 @@ _PyTuple_FromPairSteal(PyObject *first, PyObject *second)

/* Methods */

/*
Free of a tuple where all contents have been stolen and
is now untracked by GC. This operation is thus non-escaping.
*/
void
_PyTuple_Free(PyObject *obj)
_PyStolenTuple_Free(PyObject *obj)
{
assert(PyTuple_CheckExact(obj));
PyTupleObject *op = _PyTuple_CAST(obj);
assert(Py_SIZE(op) != 0);

assert(!_PyObject_GC_IS_TRACKED(obj));
// This will abort on the empty singleton (if there is one).
if (!maybe_freelist_push(op)) {
Py_TYPE(op)->tp_free((PyObject *)op);
PyTuple_Type.tp_free((PyObject *)op);
}
}

Expand Down
8 changes: 4 additions & 4 deletions Python/bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
#include "pycore_sliceobject.h" // _PyBuildSlice_ConsumeRefs
#include "pycore_stackref.h"
#include "pycore_template.h" // _PyTemplate_Build()
#include "pycore_tuple.h" // _PyTuple_Free(), _PyTuple_ITEMS()
#include "pycore_tuple.h" // _PyStolenTuple_Free(), _PyTuple_ITEMS()
#include "pycore_typeobject.h" // _PySuper_Lookup()

#include "pycore_dict.h"
Expand Down Expand Up @@ -1745,7 +1745,7 @@ dummy_func(
val0 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 0));
val1 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 1));
PyObject_GC_UnTrack(seq_o);
_PyTuple_Free(seq_o);
_PyStolenTuple_Free(seq_o);
}

op(_UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE, (seq -- val2, val1, val0)) {
Expand All @@ -1755,7 +1755,7 @@ dummy_func(
val1 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 1));
val2 = PyStackRef_FromPyObjectSteal(PyTuple_GET_ITEM(seq_o, 2));
PyObject_GC_UnTrack(seq_o);
_PyTuple_Free(seq_o);
_PyStolenTuple_Free(seq_o);
}

macro(UNPACK_SEQUENCE_TUPLE) =
Expand Down Expand Up @@ -1784,7 +1784,7 @@ dummy_func(
*values++ = PyStackRef_FromPyObjectSteal(items[i]);
}
PyObject_GC_UnTrack(seq_o);
_PyTuple_Free(seq_o);
_PyStolenTuple_Free(seq_o);
}

macro(UNPACK_SEQUENCE_LIST) =
Expand Down
97 changes: 72 additions & 25 deletions Python/executor_cases.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Tools/cases_generator/analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,8 @@ def has_error_without_pop(op: parser.CodeDef) -> bool:
"_PyThreadState_PopCStackRefSteal",
"doesnt_escape",
"_Py_GatherStats_GetIter",
"_PyStolenTuple_Free",
"PyObject_GC_UnTrack",
)


Expand Down
Loading