@@ -967,6 +967,16 @@ _Py_uop_symbol_is_immortal(JitOptSymbol *sym)
967967
968968bool
969969_Py_uop_sym_is_compact_int (JitOptRef ref )
970+ {
971+ JitOptSymbol * sym = PyJitRef_Unwrap (ref );
972+ if (sym -> tag == JIT_SYM_KNOWN_VALUE_TAG ) {
973+ return (bool )_PyLong_CheckExactAndCompact (sym -> value .value );
974+ }
975+ return sym -> tag == JIT_SYM_COMPACT_INT ;
976+ }
977+
978+ bool
979+ _Py_uop_sym_fits_int64 (JitOptRef ref )
970980{
971981 JitOptSymbol * sym = PyJitRef_Unwrap (ref );
972982 if (sym -> tag == JIT_SYM_KNOWN_VALUE_TAG ) {
@@ -1008,7 +1018,7 @@ _Py_uop_sym_set_compact_int(JitOptContext *ctx, JitOptRef ref)
10081018 }
10091019 return ;
10101020 case JIT_SYM_KNOWN_VALUE_TAG :
1011- if (!_PyLong_CheckExactAndFitsInt64 (sym -> value .value )) {
1021+ if (!_PyLong_CheckExactAndCompact (sym -> value .value )) {
10121022 Py_CLEAR (sym -> value .value );
10131023 sym_set_bottom (ctx , sym );
10141024 }
@@ -1567,6 +1577,7 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
15671577 _Py_uop_abstractcontext_init (ctx , NULL );
15681578 PyObject * val_42 = NULL ;
15691579 PyObject * val_43 = NULL ;
1580+ PyObject * val_noncompact_int64 = NULL ;
15701581 PyObject * val_big = NULL ;
15711582 PyObject * tuple = NULL ;
15721583 PyFunctionObject * func = NULL ;
@@ -1619,6 +1630,11 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
16191630 assert (val_43 != NULL );
16201631 assert (_Py_IsImmortal (val_43 ));
16211632
1633+ val_noncompact_int64 = PyNumber_Lshift (_PyLong_GetOne (), PyLong_FromLong (40 ));
1634+ if (val_noncompact_int64 == NULL ) {
1635+ goto fail ;
1636+ }
1637+
16221638 ref = _Py_uop_sym_new_type (ctx , & PyLong_Type );
16231639 if (PyJitRef_IsNull (ref )) {
16241640 goto fail ;
@@ -1960,10 +1976,19 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
19601976 }
19611977
19621978 JitOptRef ref_42 = _Py_uop_sym_new_const (ctx , val_42 );
1979+ JitOptRef ref_noncompact_int64 = _Py_uop_sym_new_const (ctx , val_noncompact_int64 );
19631980 JitOptRef ref_big = _Py_uop_sym_new_const (ctx , val_big );
19641981 JitOptRef ref_int = _Py_uop_sym_new_compact_int (ctx );
19651982 TEST_PREDICATE (_Py_uop_sym_is_compact_int (ref_42 ), "42 is not a compact int" );
1983+ TEST_PREDICATE (_Py_uop_sym_fits_int64 (ref_42 ), "42 does not fit int64" );
1984+ TEST_PREDICATE (
1985+ !_Py_uop_sym_is_compact_int (ref_noncompact_int64 ),
1986+ "(1 << 40) is a compact int" );
1987+ TEST_PREDICATE (
1988+ _Py_uop_sym_fits_int64 (ref_noncompact_int64 ),
1989+ "(1 << 40) does not fit int64" );
19661990 TEST_PREDICATE (!_Py_uop_sym_is_compact_int (ref_big ), "(1 << 200) is a compact int" );
1991+ TEST_PREDICATE (!_Py_uop_sym_fits_int64 (ref_big ), "(1 << 200) fits int64" );
19671992 TEST_PREDICATE (_Py_uop_sym_is_compact_int (ref_int ), "compact int is not a compact int" );
19681993 TEST_PREDICATE (_Py_uop_sym_matches_type (ref_int , & PyLong_Type ), "compact int is not an int" );
19691994
@@ -2092,6 +2117,7 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
20922117 _Py_uop_abstractcontext_fini (ctx );
20932118 Py_DECREF (val_42 );
20942119 Py_DECREF (val_43 );
2120+ Py_DECREF (val_noncompact_int64 );
20952121 Py_DECREF (val_big );
20962122 Py_DECREF (tuple );
20972123 Py_DECREF (func );
@@ -2101,6 +2127,7 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
21012127 _Py_uop_abstractcontext_fini (ctx );
21022128 Py_XDECREF (val_42 );
21032129 Py_XDECREF (val_43 );
2130+ Py_XDECREF (val_noncompact_int64 );
21042131 Py_XDECREF (val_big );
21052132 Py_XDECREF (tuple );
21062133 Py_XDECREF (func );
0 commit comments