Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
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
2 changes: 1 addition & 1 deletion Include/internal/pycore_opcode_metadata.h

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

9 changes: 5 additions & 4 deletions Include/internal/pycore_uop_ids.h

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

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

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

18 changes: 18 additions & 0 deletions Lib/test/test_capi/test_opt.py
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,24 @@ def testfunc(n, m):
uops = get_opnames(ex)
self.assertIn("_FOR_ITER_TIER_TWO", uops)

def test_unpack_sequence_two_tuple(self):
def testfunc(x):
i = 0
while i < x:
i += 1
t = (i, i)
a, b = t
return a, b

res = testfunc(TIER2_THRESHOLD)
self.assertEqual(res, (TIER2_THRESHOLD, TIER2_THRESHOLD))

ex = get_first_executor(testfunc)
self.assertIsNotNone(ex)
uops = get_opnames(ex)
self.assertIn("_UNPACK_SEQUENCE_TWO_TUPLE", uops)
self.assertNotIn("_POP_TOP", uops)


@requires_specialization
@unittest.skipIf(Py_GIL_DISABLED, "optimizer not yet supported in free-threaded builds")
Expand Down
9 changes: 5 additions & 4 deletions Python/bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1598,20 +1598,21 @@ dummy_func(
macro(UNPACK_SEQUENCE) = _SPECIALIZE_UNPACK_SEQUENCE + _UNPACK_SEQUENCE;

macro(UNPACK_SEQUENCE_TWO_TUPLE) =
_GUARD_TOS_TUPLE + unused/1 + _UNPACK_SEQUENCE_TWO_TUPLE;
_GUARD_TOS_TUPLE + unused/1 + _UNPACK_SEQUENCE_TWO_TUPLE + POP_TOP;

op(_UNPACK_SEQUENCE_TWO_TUPLE, (seq -- val1, val0)) {
op(_UNPACK_SEQUENCE_TWO_TUPLE, (seq -- val1, val0, s)) {
assert(oparg == 2);
PyObject *seq_o = PyStackRef_AsPyObjectBorrow(seq);
assert(PyTuple_CheckExact(seq_o));
DEOPT_IF(PyTuple_GET_SIZE(seq_o) != 2);
STAT_INC(UNPACK_SEQUENCE, hit);
val0 = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(seq_o, 0));
val1 = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(seq_o, 1));
PyStackRef_CLOSE(seq);
s = seq;
INPUTS_DEAD();
}

macro(UNPACK_SEQUENCE_TUPLE) =
macro(UNPACK_SEQUENCE_TUPLE) =
Comment thread
Fidget-Spinner marked this conversation as resolved.
Outdated
_GUARD_TOS_TUPLE + unused/1 + _UNPACK_SEQUENCE_TUPLE;

op(_UNPACK_SEQUENCE_TUPLE, (seq -- values[oparg])) {
Expand Down
48 changes: 36 additions & 12 deletions Python/executor_cases.c.h

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

9 changes: 8 additions & 1 deletion Python/generated_cases.c.h

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

3 changes: 2 additions & 1 deletion Python/optimizer_bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1188,9 +1188,10 @@ dummy_func(void) {
set = sym_new_type(ctx, &PySet_Type);
}

op(_UNPACK_SEQUENCE_TWO_TUPLE, (seq -- val1, val0)) {
op(_UNPACK_SEQUENCE_TWO_TUPLE, (seq -- val1, val0, s)) {
val0 = sym_tuple_getitem(ctx, seq, 0);
val1 = sym_tuple_getitem(ctx, seq, 1);
s = seq;
}

op(_UNPACK_SEQUENCE_TUPLE, (seq -- values[oparg])) {
Expand Down
7 changes: 5 additions & 2 deletions Python/optimizer_cases.c.h

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

Loading