gh-105481: remove dependency of _inline_cache_entries on opname (#107339)

This commit is contained in:
Irit Katriel 2023-07-27 14:15:25 +01:00 committed by GitHub
parent 766d2518ae
commit d77d973335
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 22 deletions

View File

@ -19,20 +19,20 @@ extern const uint8_t _PyOpcode_Deopt[256];
#ifdef NEED_OPCODE_TABLES #ifdef NEED_OPCODE_TABLES
const uint8_t _PyOpcode_Caches[256] = { const uint8_t _PyOpcode_Caches[256] = {
[TO_BOOL] = 3,
[BINARY_SUBSCR] = 1,
[STORE_SUBSCR] = 1,
[UNPACK_SEQUENCE] = 1,
[FOR_ITER] = 1,
[STORE_ATTR] = 4,
[LOAD_ATTR] = 9,
[COMPARE_OP] = 1,
[LOAD_GLOBAL] = 4, [LOAD_GLOBAL] = 4,
[BINARY_OP] = 1, [BINARY_OP] = 1,
[UNPACK_SEQUENCE] = 1,
[COMPARE_OP] = 1,
[BINARY_SUBSCR] = 1,
[FOR_ITER] = 1,
[LOAD_SUPER_ATTR] = 1,
[LOAD_ATTR] = 9,
[STORE_ATTR] = 4,
[CALL] = 3,
[STORE_SUBSCR] = 1,
[SEND] = 1, [SEND] = 1,
[JUMP_BACKWARD] = 1, [JUMP_BACKWARD] = 1,
[LOAD_SUPER_ATTR] = 1, [TO_BOOL] = 3,
[CALL] = 3,
}; };
const uint8_t _PyOpcode_Deopt[256] = { const uint8_t _PyOpcode_Deopt[256] = {

View File

@ -288,13 +288,16 @@ _ExceptionTableEntry = collections.namedtuple("_ExceptionTableEntry",
_OPNAME_WIDTH = 20 _OPNAME_WIDTH = 20
_OPARG_WIDTH = 5 _OPARG_WIDTH = 5
def _get_cache_size(opname):
return _inline_cache_entries.get(opname, 0)
def _get_jump_target(op, arg, offset): def _get_jump_target(op, arg, offset):
"""Gets the bytecode offset of the jump target if this is a jump instruction. """Gets the bytecode offset of the jump target if this is a jump instruction.
Otherwise return None. Otherwise return None.
""" """
deop = _deoptop(op) deop = _deoptop(op)
caches = _inline_cache_entries[deop] caches = _get_cache_size(_all_opname[deop])
if deop in hasjrel: if deop in hasjrel:
if _is_backward_jump(deop): if _is_backward_jump(deop):
arg = -arg arg = -arg
@ -353,7 +356,7 @@ class Instruction(_Instruction):
@property @property
def end_offset(self): def end_offset(self):
"""End index of the cache entries following the operation.""" """End index of the cache entries following the operation."""
return self.cache_offset + _inline_cache_entries[self.opcode]*2 return self.cache_offset + _get_cache_size(_all_opname[self.opcode])*2
@property @property
def jump_target(self): def jump_target(self):
@ -535,7 +538,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None,
argrepr = '' argrepr = ''
positions = Positions(*next(co_positions, ())) positions = Positions(*next(co_positions, ()))
deop = _deoptop(op) deop = _deoptop(op)
caches = _inline_cache_entries[deop] caches = _get_cache_size(_all_opname[deop])
op = code[offset] op = code[offset]
if arg is not None: if arg is not None:
# Set argval to the dereferenced value of the argument when # Set argval to the dereferenced value of the argument when
@ -679,7 +682,7 @@ def _disassemble_bytes(code, lasti=-1, varname_from_oparg=None,
else: else:
# Each CACHE takes 2 bytes # Each CACHE takes 2 bytes
is_current_instr = instr.offset <= lasti \ is_current_instr = instr.offset <= lasti \
<= instr.offset + 2 * _inline_cache_entries[_deoptop(instr.opcode)] <= instr.offset + 2 * _get_cache_size(_all_opname[_deoptop(instr.opcode)])
print(instr._disassemble(lineno_width, is_current_instr, offset_width), print(instr._disassemble(lineno_width, is_current_instr, offset_width),
file=file) file=file)
if exception_entries: if exception_entries:
@ -712,7 +715,7 @@ def _unpack_opargs(code):
continue continue
op = code[i] op = code[i]
deop = _deoptop(op) deop = _deoptop(op)
caches = _inline_cache_entries[deop] caches = _get_cache_size(_all_opname[deop])
if deop in hasarg: if deop in hasarg:
arg = code[i+1] | extended_arg arg = code[i+1] | extended_arg
extended_arg = (arg << 8) if deop == EXTENDED_ARG else 0 extended_arg = (arg << 8) if deop == EXTENDED_ARG else 0

View File

@ -347,6 +347,6 @@ _cache_format = {
}, },
} }
_inline_cache_entries = [ _inline_cache_entries = {
sum(_cache_format.get(opname[opcode], {}).values()) for opcode in range(256) name : sum(value.values()) for (name, value) in _cache_format.items()
] }

View File

@ -106,7 +106,7 @@ class SpecializationStatsTests(unittest.TestCase):
specialized_opcodes = [ specialized_opcodes = [
op.lower() op.lower()
for op in opcode._specializations for op in opcode._specializations
if opcode._inline_cache_entries[opcode.opmap[op]] if opcode._inline_cache_entries.get(op, 0)
] ]
self.assertIn('load_attr', specialized_opcodes) self.assertIn('load_attr', specialized_opcodes)
self.assertIn('binary_subscr', specialized_opcodes) self.assertIn('binary_subscr', specialized_opcodes)

View File

@ -120,9 +120,8 @@ def main(opcode_py,
iobj.write("\n#ifdef NEED_OPCODE_TABLES\n") iobj.write("\n#ifdef NEED_OPCODE_TABLES\n")
iobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n") iobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n")
for i, entries in enumerate(opcode["_inline_cache_entries"]): for name, entries in opcode["_inline_cache_entries"].items():
if entries: iobj.write(f" [{name}] = {entries},\n")
iobj.write(f" [{opname[i]}] = {entries},\n")
iobj.write("};\n") iobj.write("};\n")
deoptcodes = {} deoptcodes = {}