Skip to content

Commit c7c755b

Browse files
int decref elimiation
1 parent 54812dd commit c7c755b

8 files changed

Lines changed: 154 additions & 51 deletions

File tree

Include/internal/pycore_opcode_metadata.h

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_uop_ids.h

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_uop_metadata.h

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/bytecodes.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ dummy_func(
611611
EXIT_IF(!_PyLong_IsCompact((PyLongObject *)value_o));
612612
}
613613

614-
pure op(_BINARY_OP_MULTIPLY_INT, (left, right -- res)) {
614+
pure op(_BINARY_OP_MULTIPLY_INT, (left, right -- res, l, r)) {
615615
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
616616
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
617617
assert(PyLong_CheckExact(left_o));
@@ -621,12 +621,12 @@ dummy_func(
621621
STAT_INC(BINARY_OP, hit);
622622
res = _PyCompactLong_Multiply((PyLongObject *)left_o, (PyLongObject *)right_o);
623623
EXIT_IF(PyStackRef_IsNull(res));
624-
PyStackRef_CLOSE_SPECIALIZED(right, _PyLong_ExactDealloc);
625-
PyStackRef_CLOSE_SPECIALIZED(left, _PyLong_ExactDealloc);
626624
INPUTS_DEAD();
625+
l = left;
626+
r = right;
627627
}
628628

629-
pure op(_BINARY_OP_ADD_INT, (left, right -- res)) {
629+
pure op(_BINARY_OP_ADD_INT, (left, right -- res, l, r)) {
630630
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
631631
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
632632
assert(PyLong_CheckExact(left_o));
@@ -636,12 +636,12 @@ dummy_func(
636636
STAT_INC(BINARY_OP, hit);
637637
res = _PyCompactLong_Add((PyLongObject *)left_o, (PyLongObject *)right_o);
638638
EXIT_IF(PyStackRef_IsNull(res));
639-
PyStackRef_CLOSE_SPECIALIZED(right, _PyLong_ExactDealloc);
640-
PyStackRef_CLOSE_SPECIALIZED(left, _PyLong_ExactDealloc);
641639
INPUTS_DEAD();
640+
l = left;
641+
r = right;
642642
}
643643

644-
pure op(_BINARY_OP_SUBTRACT_INT, (left, right -- res)) {
644+
pure op(_BINARY_OP_SUBTRACT_INT, (left, right -- res, l, r)) {
645645
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
646646
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
647647
assert(PyLong_CheckExact(left_o));
@@ -651,19 +651,19 @@ dummy_func(
651651
STAT_INC(BINARY_OP, hit);
652652
res = _PyCompactLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o);
653653
EXIT_IF(PyStackRef_IsNull(res));
654-
PyStackRef_CLOSE_SPECIALIZED(right, _PyLong_ExactDealloc);
655-
PyStackRef_CLOSE_SPECIALIZED(left, _PyLong_ExactDealloc);
656654
INPUTS_DEAD();
655+
l = left;
656+
r = right;
657657
}
658658

659659
macro(BINARY_OP_MULTIPLY_INT) =
660-
_GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_MULTIPLY_INT;
660+
_GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_MULTIPLY_INT + _POP_TOP_INT + _POP_TOP_INT;
661661

662662
macro(BINARY_OP_ADD_INT) =
663-
_GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_ADD_INT;
663+
_GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_ADD_INT + _POP_TOP_INT + _POP_TOP_INT;
664664

665665
macro(BINARY_OP_SUBTRACT_INT) =
666-
_GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_SUBTRACT_INT;
666+
_GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_SUBTRACT_INT + _POP_TOP_INT + _POP_TOP_INT;
667667

668668
op(_GUARD_NOS_FLOAT, (left, unused -- left, unused)) {
669669
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);

Python/executor_cases.c.h

Lines changed: 24 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 48 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/optimizer_bytecodes.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,16 +235,22 @@ dummy_func(void) {
235235
}
236236
}
237237

238-
op(_BINARY_OP_ADD_INT, (left, right -- res)) {
238+
op(_BINARY_OP_ADD_INT, (left, right -- res, l , r)) {
239239
res = sym_new_compact_int(ctx);
240+
l = left;
241+
r = right;
240242
}
241243

242-
op(_BINARY_OP_SUBTRACT_INT, (left, right -- res)) {
244+
op(_BINARY_OP_SUBTRACT_INT, (left, right -- res, l, r)) {
243245
res = sym_new_compact_int(ctx);
246+
l = left;
247+
r = right;
244248
}
245249

246-
op(_BINARY_OP_MULTIPLY_INT, (left, right -- res)) {
250+
op(_BINARY_OP_MULTIPLY_INT, (left, right -- res, l, r)) {
247251
res = sym_new_compact_int(ctx);
252+
l = left;
253+
r = right;
248254
}
249255

250256
op(_BINARY_OP_ADD_FLOAT, (left, right -- res)) {
@@ -580,6 +586,13 @@ dummy_func(void) {
580586
}
581587
}
582588

589+
op(_POP_TOP_INT, (value -- )) {
590+
if (PyJitRef_IsBorrowed(value) ||
591+
sym_is_immortal(PyJitRef_Unwrap(value))) {
592+
REPLACE_OP(this_instr, _POP_TOP_NOP, 0, 0);
593+
}
594+
}
595+
583596
op(_COPY, (bottom, unused[oparg-1] -- bottom, unused[oparg-1], top)) {
584597
assert(oparg > 0);
585598
top = bottom;

0 commit comments

Comments
 (0)