Skip to content

Commit 233e32f

Browse files
authored
GH-102300: Reuse objects with refcount == 1 in float specialized binary ops. (GH-102301)
1 parent 78e4e6c commit 233e32f

File tree

4 files changed

+27
-24
lines changed

4 files changed

+27
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Reuse operands with refcount of 1 in float specializations of BINARY_OP.

Python/bytecodes.c

+3-12
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,7 @@ dummy_func(
195195
STAT_INC(BINARY_OP, hit);
196196
double dprod = ((PyFloatObject *)left)->ob_fval *
197197
((PyFloatObject *)right)->ob_fval;
198-
prod = PyFloat_FromDouble(dprod);
199-
_Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
200-
_Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc);
201-
ERROR_IF(prod == NULL, error);
198+
DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dprod, prod);
202199
}
203200

204201
inst(BINARY_OP_SUBTRACT_INT, (unused/1, left, right -- sub)) {
@@ -218,10 +215,7 @@ dummy_func(
218215
DEOPT_IF(!PyFloat_CheckExact(right), BINARY_OP);
219216
STAT_INC(BINARY_OP, hit);
220217
double dsub = ((PyFloatObject *)left)->ob_fval - ((PyFloatObject *)right)->ob_fval;
221-
sub = PyFloat_FromDouble(dsub);
222-
_Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
223-
_Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc);
224-
ERROR_IF(sub == NULL, error);
218+
DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dsub, sub);
225219
}
226220

227221
inst(BINARY_OP_ADD_UNICODE, (unused/1, left, right -- res)) {
@@ -278,10 +272,7 @@ dummy_func(
278272
STAT_INC(BINARY_OP, hit);
279273
double dsum = ((PyFloatObject *)left)->ob_fval +
280274
((PyFloatObject *)right)->ob_fval;
281-
sum = PyFloat_FromDouble(dsum);
282-
_Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);
283-
_Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc);
284-
ERROR_IF(sum == NULL, error);
275+
DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dsum, sum);
285276
}
286277

287278
inst(BINARY_OP_ADD_INT, (unused/1, left, right -- sum)) {

Python/ceval_macros.h

+20
Original file line numberDiff line numberDiff line change
@@ -350,3 +350,23 @@ GETITEM(PyObject *v, Py_ssize_t i) {
350350

351351
#define KWNAMES_LEN() \
352352
(kwnames == NULL ? 0 : ((int)PyTuple_GET_SIZE(kwnames)))
353+
354+
#define DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dval, result) \
355+
do { \
356+
if (Py_REFCNT(left) == 1) { \
357+
((PyFloatObject *)left)->ob_fval = (dval); \
358+
_Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc);\
359+
result = (left); \
360+
} \
361+
else if (Py_REFCNT(right) == 1) {\
362+
((PyFloatObject *)right)->ob_fval = (dval); \
363+
_Py_DECREF_NO_DEALLOC(left); \
364+
result = (right); \
365+
}\
366+
else { \
367+
result = PyFloat_FromDouble(dval); \
368+
if ((result) == NULL) goto error; \
369+
_Py_DECREF_NO_DEALLOC(left); \
370+
_Py_DECREF_NO_DEALLOC(right); \
371+
} \
372+
} while (0)

Python/generated_cases.c.h

+3-12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)