13
13
#include "pycore_abstract.h" // _PyIndex_Check()
14
14
#include "pycore_call.h" // _PyObject_FastCallDictTstate()
15
15
#include "pycore_ceval.h" // _PyEval_SignalAsyncExc()
16
- #include "pycore_code.h" // saturating_increment()
16
+ #include "pycore_code.h"
17
17
#include "pycore_initconfig.h" // _PyStatus_OK()
18
18
#include "pycore_long.h" // _PyLong_GetZero()
19
19
#include "pycore_object.h" // _PyObject_GC_TRACK()
@@ -1452,11 +1452,6 @@ eval_frame_handle_pending(PyThreadState *tstate)
1452
1452
1453
1453
#define UPDATE_PREV_INSTR_OPARG (instr , oparg ) ((uint8_t*)(instr))[-1] = (oparg)
1454
1454
1455
- static inline void
1456
- record_hit_inline (_Py_CODEUNIT * next_instr , int oparg )
1457
- {
1458
- UPDATE_PREV_INSTR_OPARG (next_instr , saturating_increment (oparg ));
1459
- }
1460
1455
1461
1456
#define GLOBALS () frame->f_globals
1462
1457
#define BUILTINS () frame->f_builtins
@@ -1480,7 +1475,6 @@ record_hit_inline(_Py_CODEUNIT *next_instr, int oparg)
1480
1475
res = ep->me_value; \
1481
1476
DEOPT_IF(res == NULL, LOAD_##attr_or_method); \
1482
1477
STAT_INC(LOAD_##attr_or_method, hit); \
1483
- record_cache_hit(cache0); \
1484
1478
Py_INCREF(res);
1485
1479
1486
1480
static int
@@ -1976,7 +1970,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
1976
1970
DEOPT_IF (!PyLong_CheckExact (left ), BINARY_MULTIPLY );
1977
1971
DEOPT_IF (!PyLong_CheckExact (right ), BINARY_MULTIPLY );
1978
1972
STAT_INC (BINARY_MULTIPLY , hit );
1979
- record_hit_inline (next_instr , oparg );
1980
1973
PyObject * prod = _PyLong_Multiply ((PyLongObject * )left , (PyLongObject * )right );
1981
1974
SET_SECOND (prod );
1982
1975
Py_DECREF (right );
@@ -1994,7 +1987,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
1994
1987
DEOPT_IF (!PyFloat_CheckExact (left ), BINARY_MULTIPLY );
1995
1988
DEOPT_IF (!PyFloat_CheckExact (right ), BINARY_MULTIPLY );
1996
1989
STAT_INC (BINARY_MULTIPLY , hit );
1997
- record_hit_inline (next_instr , oparg );
1998
1990
double dprod = ((PyFloatObject * )left )-> ob_fval *
1999
1991
((PyFloatObject * )right )-> ob_fval ;
2000
1992
PyObject * prod = PyFloat_FromDouble (dprod );
@@ -2103,7 +2095,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
2103
2095
DEOPT_IF (!PyUnicode_CheckExact (left ), BINARY_ADD );
2104
2096
DEOPT_IF (Py_TYPE (right ) != Py_TYPE (left ), BINARY_ADD );
2105
2097
STAT_INC (BINARY_ADD , hit );
2106
- record_hit_inline (next_instr , oparg );
2107
2098
PyObject * res = PyUnicode_Concat (left , right );
2108
2099
STACK_SHRINK (1 );
2109
2100
SET_TOP (res );
@@ -2132,7 +2123,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
2132
2123
PyObject * var = GETLOCAL (next_oparg );
2133
2124
DEOPT_IF (var != left , BINARY_ADD );
2134
2125
STAT_INC (BINARY_ADD , hit );
2135
- record_hit_inline (next_instr , oparg );
2136
2126
GETLOCAL (next_oparg ) = NULL ;
2137
2127
Py_DECREF (left );
2138
2128
STACK_SHRINK (1 );
@@ -2150,7 +2140,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
2150
2140
DEOPT_IF (!PyFloat_CheckExact (left ), BINARY_ADD );
2151
2141
DEOPT_IF (Py_TYPE (right ) != Py_TYPE (left ), BINARY_ADD );
2152
2142
STAT_INC (BINARY_ADD , hit );
2153
- record_hit_inline (next_instr , oparg );
2154
2143
double dsum = ((PyFloatObject * )left )-> ob_fval +
2155
2144
((PyFloatObject * )right )-> ob_fval ;
2156
2145
PyObject * sum = PyFloat_FromDouble (dsum );
@@ -2170,7 +2159,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
2170
2159
DEOPT_IF (!PyLong_CheckExact (left ), BINARY_ADD );
2171
2160
DEOPT_IF (Py_TYPE (right ) != Py_TYPE (left ), BINARY_ADD );
2172
2161
STAT_INC (BINARY_ADD , hit );
2173
- record_hit_inline (next_instr , oparg );
2174
2162
PyObject * sum = _PyLong_Add ((PyLongObject * )left , (PyLongObject * )right );
2175
2163
SET_SECOND (sum );
2176
2164
Py_DECREF (right );
@@ -2241,8 +2229,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
2241
2229
assert (((PyLongObject * )_PyLong_GetZero ())-> ob_digit [0 ] == 0 );
2242
2230
Py_ssize_t index = ((PyLongObject * )sub )-> ob_digit [0 ];
2243
2231
DEOPT_IF (index >= PyList_GET_SIZE (list ), BINARY_SUBSCR );
2244
-
2245
- record_hit_inline (next_instr , oparg );
2246
2232
STAT_INC (BINARY_SUBSCR , hit );
2247
2233
PyObject * res = PyList_GET_ITEM (list , index );
2248
2234
assert (res != NULL );
@@ -2266,8 +2252,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
2266
2252
assert (((PyLongObject * )_PyLong_GetZero ())-> ob_digit [0 ] == 0 );
2267
2253
Py_ssize_t index = ((PyLongObject * )sub )-> ob_digit [0 ];
2268
2254
DEOPT_IF (index >= PyTuple_GET_SIZE (tuple ), BINARY_SUBSCR );
2269
-
2270
- record_hit_inline (next_instr , oparg );
2271
2255
STAT_INC (BINARY_SUBSCR , hit );
2272
2256
PyObject * res = PyTuple_GET_ITEM (tuple , index );
2273
2257
assert (res != NULL );
@@ -2282,7 +2266,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
2282
2266
TARGET (BINARY_SUBSCR_DICT ) {
2283
2267
PyObject * dict = SECOND ();
2284
2268
DEOPT_IF (!PyDict_CheckExact (SECOND ()), BINARY_SUBSCR );
2285
- record_hit_inline (next_instr , oparg );
2286
2269
STAT_INC (BINARY_SUBSCR , hit );
2287
2270
PyObject * sub = TOP ();
2288
2271
PyObject * res = PyDict_GetItemWithError (dict , sub );
@@ -3258,7 +3241,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
3258
3241
PyDictKeyEntry * ep = DK_ENTRIES (dict -> ma_keys ) + cache0 -> index ;
3259
3242
PyObject * res = ep -> me_value ;
3260
3243
DEOPT_IF (res == NULL , LOAD_GLOBAL );
3261
- record_cache_hit (cache0 );
3262
3244
STAT_INC (LOAD_GLOBAL , hit );
3263
3245
Py_INCREF (res );
3264
3246
PUSH (res );
@@ -3279,7 +3261,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
3279
3261
PyDictKeyEntry * ep = DK_ENTRIES (bdict -> ma_keys ) + cache0 -> index ;
3280
3262
PyObject * res = ep -> me_value ;
3281
3263
DEOPT_IF (res == NULL , LOAD_GLOBAL );
3282
- record_cache_hit (cache0 );
3283
3264
STAT_INC (LOAD_GLOBAL , hit );
3284
3265
Py_INCREF (res );
3285
3266
PUSH (res );
@@ -3702,7 +3683,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
3702
3683
res = values -> values [cache0 -> index ];
3703
3684
DEOPT_IF (res == NULL , LOAD_ATTR );
3704
3685
STAT_INC (LOAD_ATTR , hit );
3705
- record_cache_hit (cache0 );
3706
3686
Py_INCREF (res );
3707
3687
SET_TOP (res );
3708
3688
Py_DECREF (owner );
@@ -3742,7 +3722,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
3742
3722
res = ep -> me_value ;
3743
3723
DEOPT_IF (res == NULL , LOAD_ATTR );
3744
3724
STAT_INC (LOAD_ATTR , hit );
3745
- record_cache_hit (cache0 );
3746
3725
Py_INCREF (res );
3747
3726
SET_TOP (res );
3748
3727
Py_DECREF (owner );
@@ -3763,7 +3742,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
3763
3742
res = * (PyObject * * )addr ;
3764
3743
DEOPT_IF (res == NULL , LOAD_ATTR );
3765
3744
STAT_INC (LOAD_ATTR , hit );
3766
- record_cache_hit (cache0 );
3767
3745
Py_INCREF (res );
3768
3746
SET_TOP (res );
3769
3747
Py_DECREF (owner );
@@ -3805,7 +3783,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
3805
3783
PyDictValues * values = * (PyDictValues * * )(((char * )owner ) + tp -> tp_inline_values_offset );
3806
3784
DEOPT_IF (values == NULL , STORE_ATTR );
3807
3785
STAT_INC (STORE_ATTR , hit );
3808
- record_cache_hit (cache0 );
3809
3786
int index = cache0 -> index ;
3810
3787
STACK_SHRINK (1 );
3811
3788
PyObject * value = POP ();
@@ -3843,7 +3820,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
3843
3820
PyObject * old_value = ep -> me_value ;
3844
3821
DEOPT_IF (old_value == NULL , STORE_ATTR );
3845
3822
STAT_INC (STORE_ATTR , hit );
3846
- record_cache_hit (cache0 );
3847
3823
STACK_SHR
179B
INK (1 );
3848
3824
PyObject * value = POP ();
3849
3825
ep -> me_value = value ;
@@ -3869,7 +3845,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
3869
3845
DEOPT_IF (tp -> tp_version_tag != cache1 -> tp_version, STORE_ATTR );
3870
3846
char * addr = (char * )owner + cache0 -> index ;
3871
3847
STAT_INC (STORE_ATTR , hit );
3872
- record_cache_hit (cache0 );
3873
3848
STACK_SHRINK (1 );
3874
3849
PyObject * value = POP ();
3875
3850
PyObject * old_value = * (PyObject * * )addr ;
@@ -4527,7 +4502,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4527
4502
PyObject * self = TOP ();
4528
4503
PyTypeObject * self_cls = Py_TYPE (self );
4529
4504
SpecializedCacheEntry * caches = GET_CACHE ();
4530
- _PyAdaptiveEntry * cache0 = & caches [0 ].adaptive ;
4531
4505
_PyAttrCache * cache1 = & caches [-1 ].attr ;
4532
4506
_PyObjectCache * cache2 = & caches [-2 ].obj ;
4533
4507
@@ -4538,7 +4512,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4538
4512
DEOPT_IF (dict != NULL , LOAD_METHOD );
4539
4513
DEOPT_IF (((PyHeapTypeObject * )self_cls )-> ht_cached_keys -> dk_version != cache1 -> dk_version_or_hint , LOAD_METHOD );
4540
4514
STAT_INC (LOAD_METHOD , hit );
4541
- record_cache_hit (cache0 );
4542
4515
PyObject * res = cache2 -> obj ;
4543
4516
assert (res != NULL );
4544
4517
assert (_PyType_HasFeature (Py_TYPE (res ), Py_TPFLAGS_METHOD_DESCRIPTOR ));
@@ -4552,13 +4525,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4552
4525
PyObject * self = TOP ();
4553
4526
PyTypeObject * self_cls = Py_TYPE (self );
4554
4527
SpecializedCacheEntry * caches = GET_CACHE ();
4555
- _PyAdaptiveEntry * cache0 = & caches [0 ].adaptive ;
4556
4528
_PyAttrCache * cache1 = & caches [-1 ].attr ;
4557
4529
_PyObjectCache * cache2 = & caches [-2 ].obj ;
4558
4530
DEOPT_IF (self_cls -> tp_version_tag != cache1 -> tp_version , LOAD_METHOD );
4559
4531
assert (self_cls -> tp_dictoffset == 0 );
4560
4532
STAT_INC (LOAD_METHOD , hit );
4561
- record_cache_hit (cache0 );
4562
4533
PyObject * res = cache2 -> obj ;
4563
4534
assert (res != NULL );
4564
4535
assert (_PyType_HasFeature (Py_TYPE (res ), Py_TPFLAGS_METHOD_DESCRIPTOR ));
@@ -4584,7 +4555,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4584
4555
/* LOAD_METHOD, for class methods */
4585
4556
assert (cframe .use_tracing == 0 );
4586
4557
SpecializedCacheEntry * caches = GET_CACHE ();
4587
- _PyAdaptiveEntry * cache0 = & caches [0 ].adaptive ;
4588
4558
_PyAttrCache * cache1 = & caches [-1 ].attr ;
4589
4559
_PyObjectCache * cache2 = & caches [-2 ].obj ;
4590
4560
@@ -4595,7 +4565,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4595
4565
assert (cache1 -> tp_version != 0 );
4596
4566
4597
4567
STAT_INC (LOAD_METHOD , hit );
4598
- record_cache_hit (cache0 );
4599
4568
PyObject * res = cache2 -> obj ;
4600
4569
assert (res != NULL );
4601
4570
Py_INCREF (res );
@@ -4751,7 +4720,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4751
4720
/* PEP 523 */
4752
4721
DEOPT_IF (tstate -> interp -> eval_frame != NULL , CALL_FUNCTION );
4753
4722
STAT_INC (CALL_FUNCTION , hit );
4754
- record_cache_hit (cache0 );
4755
4723
InterpreterFrame * new_frame = _PyThreadState_PushFrame (
4756
4724
tstate , PyFunction_AS_FRAME_CONSTRUCTOR (func ), NULL );
4757
4725
if (new_frame == NULL ) {
@@ -4783,8 +4751,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4783
4751
PyObject * callable = SECOND ();
4784
4752
DEOPT_IF (!PyCFunction_CheckExact (callable ), CALL_FUNCTION );
4785
4753
DEOPT_IF (PyCFunction_GET_FLAGS (callable ) != METH_O , CALL_FUNCTION );
4786
- _PyAdaptiveEntry * cache0 = & GET_CACHE ()[0 ].adaptive ;
4787
- record_cache_hit (cache0 );
4788
4754
STAT_INC (CALL_FUNCTION , hit );
4789
4755
4790
4756
PyCFunction cfunc = PyCFunction_GET_FUNCTION (callable );
@@ -4813,7 +4779,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4813
4779
DEOPT_IF (!PyCFunction_CheckExact (callable ), CALL_FUNCTION );
4814
4780
DEOPT_IF (PyCFunction_GET_FLAGS (callable ) != METH_FASTCALL ,
4815
4781
CALL_FUNCTION );
4816
- record_cache_hit (cache0 );
4817
4782
STAT_INC (CALL_FUNCTION , hit );
4818
4783
4819
4784
PyCFunction cfunc = PyCFunction_GET_FUNCTION (callable );
@@ -4845,13 +4810,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4845
4810
assert (cframe .use_tracing == 0 );
4846
4811
/* len(o) */
4847
4812
SpecializedCacheEntry * caches = GET_CACHE ();
4848
- _PyAdaptiveEntry * cache0 = & caches [0 ].adaptive ;
4813
+ assert ( caches [0 ].adaptive . original_oparg == 1 ) ;
4849
4814
_PyObjectCache * cache1 = & caches [-1 ].obj ;
4850
- assert (cache0 -> original_oparg == 1 );
4851
4815
4852
4816
PyObject * callable = SECOND ();
4853
4817
DEOPT_IF (callable != cache1 -> obj , CALL_FUNCTION );
4854
- record_cache_hit (cache0 );
4855
4818
STAT_INC (CALL_FUNCTION , hit );
4856
4819
4857
4820
Py_ssize_t len_i = PyObject_Length (TOP ());
@@ -4875,13 +4838,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
4875
4838
assert (cframe .use_tracing == 0 );
4876
4839
/* isinstance(o, o2) */
4877
4840
SpecializedCacheEntry * caches = GET_CACHE ();
4878
- _PyAdaptiveEntry * cache0 = & caches [0 ].adaptive ;
4841
+ assert ( caches [0 ].adaptive . original_oparg == 2 ) ;
4879
4842
_PyObjectCache * cache1 = & caches [-1 ].obj ;
4880
- assert (cache0 -> original_oparg == 2 );
4881
4843
4882
4844
PyObject * callable = THIRD ();
4883
4845
DEOPT_IF (callable != cache1 -> obj , CALL_FUNCTION );
4884
- record_cache_hit (cache0 );
4885
4846
STAT_INC (CALL_FUNCTION , hit );
4886
4847
4887
4848
int retval = PyObject_IsInstance (SECOND (), TOP ());
@@ -5139,8 +5100,8 @@ opname ## _miss: \
5139
5100
{ \
5140
5101
STAT_INC(opname, miss); \
5141
5102
_PyAdaptiveEntry *cache = &GET_CACHE()->adaptive; \
5142
- record_cache_miss( cache) ; \
5143
- if (too_many_cache_misses( cache) ) { \
5103
+ cache->counter-- ; \
5104
+ if (cache->counter == 0 ) { \
5144
5105
next_instr[-1] = _Py_MAKECODEUNIT(opname ## _ADAPTIVE, _Py_OPARG(next_instr[-1])); \
5145
5106
STAT_INC(opname, deopt); \
5146
5107
cache_backoff(cache); \
@@ -5154,10 +5115,10 @@ opname ## _miss: \
5154
5115
opname ## _miss: \
5155
5116
{ \
5156
5117
STAT_INC(opname, miss); \
5157
- uint8_t oparg = saturating_decrement( _Py_OPARG(next_instr[-1])) ; \
5118
+ uint8_t oparg = _Py_OPARG(next_instr[-1])-1 ; \
5158
5119
UPDATE_PREV_INSTR_OPARG(next_instr, oparg); \
5159
5120
assert(_Py_OPARG(next_instr[-1]) == oparg); \
5160
- if (oparg == saturating_zero() ) /* too many cache misses */ { \
5121
+ if (oparg == 0 ) /* too many cache misses */ { \
5161
5122
oparg = ADAPTIVE_CACHE_BACKOFF ; \
5162
5123
next_instr [-1 ] = _Py_MAKECODEUNIT (opname ## _ADAPTIVE , oparg ); \
5163
5124
STAT_INC (opname , deopt ); \
0 commit comments