diff options
author | Mark Shannon <mark@hotpy.org> | 2024-08-27 09:49:39 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-27 09:49:39 (GMT) |
commit | 54a05a46002ee1c9211f299df38f444f16866ef5 (patch) | |
tree | eb4e94b3b62723936598a68bfcaef6eb6d66c389 /Python | |
parent | 89328f7b129a6e4d7164f954b976bf45da69f0b2 (diff) | |
download | cpython-54a05a46002ee1c9211f299df38f444f16866ef5.zip cpython-54a05a46002ee1c9211f299df38f444f16866ef5.tar.gz cpython-54a05a46002ee1c9211f299df38f444f16866ef5.tar.bz2 |
GH-123232: Factor BINARY_SLICE and STORE_SLICE to handle stats properly for tier 2. (GH-123381)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bytecodes.c | 24 | ||||
-rw-r--r-- | Python/executor_cases.c.h | 2 | ||||
-rw-r--r-- | Python/generated_cases.c.h | 74 |
3 files changed, 66 insertions, 34 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c index ad30fb3..01e88a3 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -668,11 +668,17 @@ dummy_func( macro(BINARY_SUBSCR) = _SPECIALIZE_BINARY_SUBSCR + _BINARY_SUBSCR; - inst(BINARY_SLICE, (container, start, stop -- res)) { + specializing op(_SPECIALIZE_BINARY_SLICE, (container, start, stop -- container, start, stop)) { + // Placeholder until we implement BINARY_SLICE specialization + #if ENABLE_SPECIALIZATION + OPCODE_DEFERRED_INC(BINARY_SLICE); + #endif /* ENABLE_SPECIALIZATION */ + } + + op(_BINARY_SLICE, (container, start, stop -- res)) { PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start), PyStackRef_AsPyObjectSteal(stop)); PyObject *res_o; - OPCODE_DEFERRED_INC(BINARY_SLICE); // Can't use ERROR_IF() here, because we haven't // DECREF'ed container yet, and we still own slice. if (slice == NULL) { @@ -687,10 +693,18 @@ dummy_func( res = PyStackRef_FromPyObjectSteal(res_o); } - inst(STORE_SLICE, (v, container, start, stop -- )) { + macro(BINARY_SLICE) = _SPECIALIZE_BINARY_SLICE + _BINARY_SLICE; + + specializing op(_SPECIALIZE_STORE_SLICE, (v, container, start, stop -- v, container, start, stop)) { + // Placeholder until we implement STORE_SLICE specialization + #if ENABLE_SPECIALIZATION + OPCODE_DEFERRED_INC(STORE_SLICE); + #endif /* ENABLE_SPECIALIZATION */ + } + + op(_STORE_SLICE, (v, container, start, stop -- )) { PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start), PyStackRef_AsPyObjectSteal(stop)); - OPCODE_DEFERRED_INC(STORE_SLICE); int err; if (slice == NULL) { err = 1; @@ -704,6 +718,8 @@ dummy_func( ERROR_IF(err, error); } + macro(STORE_SLICE) = _SPECIALIZE_STORE_SLICE + _STORE_SLICE; + inst(BINARY_SUBSCR_LIST_INT, (unused/1, list_st, sub_st -- res)) { PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); PyObject *list = PyStackRef_AsPyObjectBorrow(list_st); diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 3d0f3b3..0de5c8a 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -797,7 +797,6 @@ PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start), PyStackRef_AsPyObjectSteal(stop)); PyObject *res_o; - OPCODE_DEFERRED_INC(BINARY_SLICE); // Can't use ERROR_IF() here, because we haven't // DECREF'ed container yet, and we still own slice. if (slice == NULL) { @@ -827,7 +826,6 @@ v = stack_pointer[-4]; PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start), PyStackRef_AsPyObjectSteal(stop)); - OPCODE_DEFERRED_INC(STORE_SLICE); int err; if (slice == NULL) { err = 1; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index bf75cb9..9a75101 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -371,25 +371,34 @@ _PyStackRef start; _PyStackRef stop; _PyStackRef res; + // _SPECIALIZE_BINARY_SLICE + { + // Placeholder until we implement BINARY_SLICE specialization + #if ENABLE_SPECIALIZATION + OPCODE_DEFERRED_INC(BINARY_SLICE); + #endif /* ENABLE_SPECIALIZATION */ + } + // _BINARY_SLICE stop = stack_pointer[-1]; start = stack_pointer[-2]; container = stack_pointer[-3]; - PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start), - PyStackRef_AsPyObjectSteal(stop)); - PyObject *res_o; - OPCODE_DEFERRED_INC(BINARY_SLICE); - // Can't use ERROR_IF() here, because we haven't - // DECREF'ed container yet, and we still own slice. - if (slice == NULL) { - res_o = NULL; - } - else { - res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice); - Py_DECREF(slice); + { + PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start), + PyStackRef_AsPyObjectSteal(stop)); + PyObject *res_o; + // Can't use ERROR_IF() here, because we haven't + // DECREF'ed container yet, and we still own slice. + if (slice == NULL) { + res_o = NULL; + } + else { + res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice); + Py_DECREF(slice); + } + PyStackRef_CLOSE(container); + if (res_o == NULL) goto pop_3_error; + res = PyStackRef_FromPyObjectSteal(res_o); } - PyStackRef_CLOSE(container); - if (res_o == NULL) goto pop_3_error; - res = PyStackRef_FromPyObjectSteal(res_o); stack_pointer[-3] = res; stack_pointer += -2; assert(WITHIN_STACK_BOUNDS()); @@ -7085,24 +7094,33 @@ _PyStackRef container; _PyStackRef start; _PyStackRef stop; + // _SPECIALIZE_STORE_SLICE + { + // Placeholder until we implement STORE_SLICE specialization + #if ENABLE_SPECIALIZATION + OPCODE_DEFERRED_INC(STORE_SLICE); + #endif /* ENABLE_SPECIALIZATION */ + } + // _STORE_SLICE stop = stack_pointer[-1]; start = stack_pointer[-2]; container = stack_pointer[-3]; v = stack_pointer[-4]; - PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start), - PyStackRef_AsPyObjectSteal(stop)); - OPCODE_DEFERRED_INC(STORE_SLICE); - int err; - if (slice == NULL) { - err = 1; - } - else { - err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), slice, PyStackRef_AsPyObjectBorrow(v)); - Py_DECREF(slice); + { + PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start), + PyStackRef_AsPyObjectSteal(stop)); + int err; + if (slice == NULL) { + err = 1; + } + else { + err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), slice, PyStackRef_AsPyObjectBorrow(v)); + Py_DECREF(slice); + } + PyStackRef_CLOSE(v); + PyStackRef_CLOSE(container); + if (err) goto pop_4_error; } - PyStackRef_CLOSE(v); - PyStackRef_CLOSE(container); - if (err) goto pop_4_error; stack_pointer += -4; assert(WITHIN_STACK_BOUNDS()); DISPATCH(); |