mirror of
https://github.com/python/cpython.git
synced 2025-08-25 19:24:42 +00:00
GH-131798: Allow the JIT to remove more int/float/str guards (GH-131800)
This commit is contained in:
parent
cd69d55f64
commit
1a9d4a1fb3
10 changed files with 756 additions and 703 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue