diff options
author | Brandt Bucher <brandtbucher@microsoft.com> | 2025-04-01 22:10:15 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-01 22:10:15 (GMT) |
commit | 1a9d4a1fb3d4beda7c7e8483af7c6bc7ac477e9f (patch) | |
tree | 49680ffa71a7d842ae94c40fa45c2c436d9691c5 /Python/bytecodes.c | |
parent | cd69d55f64087f74da816eaf20c34ddeabfdb2bb (diff) | |
download | cpython-1a9d4a1fb3d4beda7c7e8483af7c6bc7ac477e9f.zip cpython-1a9d4a1fb3d4beda7c7e8483af7c6bc7ac477e9f.tar.gz cpython-1a9d4a1fb3d4beda7c7e8483af7c6bc7ac477e9f.tar.bz2 |
GH-131798: Allow the JIT to remove more int/float/str guards (GH-131800)
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r-- | Python/bytecodes.c | 86 |
1 files changed, 42 insertions, 44 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 83847e3..c50df89 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -524,6 +524,12 @@ dummy_func( res = PyStackRef_False; } + op(_GUARD_NOS_UNICODE, (nos, tos -- nos, tos)) { + (void)tos; + PyObject *o = PyStackRef_AsPyObjectBorrow(nos); + EXIT_IF(!PyUnicode_CheckExact(o)); + } + op(_GUARD_TOS_UNICODE, (value -- value)) { PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); EXIT_IF(!PyUnicode_CheckExact(value_o)); @@ -581,14 +587,8 @@ dummy_func( BINARY_OP_EXTEND, }; - op(_GUARD_BOTH_INT, (left, right -- left, right)) { - PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); - EXIT_IF(!PyLong_CheckExact(left_o)); - EXIT_IF(!PyLong_CheckExact(right_o)); - } - - op(_GUARD_NOS_INT, (left, unused -- left, unused)) { + op(_GUARD_NOS_INT, (left, right -- left, right)) { + (void)right; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); EXIT_IF(!PyLong_CheckExact(left_o)); } @@ -644,20 +644,14 @@ dummy_func( } macro(BINARY_OP_MULTIPLY_INT) = - _GUARD_BOTH_INT + unused/5 + _BINARY_OP_MULTIPLY_INT; + _GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_MULTIPLY_INT; macro(BINARY_OP_ADD_INT) = - _GUARD_BOTH_INT + unused/5 + _BINARY_OP_ADD_INT; + _GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_ADD_INT; macro(BINARY_OP_SUBTRACT_INT) = - _GUARD_BOTH_INT + unused/5 + _BINARY_OP_SUBTRACT_INT; + _GUARD_TOS_INT + _GUARD_NOS_INT + unused/5 + _BINARY_OP_SUBTRACT_INT; - op(_GUARD_BOTH_FLOAT, (left, right -- left, right)) { - PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); - EXIT_IF(!PyFloat_CheckExact(left_o)); - EXIT_IF(!PyFloat_CheckExact(right_o)); - } - - op(_GUARD_NOS_FLOAT, (left, unused -- left, unused)) { + op(_GUARD_NOS_FLOAT, (left, right -- left, right)) { + (void)right; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); EXIT_IF(!PyFloat_CheckExact(left_o)); } @@ -713,19 +707,11 @@ dummy_func( } macro(BINARY_OP_MULTIPLY_FLOAT) = - _GUARD_BOTH_FLOAT + unused/5 + _BINARY_OP_MULTIPLY_FLOAT; + _GUARD_TOS_FLOAT + _GUARD_NOS_FLOAT + unused/5 + _BINARY_OP_MULTIPLY_FLOAT; macro(BINARY_OP_ADD_FLOAT) = - _GUARD_BOTH_FLOAT + unused/5 + _BINARY_OP_ADD_FLOAT; + _GUARD_TOS_FLOAT + _GUARD_NOS_FLOAT + unused/5 + _BINARY_OP_ADD_FLOAT; macro(BINARY_OP_SUBTRACT_FLOAT) = - _GUARD_BOTH_FLOAT + unused/5 + _BINARY_OP_SUBTRACT_FLOAT; - - op(_GUARD_BOTH_UNICODE, (left, right -- left, right)) { - PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - PyObject *right_o = PyStackRef_AsPyObjectBorrow(right); - - EXIT_IF(!PyUnicode_CheckExact(left_o)); - EXIT_IF(!PyUnicode_CheckExact(right_o)); - } + _GUARD_TOS_FLOAT + _GUARD_NOS_FLOAT + unused/5 + _BINARY_OP_SUBTRACT_FLOAT; pure op(_BINARY_OP_ADD_UNICODE, (left, right -- res)) { PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); @@ -743,7 +729,7 @@ dummy_func( } macro(BINARY_OP_ADD_UNICODE) = - _GUARD_BOTH_UNICODE + unused/5 + _BINARY_OP_ADD_UNICODE; + _GUARD_TOS_UNICODE + _GUARD_NOS_UNICODE + unused/5 + _BINARY_OP_ADD_UNICODE; // This is a subtle one. It's a super-instruction for // BINARY_OP_ADD_UNICODE followed by STORE_FAST @@ -822,7 +808,7 @@ dummy_func( unused/1 + _GUARD_BINARY_OP_EXTEND + rewind/-4 + _BINARY_OP_EXTEND; macro(BINARY_OP_INPLACE_ADD_UNICODE) = - _GUARD_BOTH_UNICODE + unused/5 + _BINARY_OP_INPLACE_ADD_UNICODE; + _GUARD_TOS_UNICODE + _GUARD_NOS_UNICODE + unused/5 + _BINARY_OP_INPLACE_ADD_UNICODE; specializing op(_SPECIALIZE_BINARY_SLICE, (container, start, stop -- container, start, stop)) { // Placeholder until we implement BINARY_SLICE specialization @@ -875,11 +861,14 @@ dummy_func( macro(STORE_SLICE) = _SPECIALIZE_STORE_SLICE + _STORE_SLICE; - inst(BINARY_OP_SUBSCR_LIST_INT, (unused/5, list_st, sub_st -- res)) { + macro(BINARY_OP_SUBSCR_LIST_INT) = + _GUARD_TOS_INT + unused/5 + _BINARY_OP_SUBSCR_LIST_INT; + + op(_BINARY_OP_SUBSCR_LIST_INT, (list_st, sub_st -- res)) { PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); PyObject *list = PyStackRef_AsPyObjectBorrow(list_st); - DEOPT_IF(!PyLong_CheckExact(sub)); + assert(PyLong_CheckExact(sub)); DEOPT_IF(!PyList_CheckExact(list)); // Deopt unless 0 <= sub < PyList_Size(list) @@ -901,12 +890,15 @@ dummy_func( DECREF_INPUTS(); } - inst(BINARY_OP_SUBSCR_STR_INT, (unused/5, str_st, sub_st -- res)) { + macro(BINARY_OP_SUBSCR_STR_INT) = + _GUARD_TOS_INT + _GUARD_NOS_UNICODE + unused/5 + _BINARY_OP_SUBSCR_STR_INT; + + op(_BINARY_OP_SUBSCR_STR_INT, (str_st, sub_st -- res)) { PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); PyObject *str = PyStackRef_AsPyObjectBorrow(str_st); - DEOPT_IF(!PyLong_CheckExact(sub)); - DEOPT_IF(!PyUnicode_CheckExact(str)); + assert(PyLong_CheckExact(sub)); + assert(PyUnicode_CheckExact(str)); DEOPT_IF(!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)); Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0]; DEOPT_IF(PyUnicode_GET_LENGTH(str) <= index); @@ -921,11 +913,14 @@ dummy_func( res = PyStackRef_FromPyObjectImmortal(res_o); } - inst(BINARY_OP_SUBSCR_TUPLE_INT, (unused/5, tuple_st, sub_st -- res)) { + macro(BINARY_OP_SUBSCR_TUPLE_INT) = + _GUARD_TOS_INT + unused/5 + _BINARY_OP_SUBSCR_TUPLE_INT; + + op(_BINARY_OP_SUBSCR_TUPLE_INT, (tuple_st, sub_st -- res)) { PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); PyObject *tuple = PyStackRef_AsPyObjectBorrow(tuple_st); - DEOPT_IF(!PyLong_CheckExact(sub)); + assert(PyLong_CheckExact(sub)); DEOPT_IF(!PyTuple_CheckExact(tuple)); // Deopt unless 0 <= sub < PyTuple_Size(list) @@ -1025,11 +1020,14 @@ dummy_func( macro(STORE_SUBSCR) = _SPECIALIZE_STORE_SUBSCR + _STORE_SUBSCR; - inst(STORE_SUBSCR_LIST_INT, (unused/1, value, list_st, sub_st -- )) { + macro(STORE_SUBSCR_LIST_INT) = + _GUARD_TOS_INT + unused/1 + _STORE_SUBSCR_LIST_INT; + + op(_STORE_SUBSCR_LIST_INT, (value, list_st, sub_st -- )) { PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st); PyObject *list = PyStackRef_AsPyObjectBorrow(list_st); - DEOPT_IF(!PyLong_CheckExact(sub)); + assert(PyLong_CheckExact(sub)); DEOPT_IF(!PyList_CheckExact(list)); // Ensure nonnegative, zero-or-one-digit ints. @@ -2584,13 +2582,13 @@ dummy_func( macro(COMPARE_OP) = _SPECIALIZE_COMPARE_OP + _COMPARE_OP; macro(COMPARE_OP_FLOAT) = - _GUARD_BOTH_FLOAT + unused/1 + _COMPARE_OP_FLOAT; + _GUARD_TOS_FLOAT + _GUARD_NOS_FLOAT + unused/1 + _COMPARE_OP_FLOAT; macro(COMPARE_OP_INT) = - _GUARD_BOTH_INT + unused/1 + _COMPARE_OP_INT; + _GUARD_TOS_INT + _GUARD_NOS_INT + unused/1 + _COMPARE_OP_INT; macro(COMPARE_OP_STR) = - _GUARD_BOTH_UNICODE + unused/1 + _COMPARE_OP_STR; + _GUARD_TOS_UNICODE + _GUARD_NOS_UNICODE + unused/1 + _COMPARE_OP_STR; op(_COMPARE_OP_FLOAT, (left, right -- res)) { PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); |