diff options
| author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2025-05-06 10:12:26 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-06 10:12:26 (GMT) |
| commit | 296cd128bf433b8d3b8d9387d7a8ca2de430fbad (patch) | |
| tree | d4703de684de96ec46488198f8e3e188b393cd7f /Python | |
| parent | 3c73cf51df2643cc144b03ac1003588d8822d5b5 (diff) | |
| download | cpython-296cd128bf433b8d3b8d9387d7a8ca2de430fbad.zip cpython-296cd128bf433b8d3b8d9387d7a8ca2de430fbad.tar.gz cpython-296cd128bf433b8d3b8d9387d7a8ca2de430fbad.tar.bz2 | |
Revert "gh-133395: add option for extension modules to specialize BINARY_OP/SUBSCR, apply to arrays (#133396)" (#133498)
Diffstat (limited to 'Python')
| -rw-r--r-- | Python/bytecodes.c | 15 | ||||
| -rw-r--r-- | Python/executor_cases.c.h | 24 | ||||
| -rw-r--r-- | Python/generated_cases.c.h | 29 | ||||
| -rw-r--r-- | Python/optimizer_cases.c.h | 4 | ||||
| -rw-r--r-- | Python/specialize.c | 35 |
5 files changed, 34 insertions, 73 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 90234b2..6a07666 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -801,19 +801,9 @@ dummy_func( PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr; assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5); - assert(d); - assert(d->guard); + assert(d && d->guard); int res = d->guard(left_o, right_o); - ERROR_IF(res < 0); - if (res == 0) { - if (d->free) { - d->free(d); - } - _PyBinaryOpCache *cache = (_PyBinaryOpCache *)(this_instr+1); - write_ptr(cache->external_cache, NULL); - this_instr->op.code = BINARY_OP; - DEOPT_IF(true); - } + DEOPT_IF(!res); } pure op(_BINARY_OP_EXTEND, (descr/4, left, right -- res)) { @@ -826,7 +816,6 @@ dummy_func( PyObject *res_o = d->action(left_o, right_o); DECREF_INPUTS(); - ERROR_IF(res_o == NULL); res = PyStackRef_FromPyObjectSteal(res_o); } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index c182971..3e51ac4 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1147,7 +1147,26 @@ break; } - /* _GUARD_BINARY_OP_EXTEND is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ + case _GUARD_BINARY_OP_EXTEND: { + _PyStackRef right; + _PyStackRef left; + right = stack_pointer[-1]; + left = stack_pointer[-2]; + PyObject *descr = (PyObject *)CURRENT_OPERAND0(); + PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); + PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); + _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr; + assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5); + assert(d && d->guard); + _PyFrame_SetStackPointer(frame, stack_pointer); + int res = d->guard(left_o, right_o); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (!res) { + UOP_STAT_INC(uopcode, miss); + JUMP_TO_JUMP_TARGET(); + } + break; + } case _BINARY_OP_EXTEND: { _PyStackRef right; @@ -1174,9 +1193,6 @@ stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -2; assert(WITHIN_STACK_BOUNDS()); - if (res_o == NULL) { - JUMP_TO_ERROR(); - } res = PyStackRef_FromPyObjectSteal(res_o); stack_pointer[0] = res; stack_pointer += 1; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index ca077da..7e8b05b 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -283,30 +283,14 @@ PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); _PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr; assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5); - assert(d); - assert(d->guard); + assert(d && d->guard); _PyFrame_SetStackPointer(frame, stack_pointer); int res = d->guard(left_o, right_o); stack_pointer = _PyFrame_GetStackPointer(frame); - if (res < 0) { - JUMP_TO_LABEL(error); - } - if (res == 0) { - if (d->free) { - _PyFrame_SetStackPointer(frame, stack_pointer); - d->free(d); - stack_pointer = _PyFrame_GetStackPointer(frame); - } - _PyBinaryOpCache *cache = (_PyBinaryOpCache *)(this_instr+1); - _PyFrame_SetStackPointer(frame, stack_pointer); - write_ptr(cache->external_cache, NULL); - stack_pointer = _PyFrame_GetStackPointer(frame); - this_instr->op.code = BINARY_OP; - if (true) { - UPDATE_MISS_STATS(BINARY_OP); - assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); - JUMP_TO_PREDICTED(BINARY_OP); - } + if (!res) { + UPDATE_MISS_STATS(BINARY_OP); + assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); + JUMP_TO_PREDICTED(BINARY_OP); } } /* Skip -4 cache entry */ @@ -331,9 +315,6 @@ stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -2; assert(WITHIN_STACK_BOUNDS()); - if (res_o == NULL) { - JUMP_TO_LABEL(error); - } res = PyStackRef_FromPyObjectSteal(res_o); } stack_pointer[0] = res; diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index a9bb67d..56b4b99 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -554,7 +554,9 @@ break; } - /* _GUARD_BINARY_OP_EXTEND is not a viable micro-op for tier 2 */ + case _GUARD_BINARY_OP_EXTEND: { + break; + } case _BINARY_OP_EXTEND: { JitOptSymbol *res; diff --git a/Python/specialize.c b/Python/specialize.c index 7861f38..bbe725c 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -2534,7 +2534,7 @@ LONG_FLOAT_ACTION(compactlong_float_multiply, *) LONG_FLOAT_ACTION(compactlong_float_true_div, /) #undef LONG_FLOAT_ACTION -static const _PyBinaryOpSpecializationDescr binaryop_extend_builtins[] = { +static _PyBinaryOpSpecializationDescr binaryop_extend_descrs[] = { /* long-long arithmetic */ {NB_OR, compactlongs_guard, compactlongs_or}, {NB_AND, compactlongs_guard, compactlongs_and}, @@ -2560,41 +2560,14 @@ static int binary_op_extended_specialization(PyObject *lhs, PyObject *rhs, int oparg, _PyBinaryOpSpecializationDescr **descr) { - /* We are currently using this only for NB_SUBSCR, which is not - * commutative. Will need to revisit this function when we use - * this for operators which are. - */ - - typedef _PyBinaryOpSpecializationDescr descr_type; - size_t size = Py_ARRAY_LENGTH(binaryop_extend_builtins); - for (size_t i = 0; i < size; i++) { - descr_type *d = (descr_type *)&binaryop_extend_builtins[i]; - assert(d != NULL); - assert(d->guard != NULL); + size_t n = sizeof(binaryop_extend_descrs)/sizeof(_PyBinaryOpSpecializationDescr); + for (size_t i = 0; i < n; i++) { + _PyBinaryOpSpecializationDescr *d = &binaryop_extend_descrs[i]; if (d->oparg == oparg && d->guard(lhs, rhs)) { *descr = d; return 1; } } - - PyTypeObject *lhs_type = Py_TYPE(lhs); - if (lhs_type->tp_binop_specialize != NULL) { - int ret = lhs_type->tp_binop_specialize(lhs, rhs, oparg, descr); - if (ret < 0) { - return -1; - } - if (ret == 1) { - if (*descr == NULL) { - PyErr_Format( - PyExc_ValueError, - "tp_binop_specialize of '%T' returned 1 with *descr == NULL", - lhs); - return -1; - } - (*descr)->oparg = oparg; - } - return ret; - } return 0; } |
