mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
GH-129715: Remove _DYNAMIC_EXIT (GH-129716)
This commit is contained in:
parent
e4a00f70b1
commit
5fa7e1b7fd
13 changed files with 138 additions and 226 deletions
|
@ -129,6 +129,7 @@ typedef struct _optimization_stats {
|
|||
uint64_t inner_loop;
|
||||
uint64_t recursive_call;
|
||||
uint64_t low_confidence;
|
||||
uint64_t unknown_callee;
|
||||
uint64_t executors_invalidated;
|
||||
UOpStats opcode[PYSTATS_MAX_UOP_ID + 1];
|
||||
uint64_t unsupported_opcode[256];
|
||||
|
|
|
@ -289,8 +289,7 @@ static inline int is_terminator(const _PyUOpInstruction *uop)
|
|||
int opcode = uop->opcode;
|
||||
return (
|
||||
opcode == _EXIT_TRACE ||
|
||||
opcode == _JUMP_TO_TOP ||
|
||||
opcode == _DYNAMIC_EXIT
|
||||
opcode == _JUMP_TO_TOP
|
||||
);
|
||||
}
|
||||
|
||||
|
|
247
Include/internal/pycore_uop_ids.h
generated
247
Include/internal/pycore_uop_ids.h
generated
|
@ -101,57 +101,56 @@ extern "C" {
|
|||
#define _DO_CALL 358
|
||||
#define _DO_CALL_FUNCTION_EX 359
|
||||
#define _DO_CALL_KW 360
|
||||
#define _DYNAMIC_EXIT 361
|
||||
#define _END_FOR END_FOR
|
||||
#define _END_SEND END_SEND
|
||||
#define _ERROR_POP_N 362
|
||||
#define _ERROR_POP_N 361
|
||||
#define _EXIT_INIT_CHECK EXIT_INIT_CHECK
|
||||
#define _EXPAND_METHOD 363
|
||||
#define _EXPAND_METHOD_KW 364
|
||||
#define _FATAL_ERROR 365
|
||||
#define _EXPAND_METHOD 362
|
||||
#define _EXPAND_METHOD_KW 363
|
||||
#define _FATAL_ERROR 364
|
||||
#define _FORMAT_SIMPLE FORMAT_SIMPLE
|
||||
#define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC
|
||||
#define _FOR_ITER 366
|
||||
#define _FOR_ITER_GEN_FRAME 367
|
||||
#define _FOR_ITER_TIER_TWO 368
|
||||
#define _FOR_ITER 365
|
||||
#define _FOR_ITER_GEN_FRAME 366
|
||||
#define _FOR_ITER_TIER_TWO 367
|
||||
#define _GET_AITER GET_AITER
|
||||
#define _GET_ANEXT GET_ANEXT
|
||||
#define _GET_AWAITABLE GET_AWAITABLE
|
||||
#define _GET_ITER GET_ITER
|
||||
#define _GET_LEN GET_LEN
|
||||
#define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER
|
||||
#define _GUARD_BINARY_OP_EXTEND 369
|
||||
#define _GUARD_BOTH_FLOAT 370
|
||||
#define _GUARD_BOTH_INT 371
|
||||
#define _GUARD_BOTH_UNICODE 372
|
||||
#define _GUARD_BUILTINS_VERSION_PUSH_KEYS 373
|
||||
#define _GUARD_DORV_NO_DICT 374
|
||||
#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 375
|
||||
#define _GUARD_GLOBALS_VERSION 376
|
||||
#define _GUARD_GLOBALS_VERSION_PUSH_KEYS 377
|
||||
#define _GUARD_IS_FALSE_POP 378
|
||||
#define _GUARD_IS_NONE_POP 379
|
||||
#define _GUARD_IS_NOT_NONE_POP 380
|
||||
#define _GUARD_IS_TRUE_POP 381
|
||||
#define _GUARD_KEYS_VERSION 382
|
||||
#define _GUARD_NOS_FLOAT 383
|
||||
#define _GUARD_NOS_INT 384
|
||||
#define _GUARD_NOT_EXHAUSTED_LIST 385
|
||||
#define _GUARD_NOT_EXHAUSTED_RANGE 386
|
||||
#define _GUARD_NOT_EXHAUSTED_TUPLE 387
|
||||
#define _GUARD_TOS_FLOAT 388
|
||||
#define _GUARD_TOS_INT 389
|
||||
#define _GUARD_TYPE_VERSION 390
|
||||
#define _GUARD_TYPE_VERSION_AND_LOCK 391
|
||||
#define _GUARD_BINARY_OP_EXTEND 368
|
||||
#define _GUARD_BOTH_FLOAT 369
|
||||
#define _GUARD_BOTH_INT 370
|
||||
#define _GUARD_BOTH_UNICODE 371
|
||||
#define _GUARD_BUILTINS_VERSION_PUSH_KEYS 372
|
||||
#define _GUARD_DORV_NO_DICT 373
|
||||
#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 374
|
||||
#define _GUARD_GLOBALS_VERSION 375
|
||||
#define _GUARD_GLOBALS_VERSION_PUSH_KEYS 376
|
||||
#define _GUARD_IS_FALSE_POP 377
|
||||
#define _GUARD_IS_NONE_POP 378
|
||||
#define _GUARD_IS_NOT_NONE_POP 379
|
||||
#define _GUARD_IS_TRUE_POP 380
|
||||
#define _GUARD_KEYS_VERSION 381
|
||||
#define _GUARD_NOS_FLOAT 382
|
||||
#define _GUARD_NOS_INT 383
|
||||
#define _GUARD_NOT_EXHAUSTED_LIST 384
|
||||
#define _GUARD_NOT_EXHAUSTED_RANGE 385
|
||||
#define _GUARD_NOT_EXHAUSTED_TUPLE 386
|
||||
#define _GUARD_TOS_FLOAT 387
|
||||
#define _GUARD_TOS_INT 388
|
||||
#define _GUARD_TYPE_VERSION 389
|
||||
#define _GUARD_TYPE_VERSION_AND_LOCK 390
|
||||
#define _IMPORT_FROM IMPORT_FROM
|
||||
#define _IMPORT_NAME IMPORT_NAME
|
||||
#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 392
|
||||
#define _INIT_CALL_PY_EXACT_ARGS 393
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_0 394
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_1 395
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_2 396
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_3 397
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_4 398
|
||||
#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 391
|
||||
#define _INIT_CALL_PY_EXACT_ARGS 392
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_0 393
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_1 394
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_2 395
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_3 396
|
||||
#define _INIT_CALL_PY_EXACT_ARGS_4 397
|
||||
#define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER
|
||||
#define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION
|
||||
#define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD
|
||||
|
@ -161,137 +160,137 @@ extern "C" {
|
|||
#define _INSTRUMENTED_POP_JUMP_IF_NONE INSTRUMENTED_POP_JUMP_IF_NONE
|
||||
#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_NONE
|
||||
#define _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE
|
||||
#define _IS_NONE 399
|
||||
#define _IS_NONE 398
|
||||
#define _IS_OP IS_OP
|
||||
#define _ITER_CHECK_LIST 400
|
||||
#define _ITER_CHECK_RANGE 401
|
||||
#define _ITER_CHECK_TUPLE 402
|
||||
#define _ITER_JUMP_LIST 403
|
||||
#define _ITER_JUMP_RANGE 404
|
||||
#define _ITER_JUMP_TUPLE 405
|
||||
#define _ITER_NEXT_LIST 406
|
||||
#define _ITER_NEXT_RANGE 407
|
||||
#define _ITER_NEXT_TUPLE 408
|
||||
#define _JUMP_TO_TOP 409
|
||||
#define _ITER_CHECK_LIST 399
|
||||
#define _ITER_CHECK_RANGE 400
|
||||
#define _ITER_CHECK_TUPLE 401
|
||||
#define _ITER_JUMP_LIST 402
|
||||
#define _ITER_JUMP_RANGE 403
|
||||
#define _ITER_JUMP_TUPLE 404
|
||||
#define _ITER_NEXT_LIST 405
|
||||
#define _ITER_NEXT_RANGE 406
|
||||
#define _ITER_NEXT_TUPLE 407
|
||||
#define _JUMP_TO_TOP 408
|
||||
#define _LIST_APPEND LIST_APPEND
|
||||
#define _LIST_EXTEND LIST_EXTEND
|
||||
#define _LOAD_ATTR 410
|
||||
#define _LOAD_ATTR_CLASS 411
|
||||
#define _LOAD_ATTR 409
|
||||
#define _LOAD_ATTR_CLASS 410
|
||||
#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN
|
||||
#define _LOAD_ATTR_INSTANCE_VALUE 412
|
||||
#define _LOAD_ATTR_METHOD_LAZY_DICT 413
|
||||
#define _LOAD_ATTR_METHOD_NO_DICT 414
|
||||
#define _LOAD_ATTR_METHOD_WITH_VALUES 415
|
||||
#define _LOAD_ATTR_MODULE 416
|
||||
#define _LOAD_ATTR_MODULE_FROM_KEYS 417
|
||||
#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 418
|
||||
#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 419
|
||||
#define _LOAD_ATTR_PROPERTY_FRAME 420
|
||||
#define _LOAD_ATTR_SLOT 421
|
||||
#define _LOAD_ATTR_WITH_HINT 422
|
||||
#define _LOAD_ATTR_INSTANCE_VALUE 411
|
||||
#define _LOAD_ATTR_METHOD_LAZY_DICT 412
|
||||
#define _LOAD_ATTR_METHOD_NO_DICT 413
|
||||
#define _LOAD_ATTR_METHOD_WITH_VALUES 414
|
||||
#define _LOAD_ATTR_MODULE 415
|
||||
#define _LOAD_ATTR_MODULE_FROM_KEYS 416
|
||||
#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 417
|
||||
#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 418
|
||||
#define _LOAD_ATTR_PROPERTY_FRAME 419
|
||||
#define _LOAD_ATTR_SLOT 420
|
||||
#define _LOAD_ATTR_WITH_HINT 421
|
||||
#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS
|
||||
#define _LOAD_BYTECODE 423
|
||||
#define _LOAD_BYTECODE 422
|
||||
#define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT
|
||||
#define _LOAD_CONST LOAD_CONST
|
||||
#define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL
|
||||
#define _LOAD_CONST_INLINE 424
|
||||
#define _LOAD_CONST_INLINE_BORROW 425
|
||||
#define _LOAD_CONST_INLINE 423
|
||||
#define _LOAD_CONST_INLINE_BORROW 424
|
||||
#define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL
|
||||
#define _LOAD_DEREF LOAD_DEREF
|
||||
#define _LOAD_FAST 426
|
||||
#define _LOAD_FAST_0 427
|
||||
#define _LOAD_FAST_1 428
|
||||
#define _LOAD_FAST_2 429
|
||||
#define _LOAD_FAST_3 430
|
||||
#define _LOAD_FAST_4 431
|
||||
#define _LOAD_FAST_5 432
|
||||
#define _LOAD_FAST_6 433
|
||||
#define _LOAD_FAST_7 434
|
||||
#define _LOAD_FAST 425
|
||||
#define _LOAD_FAST_0 426
|
||||
#define _LOAD_FAST_1 427
|
||||
#define _LOAD_FAST_2 428
|
||||
#define _LOAD_FAST_3 429
|
||||
#define _LOAD_FAST_4 430
|
||||
#define _LOAD_FAST_5 431
|
||||
#define _LOAD_FAST_6 432
|
||||
#define _LOAD_FAST_7 433
|
||||
#define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR
|
||||
#define _LOAD_FAST_CHECK LOAD_FAST_CHECK
|
||||
#define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST
|
||||
#define _LOAD_FROM_DICT_OR_DEREF LOAD_FROM_DICT_OR_DEREF
|
||||
#define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS
|
||||
#define _LOAD_GLOBAL 435
|
||||
#define _LOAD_GLOBAL_BUILTINS 436
|
||||
#define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 437
|
||||
#define _LOAD_GLOBAL_MODULE 438
|
||||
#define _LOAD_GLOBAL_MODULE_FROM_KEYS 439
|
||||
#define _LOAD_GLOBAL 434
|
||||
#define _LOAD_GLOBAL_BUILTINS 435
|
||||
#define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 436
|
||||
#define _LOAD_GLOBAL_MODULE 437
|
||||
#define _LOAD_GLOBAL_MODULE_FROM_KEYS 438
|
||||
#define _LOAD_LOCALS LOAD_LOCALS
|
||||
#define _LOAD_NAME LOAD_NAME
|
||||
#define _LOAD_SMALL_INT 440
|
||||
#define _LOAD_SMALL_INT_0 441
|
||||
#define _LOAD_SMALL_INT_1 442
|
||||
#define _LOAD_SMALL_INT_2 443
|
||||
#define _LOAD_SMALL_INT_3 444
|
||||
#define _LOAD_SMALL_INT 439
|
||||
#define _LOAD_SMALL_INT_0 440
|
||||
#define _LOAD_SMALL_INT_1 441
|
||||
#define _LOAD_SMALL_INT_2 442
|
||||
#define _LOAD_SMALL_INT_3 443
|
||||
#define _LOAD_SPECIAL LOAD_SPECIAL
|
||||
#define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR
|
||||
#define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD
|
||||
#define _MAKE_CALLARGS_A_TUPLE 445
|
||||
#define _MAKE_CALLARGS_A_TUPLE 444
|
||||
#define _MAKE_CELL MAKE_CELL
|
||||
#define _MAKE_FUNCTION MAKE_FUNCTION
|
||||
#define _MAKE_WARM 446
|
||||
#define _MAKE_WARM 445
|
||||
#define _MAP_ADD MAP_ADD
|
||||
#define _MATCH_CLASS MATCH_CLASS
|
||||
#define _MATCH_KEYS MATCH_KEYS
|
||||
#define _MATCH_MAPPING MATCH_MAPPING
|
||||
#define _MATCH_SEQUENCE MATCH_SEQUENCE
|
||||
#define _MAYBE_EXPAND_METHOD 447
|
||||
#define _MAYBE_EXPAND_METHOD_KW 448
|
||||
#define _MONITOR_CALL 449
|
||||
#define _MONITOR_CALL_KW 450
|
||||
#define _MONITOR_JUMP_BACKWARD 451
|
||||
#define _MONITOR_RESUME 452
|
||||
#define _MAYBE_EXPAND_METHOD 446
|
||||
#define _MAYBE_EXPAND_METHOD_KW 447
|
||||
#define _MONITOR_CALL 448
|
||||
#define _MONITOR_CALL_KW 449
|
||||
#define _MONITOR_JUMP_BACKWARD 450
|
||||
#define _MONITOR_RESUME 451
|
||||
#define _NOP NOP
|
||||
#define _POP_EXCEPT POP_EXCEPT
|
||||
#define _POP_JUMP_IF_FALSE 453
|
||||
#define _POP_JUMP_IF_TRUE 454
|
||||
#define _POP_JUMP_IF_FALSE 452
|
||||
#define _POP_JUMP_IF_TRUE 453
|
||||
#define _POP_TOP POP_TOP
|
||||
#define _POP_TOP_LOAD_CONST_INLINE_BORROW 455
|
||||
#define _POP_TOP_LOAD_CONST_INLINE_BORROW 454
|
||||
#define _PUSH_EXC_INFO PUSH_EXC_INFO
|
||||
#define _PUSH_FRAME 456
|
||||
#define _PUSH_FRAME 455
|
||||
#define _PUSH_NULL PUSH_NULL
|
||||
#define _PUSH_NULL_CONDITIONAL 457
|
||||
#define _PY_FRAME_GENERAL 458
|
||||
#define _PY_FRAME_KW 459
|
||||
#define _QUICKEN_RESUME 460
|
||||
#define _REPLACE_WITH_TRUE 461
|
||||
#define _PUSH_NULL_CONDITIONAL 456
|
||||
#define _PY_FRAME_GENERAL 457
|
||||
#define _PY_FRAME_KW 458
|
||||
#define _QUICKEN_RESUME 459
|
||||
#define _REPLACE_WITH_TRUE 460
|
||||
#define _RESUME_CHECK RESUME_CHECK
|
||||
#define _RETURN_GENERATOR RETURN_GENERATOR
|
||||
#define _RETURN_VALUE RETURN_VALUE
|
||||
#define _SAVE_RETURN_OFFSET 462
|
||||
#define _SEND 463
|
||||
#define _SEND_GEN_FRAME 464
|
||||
#define _SAVE_RETURN_OFFSET 461
|
||||
#define _SEND 462
|
||||
#define _SEND_GEN_FRAME 463
|
||||
#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
|
||||
#define _SET_ADD SET_ADD
|
||||
#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
|
||||
#define _SET_UPDATE SET_UPDATE
|
||||
#define _START_EXECUTOR 465
|
||||
#define _STORE_ATTR 466
|
||||
#define _STORE_ATTR_INSTANCE_VALUE 467
|
||||
#define _STORE_ATTR_SLOT 468
|
||||
#define _STORE_ATTR_WITH_HINT 469
|
||||
#define _START_EXECUTOR 464
|
||||
#define _STORE_ATTR 465
|
||||
#define _STORE_ATTR_INSTANCE_VALUE 466
|
||||
#define _STORE_ATTR_SLOT 467
|
||||
#define _STORE_ATTR_WITH_HINT 468
|
||||
#define _STORE_DEREF STORE_DEREF
|
||||
#define _STORE_FAST 470
|
||||
#define _STORE_FAST_0 471
|
||||
#define _STORE_FAST_1 472
|
||||
#define _STORE_FAST_2 473
|
||||
#define _STORE_FAST_3 474
|
||||
#define _STORE_FAST_4 475
|
||||
#define _STORE_FAST_5 476
|
||||
#define _STORE_FAST_6 477
|
||||
#define _STORE_FAST_7 478
|
||||
#define _STORE_FAST 469
|
||||
#define _STORE_FAST_0 470
|
||||
#define _STORE_FAST_1 471
|
||||
#define _STORE_FAST_2 472
|
||||
#define _STORE_FAST_3 473
|
||||
#define _STORE_FAST_4 474
|
||||
#define _STORE_FAST_5 475
|
||||
#define _STORE_FAST_6 476
|
||||
#define _STORE_FAST_7 477
|
||||
#define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST
|
||||
#define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST
|
||||
#define _STORE_GLOBAL STORE_GLOBAL
|
||||
#define _STORE_NAME STORE_NAME
|
||||
#define _STORE_SLICE 479
|
||||
#define _STORE_SUBSCR 480
|
||||
#define _STORE_SLICE 478
|
||||
#define _STORE_SUBSCR 479
|
||||
#define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT
|
||||
#define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT
|
||||
#define _SWAP SWAP
|
||||
#define _TIER2_RESUME_CHECK 481
|
||||
#define _TO_BOOL 482
|
||||
#define _TIER2_RESUME_CHECK 480
|
||||
#define _TO_BOOL 481
|
||||
#define _TO_BOOL_BOOL TO_BOOL_BOOL
|
||||
#define _TO_BOOL_INT TO_BOOL_INT
|
||||
#define _TO_BOOL_LIST TO_BOOL_LIST
|
||||
|
@ -301,13 +300,13 @@ extern "C" {
|
|||
#define _UNARY_NEGATIVE UNARY_NEGATIVE
|
||||
#define _UNARY_NOT UNARY_NOT
|
||||
#define _UNPACK_EX UNPACK_EX
|
||||
#define _UNPACK_SEQUENCE 483
|
||||
#define _UNPACK_SEQUENCE 482
|
||||
#define _UNPACK_SEQUENCE_LIST UNPACK_SEQUENCE_LIST
|
||||
#define _UNPACK_SEQUENCE_TUPLE UNPACK_SEQUENCE_TUPLE
|
||||
#define _UNPACK_SEQUENCE_TWO_TUPLE UNPACK_SEQUENCE_TWO_TUPLE
|
||||
#define _WITH_EXCEPT_START WITH_EXCEPT_START
|
||||
#define _YIELD_VALUE YIELD_VALUE
|
||||
#define MAX_UOP_ID 483
|
||||
#define MAX_UOP_ID 482
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
4
Include/internal/pycore_uop_metadata.h
generated
4
Include/internal/pycore_uop_metadata.h
generated
|
@ -281,7 +281,6 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
|
|||
[_LOAD_GLOBAL_MODULE] = HAS_DEOPT_FLAG,
|
||||
[_LOAD_GLOBAL_BUILTINS] = HAS_DEOPT_FLAG,
|
||||
[_LOAD_ATTR_MODULE] = HAS_DEOPT_FLAG,
|
||||
[_DYNAMIC_EXIT] = HAS_ESCAPES_FLAG,
|
||||
[_START_EXECUTOR] = HAS_ESCAPES_FLAG,
|
||||
[_MAKE_WARM] = 0,
|
||||
[_FATAL_ERROR] = 0,
|
||||
|
@ -386,7 +385,6 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
|
|||
[_DEOPT] = "_DEOPT",
|
||||
[_DICT_MERGE] = "_DICT_MERGE",
|
||||
[_DICT_UPDATE] = "_DICT_UPDATE",
|
||||
[_DYNAMIC_EXIT] = "_DYNAMIC_EXIT",
|
||||
[_END_FOR] = "_END_FOR",
|
||||
[_END_SEND] = "_END_SEND",
|
||||
[_ERROR_POP_N] = "_ERROR_POP_N",
|
||||
|
@ -1097,8 +1095,6 @@ int _PyUop_num_popped(int opcode, int oparg)
|
|||
return 0;
|
||||
case _LOAD_ATTR_MODULE:
|
||||
return 1;
|
||||
case _DYNAMIC_EXIT:
|
||||
return 0;
|
||||
case _START_EXECUTOR:
|
||||
return 0;
|
||||
case _MAKE_WARM:
|
||||
|
|
|
@ -1160,6 +1160,7 @@ class TestUopsOptimization(unittest.TestCase):
|
|||
self.assertIsNotNone(ex)
|
||||
self.assertIn("_RETURN_GENERATOR", get_opnames(ex))
|
||||
|
||||
@unittest.skip("Tracing into generators currently isn't supported.")
|
||||
def test_for_iter_gen(self):
|
||||
def gen(n):
|
||||
for i in range(n):
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Improve JIT performance for generators.
|
|
@ -5117,42 +5117,6 @@ dummy_func(
|
|||
DECREF_INPUTS();
|
||||
}
|
||||
|
||||
tier2 op(_DYNAMIC_EXIT, (exit_p/4 --)) {
|
||||
tstate->previous_executor = (PyObject *)current_executor;
|
||||
_PyExitData *exit = (_PyExitData *)exit_p;
|
||||
_Py_CODEUNIT *target = frame->instr_ptr;
|
||||
#if defined(Py_DEBUG) && !defined(_Py_JIT)
|
||||
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
|
||||
if (frame->lltrace >= 2) {
|
||||
printf("DYNAMIC EXIT: [UOp ");
|
||||
_PyUOpPrint(&next_uop[-1]);
|
||||
printf(", exit %lu, temp %d, target %d -> %s]\n",
|
||||
exit - current_executor->exits, exit->temperature.value_and_backoff,
|
||||
(int)(target - _PyFrame_GetBytecode(frame)),
|
||||
_PyOpcode_OpName[target->op.code]);
|
||||
}
|
||||
#endif
|
||||
_PyExecutorObject *executor;
|
||||
if (target->op.code == ENTER_EXECUTOR) {
|
||||
PyCodeObject *code = _PyFrame_GetCode(frame);
|
||||
executor = code->co_executors->executors[target->op.arg];
|
||||
Py_INCREF(executor);
|
||||
}
|
||||
else {
|
||||
if (!backoff_counter_triggers(exit->temperature)) {
|
||||
exit->temperature = advance_backoff_counter(exit->temperature);
|
||||
GOTO_TIER_ONE(target);
|
||||
}
|
||||
int optimized = _PyOptimizer_Optimize(frame, target, &executor, 0);
|
||||
if (optimized <= 0) {
|
||||
exit->temperature = restart_backoff_counter(exit->temperature);
|
||||
GOTO_TIER_ONE(optimized < 0 ? NULL : target);
|
||||
}
|
||||
exit->temperature = initial_temperature_backoff_counter();
|
||||
}
|
||||
GOTO_TIER_TWO(executor);
|
||||
}
|
||||
|
||||
tier2 op(_START_EXECUTOR, (executor/4 --)) {
|
||||
Py_CLEAR(tstate->previous_executor);
|
||||
#ifndef _Py_JIT
|
||||
|
|
42
Python/executor_cases.c.h
generated
42
Python/executor_cases.c.h
generated
|
@ -6510,48 +6510,6 @@
|
|||
break;
|
||||
}
|
||||
|
||||
case _DYNAMIC_EXIT: {
|
||||
PyObject *exit_p = (PyObject *)CURRENT_OPERAND0();
|
||||
tstate->previous_executor = (PyObject *)current_executor;
|
||||
_PyExitData *exit = (_PyExitData *)exit_p;
|
||||
_Py_CODEUNIT *target = frame->instr_ptr;
|
||||
#if defined(Py_DEBUG) && !defined(_Py_JIT)
|
||||
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
|
||||
if (frame->lltrace >= 2) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
printf("DYNAMIC EXIT: [UOp ");
|
||||
_PyUOpPrint(&next_uop[-1]);
|
||||
printf(", exit %lu, temp %d, target %d -> %s]\n",
|
||||
exit - current_executor->exits, exit->temperature.value_and_backoff,
|
||||
(int)(target - _PyFrame_GetBytecode(frame)),
|
||||
_PyOpcode_OpName[target->op.code]);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
#endif
|
||||
_PyExecutorObject *executor;
|
||||
if (target->op.code == ENTER_EXECUTOR) {
|
||||
PyCodeObject *code = _PyFrame_GetCode(frame);
|
||||
executor = code->co_executors->executors[target->op.arg];
|
||||
Py_INCREF(executor);
|
||||
}
|
||||
else {
|
||||
if (!backoff_counter_triggers(exit->temperature)) {
|
||||
exit->temperature = advance_backoff_counter(exit->temperature);
|
||||
GOTO_TIER_ONE(target);
|
||||
}
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int optimized = _PyOptimizer_Optimize(frame, target, &executor, 0);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (optimized <= 0) {
|
||||
exit->temperature = restart_backoff_counter(exit->temperature);
|
||||
GOTO_TIER_ONE(optimized < 0 ? NULL : target);
|
||||
}
|
||||
exit->temperature = initial_temperature_backoff_counter();
|
||||
}
|
||||
GOTO_TIER_TWO(executor);
|
||||
break;
|
||||
}
|
||||
|
||||
case _START_EXECUTOR: {
|
||||
PyObject *executor = (PyObject *)CURRENT_OPERAND0();
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
|
|
|
@ -757,9 +757,8 @@ translate_bytecode_to_trace(
|
|||
opcode == SEND_GEN)
|
||||
{
|
||||
DPRINTF(2, "Bailing due to dynamic target\n");
|
||||
ADD_TO_TRACE(uop, oparg, 0, target);
|
||||
ADD_TO_TRACE(_DYNAMIC_EXIT, 0, 0, 0);
|
||||
goto done;
|
||||
OPT_STAT_INC(unknown_callee);
|
||||
return 0;
|
||||
}
|
||||
assert(_PyOpcode_Deopt[opcode] == CALL || _PyOpcode_Deopt[opcode] == CALL_KW);
|
||||
int func_version_offset =
|
||||
|
@ -825,9 +824,8 @@ translate_bytecode_to_trace(
|
|||
goto top;
|
||||
}
|
||||
DPRINTF(2, "Bail, new_code == NULL\n");
|
||||
ADD_TO_TRACE(uop, oparg, 0, target);
|
||||
ADD_TO_TRACE(_DYNAMIC_EXIT, 0, 0, 0);
|
||||
goto done;
|
||||
OPT_STAT_INC(unknown_callee);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (uop == _BINARY_OP_INPLACE_ADD_UNICODE) {
|
||||
|
@ -914,7 +912,7 @@ count_exits(_PyUOpInstruction *buffer, int length)
|
|||
int exit_count = 0;
|
||||
for (int i = 0; i < length; i++) {
|
||||
int opcode = buffer[i].opcode;
|
||||
if (opcode == _EXIT_TRACE || opcode == _DYNAMIC_EXIT) {
|
||||
if (opcode == _EXIT_TRACE) {
|
||||
exit_count++;
|
||||
}
|
||||
}
|
||||
|
@ -1119,12 +1117,6 @@ make_executor_from_uops(_PyUOpInstruction *buffer, int length, const _PyBloomFil
|
|||
dest->operand0 = (uint64_t)exit;
|
||||
next_exit--;
|
||||
}
|
||||
if (opcode == _DYNAMIC_EXIT) {
|
||||
_PyExitData *exit = &executor->exits[next_exit];
|
||||
exit->target = 0;
|
||||
dest->operand0 = (uint64_t)exit;
|
||||
next_exit--;
|
||||
}
|
||||
}
|
||||
assert(next_exit == -1);
|
||||
assert(dest == executor->trace);
|
||||
|
|
|
@ -616,7 +616,6 @@ remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size)
|
|||
}
|
||||
case _JUMP_TO_TOP:
|
||||
case _EXIT_TRACE:
|
||||
case _DYNAMIC_EXIT:
|
||||
return pc + 1;
|
||||
default:
|
||||
{
|
||||
|
|
4
Python/optimizer_cases.c.h
generated
4
Python/optimizer_cases.c.h
generated
|
@ -2469,10 +2469,6 @@
|
|||
break;
|
||||
}
|
||||
|
||||
case _DYNAMIC_EXIT: {
|
||||
break;
|
||||
}
|
||||
|
||||
case _START_EXECUTOR: {
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -260,6 +260,7 @@ print_optimization_stats(FILE *out, OptimizationStats *stats)
|
|||
fprintf(out, "Optimization inner loop: %" PRIu64 "\n", stats->inner_loop);
|
||||
fprintf(out, "Optimization recursive call: %" PRIu64 "\n", stats->recursive_call);
|
||||
fprintf(out, "Optimization low confidence: %" PRIu64 "\n", stats->low_confidence);
|
||||
fprintf(out, "Optimization unknown callee: %" PRIu64 "\n", stats->unknown_callee);
|
||||
fprintf(out, "Executors invalidated: %" PRIu64 "\n", stats->executors_invalidated);
|
||||
|
||||
print_histogram(out, "Trace length", stats->trace_length_hist);
|
||||
|
|
|
@ -457,6 +457,7 @@ class Stats:
|
|||
inner_loop = self._data["Optimization inner loop"]
|
||||
recursive_call = self._data["Optimization recursive call"]
|
||||
low_confidence = self._data["Optimization low confidence"]
|
||||
unknown_callee = self._data["Optimization unknown callee"]
|
||||
executors_invalidated = self._data["Executors invalidated"]
|
||||
|
||||
return {
|
||||
|
@ -497,6 +498,10 @@ class Stats:
|
|||
"A trace is abandoned because the likelihood of the jump to top being taken "
|
||||
"is too low.",
|
||||
): (low_confidence, attempts),
|
||||
Doc(
|
||||
"Unknown callee",
|
||||
"A trace is abandoned because the target of a call is unknown.",
|
||||
): (unknown_callee, attempts),
|
||||
Doc(
|
||||
"Executors invalidated",
|
||||
"The number of executors that were invalidated due to watched "
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue