summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2025-05-06 10:12:26 (GMT)
committerGitHub <noreply@github.com>2025-05-06 10:12:26 (GMT)
commit296cd128bf433b8d3b8d9387d7a8ca2de430fbad (patch)
treed4703de684de96ec46488198f8e3e188b393cd7f /Python
parent3c73cf51df2643cc144b03ac1003588d8822d5b5 (diff)
downloadcpython-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.c15
-rw-r--r--Python/executor_cases.c.h24
-rw-r--r--Python/generated_cases.c.h29
-rw-r--r--Python/optimizer_cases.c.h4
-rw-r--r--Python/specialize.c35
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;
}