Minor fixes to specialization stats. (GH-27457)

* Use class, not value for fail stats for BINARY_SUBSCR.

* Fix counts for unquickened instructions.
This commit is contained in:
Mark Shannon 2021-07-29 20:50:03 +01:00 committed by GitHub
parent 7e311e496b
commit 2116909b3e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 5 deletions

View file

@ -320,12 +320,14 @@ typedef struct _stats {
extern SpecializationStats _specialization_stats[256]; extern SpecializationStats _specialization_stats[256];
#define STAT_INC(opname, name) _specialization_stats[opname].name++ #define STAT_INC(opname, name) _specialization_stats[opname].name++
#define STAT_DEC(opname, name) _specialization_stats[opname].name--
void _Py_PrintSpecializationStats(void); void _Py_PrintSpecializationStats(void);
PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void);
#else #else
#define STAT_INC(opname, name) ((void)0) #define STAT_INC(opname, name) ((void)0)
#define STAT_DEC(opname, name) ((void)0)
#endif #endif

View file

@ -1931,6 +1931,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
UPDATE_PREV_INSTR_OPARG(next_instr, oparg - 1); UPDATE_PREV_INSTR_OPARG(next_instr, oparg - 1);
assert(_Py_OPCODE(next_instr[-1]) == BINARY_SUBSCR_ADAPTIVE); assert(_Py_OPCODE(next_instr[-1]) == BINARY_SUBSCR_ADAPTIVE);
assert(_Py_OPARG(next_instr[-1]) == oparg - 1); assert(_Py_OPARG(next_instr[-1]) == oparg - 1);
STAT_DEC(BINARY_SUBSCR, unquickened);
JUMP_TO_INSTRUCTION(BINARY_SUBSCR); JUMP_TO_INSTRUCTION(BINARY_SUBSCR);
} }
} }
@ -2943,6 +2944,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
STAT_INC(LOAD_GLOBAL, deferred); STAT_INC(LOAD_GLOBAL, deferred);
cache->adaptive.counter--; cache->adaptive.counter--;
oparg = cache->adaptive.original_oparg; oparg = cache->adaptive.original_oparg;
STAT_DEC(LOAD_GLOBAL, unquickened);
JUMP_TO_INSTRUCTION(LOAD_GLOBAL); JUMP_TO_INSTRUCTION(LOAD_GLOBAL);
} }
} }
@ -3380,6 +3382,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
STAT_INC(LOAD_ATTR, deferred); STAT_INC(LOAD_ATTR, deferred);
cache->adaptive.counter--; cache->adaptive.counter--;
oparg = cache->adaptive.original_oparg; oparg = cache->adaptive.original_oparg;
STAT_DEC(LOAD_ATTR, unquickened);
JUMP_TO_INSTRUCTION(LOAD_ATTR); JUMP_TO_INSTRUCTION(LOAD_ATTR);
} }
} }

View file

@ -203,7 +203,8 @@ done:
Py_XDECREF(key); Py_XDECREF(key);
} }
#define SPECIALIZATION_FAIL(opcode, type, attribute, kind) _Py_IncrementTypeCounter(opcode, (PyObject *)(type), attribute, kind) #define SPECIALIZATION_FAIL(opcode, type, attribute, kind) _Py_IncrementTypeCounter(opcode, (PyObject *)(type), (PyObject *)(attribute), kind)
#endif #endif
#endif #endif
@ -722,6 +723,7 @@ success:
return 0; return 0;
} }
int int
_Py_Specialize_BinarySubscr( _Py_Specialize_BinarySubscr(
PyObject *container, PyObject *sub, _Py_CODEUNIT *instr) PyObject *container, PyObject *sub, _Py_CODEUNIT *instr)
@ -732,7 +734,8 @@ _Py_Specialize_BinarySubscr(
*instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_LIST_INT, saturating_start()); *instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_LIST_INT, saturating_start());
goto success; goto success;
} else { } else {
SPECIALIZATION_FAIL(BINARY_SUBSCR, Py_TYPE(container), sub, "list; non-integer subscr"); SPECIALIZATION_FAIL(BINARY_SUBSCR, Py_TYPE(container), Py_TYPE(sub), "list; non-integer subscr");
goto fail;
} }
} }
if (container_type == &PyTuple_Type) { if (container_type == &PyTuple_Type) {
@ -740,15 +743,15 @@ _Py_Specialize_BinarySubscr(
*instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_TUPLE_INT, saturating_start()); *instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_TUPLE_INT, saturating_start());
goto success; goto success;
} else { } else {
SPECIALIZATION_FAIL(BINARY_SUBSCR, Py_TYPE(container), sub, "tuple; non-integer subscr"); SPECIALIZATION_FAIL(BINARY_SUBSCR, Py_TYPE(container), Py_TYPE(sub), "tuple; non-integer subscr");
goto fail;
} }
} }
if (container_type == &PyDict_Type) { if (container_type == &PyDict_Type) {
*instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_DICT, saturating_start()); *instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_DICT, saturating_start());
goto success; goto success;
} }
SPECIALIZATION_FAIL(BINARY_SUBSCR, Py_TYPE(container), Py_TYPE(sub), "not list|tuple|dict");
SPECIALIZATION_FAIL(BINARY_SUBSCR, Py_TYPE(container), sub, "not list|tuple|dict");
goto fail; goto fail;
fail: fail:
STAT_INC(BINARY_SUBSCR, specialization_failure); STAT_INC(BINARY_SUBSCR, specialization_failure);