mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	GH-131798: Split CALL_LIST_APPEND into several uops (GH-134240)
This commit is contained in:
		
							parent
							
								
									92f85ff3a0
								
							
						
					
					
						commit
						42d03f3933
					
				
					 10 changed files with 370 additions and 259 deletions
				
			
		
							
								
								
									
										4
									
								
								Include/internal/pycore_opcode_metadata.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								Include/internal/pycore_opcode_metadata.h
									
										
									
										generated
									
									
									
								
							|  | @ -1121,7 +1121,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { | |||
|     [CALL_KW_NON_PY] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, | ||||
|     [CALL_KW_PY] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, | ||||
|     [CALL_LEN] = { true, INSTR_FMT_IXC00, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, | ||||
|     [CALL_LIST_APPEND] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, | ||||
|     [CALL_LIST_APPEND] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, | ||||
|     [CALL_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, | ||||
|     [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, | ||||
|     [CALL_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, | ||||
|  | @ -1368,7 +1368,7 @@ _PyOpcode_macro_expansion[256] = { | |||
|     [CALL_KW_NON_PY] = { .nuops = 3, .uops = { { _CHECK_IS_NOT_PY_CALLABLE_KW, OPARG_SIMPLE, 3 }, { _CALL_KW_NON_PY, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, | ||||
|     [CALL_KW_PY] = { .nuops = 5, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION_KW, 2, 1 }, { _PY_FRAME_KW, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } }, | ||||
|     [CALL_LEN] = { .nuops = 3, .uops = { { _GUARD_NOS_NULL, OPARG_SIMPLE, 3 }, { _GUARD_CALLABLE_LEN, OPARG_SIMPLE, 3 }, { _CALL_LEN, OPARG_SIMPLE, 3 } } }, | ||||
|     [CALL_LIST_APPEND] = { .nuops = 1, .uops = { { _CALL_LIST_APPEND, OPARG_SIMPLE, 3 } } }, | ||||
|     [CALL_LIST_APPEND] = { .nuops = 4, .uops = { { _GUARD_CALLABLE_LIST_APPEND, OPARG_SIMPLE, 3 }, { _GUARD_NOS_NOT_NULL, OPARG_SIMPLE, 3 }, { _GUARD_NOS_LIST, OPARG_SIMPLE, 3 }, { _CALL_LIST_APPEND, OPARG_SIMPLE, 3 } } }, | ||||
|     [CALL_METHOD_DESCRIPTOR_FAST] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, | ||||
|     [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, | ||||
|     [CALL_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_NOARGS, OPARG_SIMPLE, 3 }, { _CHECK_PERIODIC, OPARG_SIMPLE, 3 } } }, | ||||
|  |  | |||
							
								
								
									
										392
									
								
								Include/internal/pycore_uop_ids.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										392
									
								
								Include/internal/pycore_uop_ids.h
									
										
									
										generated
									
									
									
								
							|  | @ -46,124 +46,126 @@ extern "C" { | |||
| #define _CALL_ISINSTANCE 324 | ||||
| #define _CALL_KW_NON_PY 325 | ||||
| #define _CALL_LEN 326 | ||||
| #define _CALL_LIST_APPEND CALL_LIST_APPEND | ||||
| #define _CALL_METHOD_DESCRIPTOR_FAST 327 | ||||
| #define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 328 | ||||
| #define _CALL_METHOD_DESCRIPTOR_NOARGS 329 | ||||
| #define _CALL_METHOD_DESCRIPTOR_O 330 | ||||
| #define _CALL_NON_PY_GENERAL 331 | ||||
| #define _CALL_STR_1 332 | ||||
| #define _CALL_TUPLE_1 333 | ||||
| #define _CALL_TYPE_1 334 | ||||
| #define _CHECK_AND_ALLOCATE_OBJECT 335 | ||||
| #define _CHECK_ATTR_CLASS 336 | ||||
| #define _CHECK_ATTR_METHOD_LAZY_DICT 337 | ||||
| #define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 338 | ||||
| #define _CALL_LIST_APPEND 327 | ||||
| #define _CALL_METHOD_DESCRIPTOR_FAST 328 | ||||
| #define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 329 | ||||
| #define _CALL_METHOD_DESCRIPTOR_NOARGS 330 | ||||
| #define _CALL_METHOD_DESCRIPTOR_O 331 | ||||
| #define _CALL_NON_PY_GENERAL 332 | ||||
| #define _CALL_STR_1 333 | ||||
| #define _CALL_TUPLE_1 334 | ||||
| #define _CALL_TYPE_1 335 | ||||
| #define _CHECK_AND_ALLOCATE_OBJECT 336 | ||||
| #define _CHECK_ATTR_CLASS 337 | ||||
| #define _CHECK_ATTR_METHOD_LAZY_DICT 338 | ||||
| #define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 339 | ||||
| #define _CHECK_EG_MATCH CHECK_EG_MATCH | ||||
| #define _CHECK_EXC_MATCH CHECK_EXC_MATCH | ||||
| #define _CHECK_FUNCTION 339 | ||||
| #define _CHECK_FUNCTION_EXACT_ARGS 340 | ||||
| #define _CHECK_FUNCTION_VERSION 341 | ||||
| #define _CHECK_FUNCTION_VERSION_INLINE 342 | ||||
| #define _CHECK_FUNCTION_VERSION_KW 343 | ||||
| #define _CHECK_IS_NOT_PY_CALLABLE 344 | ||||
| #define _CHECK_IS_NOT_PY_CALLABLE_KW 345 | ||||
| #define _CHECK_MANAGED_OBJECT_HAS_VALUES 346 | ||||
| #define _CHECK_METHOD_VERSION 347 | ||||
| #define _CHECK_METHOD_VERSION_KW 348 | ||||
| #define _CHECK_PEP_523 349 | ||||
| #define _CHECK_PERIODIC 350 | ||||
| #define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 351 | ||||
| #define _CHECK_RECURSION_REMAINING 352 | ||||
| #define _CHECK_STACK_SPACE 353 | ||||
| #define _CHECK_STACK_SPACE_OPERAND 354 | ||||
| #define _CHECK_VALIDITY 355 | ||||
| #define _COMPARE_OP 356 | ||||
| #define _COMPARE_OP_FLOAT 357 | ||||
| #define _COMPARE_OP_INT 358 | ||||
| #define _COMPARE_OP_STR 359 | ||||
| #define _CONTAINS_OP 360 | ||||
| #define _CONTAINS_OP_DICT 361 | ||||
| #define _CONTAINS_OP_SET 362 | ||||
| #define _CHECK_FUNCTION 340 | ||||
| #define _CHECK_FUNCTION_EXACT_ARGS 341 | ||||
| #define _CHECK_FUNCTION_VERSION 342 | ||||
| #define _CHECK_FUNCTION_VERSION_INLINE 343 | ||||
| #define _CHECK_FUNCTION_VERSION_KW 344 | ||||
| #define _CHECK_IS_NOT_PY_CALLABLE 345 | ||||
| #define _CHECK_IS_NOT_PY_CALLABLE_KW 346 | ||||
| #define _CHECK_MANAGED_OBJECT_HAS_VALUES 347 | ||||
| #define _CHECK_METHOD_VERSION 348 | ||||
| #define _CHECK_METHOD_VERSION_KW 349 | ||||
| #define _CHECK_PEP_523 350 | ||||
| #define _CHECK_PERIODIC 351 | ||||
| #define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 352 | ||||
| #define _CHECK_RECURSION_REMAINING 353 | ||||
| #define _CHECK_STACK_SPACE 354 | ||||
| #define _CHECK_STACK_SPACE_OPERAND 355 | ||||
| #define _CHECK_VALIDITY 356 | ||||
| #define _COMPARE_OP 357 | ||||
| #define _COMPARE_OP_FLOAT 358 | ||||
| #define _COMPARE_OP_INT 359 | ||||
| #define _COMPARE_OP_STR 360 | ||||
| #define _CONTAINS_OP 361 | ||||
| #define _CONTAINS_OP_DICT 362 | ||||
| #define _CONTAINS_OP_SET 363 | ||||
| #define _CONVERT_VALUE CONVERT_VALUE | ||||
| #define _COPY COPY | ||||
| #define _COPY_FREE_VARS COPY_FREE_VARS | ||||
| #define _CREATE_INIT_FRAME 363 | ||||
| #define _CREATE_INIT_FRAME 364 | ||||
| #define _DELETE_ATTR DELETE_ATTR | ||||
| #define _DELETE_DEREF DELETE_DEREF | ||||
| #define _DELETE_FAST DELETE_FAST | ||||
| #define _DELETE_GLOBAL DELETE_GLOBAL | ||||
| #define _DELETE_NAME DELETE_NAME | ||||
| #define _DELETE_SUBSCR DELETE_SUBSCR | ||||
| #define _DEOPT 364 | ||||
| #define _DEOPT 365 | ||||
| #define _DICT_MERGE DICT_MERGE | ||||
| #define _DICT_UPDATE DICT_UPDATE | ||||
| #define _DO_CALL 365 | ||||
| #define _DO_CALL_FUNCTION_EX 366 | ||||
| #define _DO_CALL_KW 367 | ||||
| #define _DO_CALL 366 | ||||
| #define _DO_CALL_FUNCTION_EX 367 | ||||
| #define _DO_CALL_KW 368 | ||||
| #define _END_FOR END_FOR | ||||
| #define _END_SEND END_SEND | ||||
| #define _ERROR_POP_N 368 | ||||
| #define _ERROR_POP_N 369 | ||||
| #define _EXIT_INIT_CHECK EXIT_INIT_CHECK | ||||
| #define _EXPAND_METHOD 369 | ||||
| #define _EXPAND_METHOD_KW 370 | ||||
| #define _FATAL_ERROR 371 | ||||
| #define _EXPAND_METHOD 370 | ||||
| #define _EXPAND_METHOD_KW 371 | ||||
| #define _FATAL_ERROR 372 | ||||
| #define _FORMAT_SIMPLE FORMAT_SIMPLE | ||||
| #define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC | ||||
| #define _FOR_ITER 372 | ||||
| #define _FOR_ITER_GEN_FRAME 373 | ||||
| #define _FOR_ITER_TIER_TWO 374 | ||||
| #define _FOR_ITER 373 | ||||
| #define _FOR_ITER_GEN_FRAME 374 | ||||
| #define _FOR_ITER_TIER_TWO 375 | ||||
| #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 375 | ||||
| #define _GUARD_CALLABLE_ISINSTANCE 376 | ||||
| #define _GUARD_CALLABLE_LEN 377 | ||||
| #define _GUARD_CALLABLE_STR_1 378 | ||||
| #define _GUARD_CALLABLE_TUPLE_1 379 | ||||
| #define _GUARD_CALLABLE_TYPE_1 380 | ||||
| #define _GUARD_DORV_NO_DICT 381 | ||||
| #define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 382 | ||||
| #define _GUARD_GLOBALS_VERSION 383 | ||||
| #define _GUARD_IS_FALSE_POP 384 | ||||
| #define _GUARD_IS_NONE_POP 385 | ||||
| #define _GUARD_IS_NOT_NONE_POP 386 | ||||
| #define _GUARD_IS_TRUE_POP 387 | ||||
| #define _GUARD_KEYS_VERSION 388 | ||||
| #define _GUARD_NOS_DICT 389 | ||||
| #define _GUARD_NOS_FLOAT 390 | ||||
| #define _GUARD_NOS_INT 391 | ||||
| #define _GUARD_NOS_LIST 392 | ||||
| #define _GUARD_NOS_NULL 393 | ||||
| #define _GUARD_NOS_TUPLE 394 | ||||
| #define _GUARD_NOS_UNICODE 395 | ||||
| #define _GUARD_NOT_EXHAUSTED_LIST 396 | ||||
| #define _GUARD_NOT_EXHAUSTED_RANGE 397 | ||||
| #define _GUARD_NOT_EXHAUSTED_TUPLE 398 | ||||
| #define _GUARD_THIRD_NULL 399 | ||||
| #define _GUARD_TOS_ANY_SET 400 | ||||
| #define _GUARD_TOS_DICT 401 | ||||
| #define _GUARD_TOS_FLOAT 402 | ||||
| #define _GUARD_TOS_INT 403 | ||||
| #define _GUARD_TOS_LIST 404 | ||||
| #define _GUARD_TOS_SLICE 405 | ||||
| #define _GUARD_TOS_TUPLE 406 | ||||
| #define _GUARD_TOS_UNICODE 407 | ||||
| #define _GUARD_TYPE_VERSION 408 | ||||
| #define _GUARD_TYPE_VERSION_AND_LOCK 409 | ||||
| #define _GUARD_BINARY_OP_EXTEND 376 | ||||
| #define _GUARD_CALLABLE_ISINSTANCE 377 | ||||
| #define _GUARD_CALLABLE_LEN 378 | ||||
| #define _GUARD_CALLABLE_LIST_APPEND 379 | ||||
| #define _GUARD_CALLABLE_STR_1 380 | ||||
| #define _GUARD_CALLABLE_TUPLE_1 381 | ||||
| #define _GUARD_CALLABLE_TYPE_1 382 | ||||
| #define _GUARD_DORV_NO_DICT 383 | ||||
| #define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 384 | ||||
| #define _GUARD_GLOBALS_VERSION 385 | ||||
| #define _GUARD_IS_FALSE_POP 386 | ||||
| #define _GUARD_IS_NONE_POP 387 | ||||
| #define _GUARD_IS_NOT_NONE_POP 388 | ||||
| #define _GUARD_IS_TRUE_POP 389 | ||||
| #define _GUARD_KEYS_VERSION 390 | ||||
| #define _GUARD_NOS_DICT 391 | ||||
| #define _GUARD_NOS_FLOAT 392 | ||||
| #define _GUARD_NOS_INT 393 | ||||
| #define _GUARD_NOS_LIST 394 | ||||
| #define _GUARD_NOS_NOT_NULL 395 | ||||
| #define _GUARD_NOS_NULL 396 | ||||
| #define _GUARD_NOS_TUPLE 397 | ||||
| #define _GUARD_NOS_UNICODE 398 | ||||
| #define _GUARD_NOT_EXHAUSTED_LIST 399 | ||||
| #define _GUARD_NOT_EXHAUSTED_RANGE 400 | ||||
| #define _GUARD_NOT_EXHAUSTED_TUPLE 401 | ||||
| #define _GUARD_THIRD_NULL 402 | ||||
| #define _GUARD_TOS_ANY_SET 403 | ||||
| #define _GUARD_TOS_DICT 404 | ||||
| #define _GUARD_TOS_FLOAT 405 | ||||
| #define _GUARD_TOS_INT 406 | ||||
| #define _GUARD_TOS_LIST 407 | ||||
| #define _GUARD_TOS_SLICE 408 | ||||
| #define _GUARD_TOS_TUPLE 409 | ||||
| #define _GUARD_TOS_UNICODE 410 | ||||
| #define _GUARD_TYPE_VERSION 411 | ||||
| #define _GUARD_TYPE_VERSION_AND_LOCK 412 | ||||
| #define _IMPORT_FROM IMPORT_FROM | ||||
| #define _IMPORT_NAME IMPORT_NAME | ||||
| #define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 410 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS 411 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_0 412 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_1 413 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_2 414 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_3 415 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_4 416 | ||||
| #define _INSERT_NULL 417 | ||||
| #define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 413 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS 414 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_0 415 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_1 416 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_2 417 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_3 418 | ||||
| #define _INIT_CALL_PY_EXACT_ARGS_4 419 | ||||
| #define _INSERT_NULL 420 | ||||
| #define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER | ||||
| #define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION | ||||
| #define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD | ||||
|  | @ -173,163 +175,163 @@ 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 418 | ||||
| #define _IS_NONE 421 | ||||
| #define _IS_OP IS_OP | ||||
| #define _ITER_CHECK_LIST 419 | ||||
| #define _ITER_CHECK_RANGE 420 | ||||
| #define _ITER_CHECK_TUPLE 421 | ||||
| #define _ITER_JUMP_LIST 422 | ||||
| #define _ITER_JUMP_RANGE 423 | ||||
| #define _ITER_JUMP_TUPLE 424 | ||||
| #define _ITER_NEXT_LIST 425 | ||||
| #define _ITER_NEXT_LIST_TIER_TWO 426 | ||||
| #define _ITER_NEXT_RANGE 427 | ||||
| #define _ITER_NEXT_TUPLE 428 | ||||
| #define _JUMP_TO_TOP 429 | ||||
| #define _ITER_CHECK_LIST 422 | ||||
| #define _ITER_CHECK_RANGE 423 | ||||
| #define _ITER_CHECK_TUPLE 424 | ||||
| #define _ITER_JUMP_LIST 425 | ||||
| #define _ITER_JUMP_RANGE 426 | ||||
| #define _ITER_JUMP_TUPLE 427 | ||||
| #define _ITER_NEXT_LIST 428 | ||||
| #define _ITER_NEXT_LIST_TIER_TWO 429 | ||||
| #define _ITER_NEXT_RANGE 430 | ||||
| #define _ITER_NEXT_TUPLE 431 | ||||
| #define _JUMP_TO_TOP 432 | ||||
| #define _LIST_APPEND LIST_APPEND | ||||
| #define _LIST_EXTEND LIST_EXTEND | ||||
| #define _LOAD_ATTR 430 | ||||
| #define _LOAD_ATTR_CLASS 431 | ||||
| #define _LOAD_ATTR 433 | ||||
| #define _LOAD_ATTR_CLASS 434 | ||||
| #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN | ||||
| #define _LOAD_ATTR_INSTANCE_VALUE 432 | ||||
| #define _LOAD_ATTR_METHOD_LAZY_DICT 433 | ||||
| #define _LOAD_ATTR_METHOD_NO_DICT 434 | ||||
| #define _LOAD_ATTR_METHOD_WITH_VALUES 435 | ||||
| #define _LOAD_ATTR_MODULE 436 | ||||
| #define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 437 | ||||
| #define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 438 | ||||
| #define _LOAD_ATTR_PROPERTY_FRAME 439 | ||||
| #define _LOAD_ATTR_SLOT 440 | ||||
| #define _LOAD_ATTR_WITH_HINT 441 | ||||
| #define _LOAD_ATTR_INSTANCE_VALUE 435 | ||||
| #define _LOAD_ATTR_METHOD_LAZY_DICT 436 | ||||
| #define _LOAD_ATTR_METHOD_NO_DICT 437 | ||||
| #define _LOAD_ATTR_METHOD_WITH_VALUES 438 | ||||
| #define _LOAD_ATTR_MODULE 439 | ||||
| #define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 440 | ||||
| #define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 441 | ||||
| #define _LOAD_ATTR_PROPERTY_FRAME 442 | ||||
| #define _LOAD_ATTR_SLOT 443 | ||||
| #define _LOAD_ATTR_WITH_HINT 444 | ||||
| #define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS | ||||
| #define _LOAD_BYTECODE 442 | ||||
| #define _LOAD_BYTECODE 445 | ||||
| #define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT | ||||
| #define _LOAD_CONST LOAD_CONST | ||||
| #define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL | ||||
| #define _LOAD_CONST_INLINE 443 | ||||
| #define _LOAD_CONST_INLINE_BORROW 444 | ||||
| #define _LOAD_CONST_INLINE 446 | ||||
| #define _LOAD_CONST_INLINE_BORROW 447 | ||||
| #define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL | ||||
| #define _LOAD_DEREF LOAD_DEREF | ||||
| #define _LOAD_FAST 445 | ||||
| #define _LOAD_FAST_0 446 | ||||
| #define _LOAD_FAST_1 447 | ||||
| #define _LOAD_FAST_2 448 | ||||
| #define _LOAD_FAST_3 449 | ||||
| #define _LOAD_FAST_4 450 | ||||
| #define _LOAD_FAST_5 451 | ||||
| #define _LOAD_FAST_6 452 | ||||
| #define _LOAD_FAST_7 453 | ||||
| #define _LOAD_FAST 448 | ||||
| #define _LOAD_FAST_0 449 | ||||
| #define _LOAD_FAST_1 450 | ||||
| #define _LOAD_FAST_2 451 | ||||
| #define _LOAD_FAST_3 452 | ||||
| #define _LOAD_FAST_4 453 | ||||
| #define _LOAD_FAST_5 454 | ||||
| #define _LOAD_FAST_6 455 | ||||
| #define _LOAD_FAST_7 456 | ||||
| #define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR | ||||
| #define _LOAD_FAST_BORROW 454 | ||||
| #define _LOAD_FAST_BORROW_0 455 | ||||
| #define _LOAD_FAST_BORROW_1 456 | ||||
| #define _LOAD_FAST_BORROW_2 457 | ||||
| #define _LOAD_FAST_BORROW_3 458 | ||||
| #define _LOAD_FAST_BORROW_4 459 | ||||
| #define _LOAD_FAST_BORROW_5 460 | ||||
| #define _LOAD_FAST_BORROW_6 461 | ||||
| #define _LOAD_FAST_BORROW_7 462 | ||||
| #define _LOAD_FAST_BORROW 457 | ||||
| #define _LOAD_FAST_BORROW_0 458 | ||||
| #define _LOAD_FAST_BORROW_1 459 | ||||
| #define _LOAD_FAST_BORROW_2 460 | ||||
| #define _LOAD_FAST_BORROW_3 461 | ||||
| #define _LOAD_FAST_BORROW_4 462 | ||||
| #define _LOAD_FAST_BORROW_5 463 | ||||
| #define _LOAD_FAST_BORROW_6 464 | ||||
| #define _LOAD_FAST_BORROW_7 465 | ||||
| #define _LOAD_FAST_BORROW_LOAD_FAST_BORROW LOAD_FAST_BORROW_LOAD_FAST_BORROW | ||||
| #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 463 | ||||
| #define _LOAD_GLOBAL_BUILTINS 464 | ||||
| #define _LOAD_GLOBAL_MODULE 465 | ||||
| #define _LOAD_GLOBAL 466 | ||||
| #define _LOAD_GLOBAL_BUILTINS 467 | ||||
| #define _LOAD_GLOBAL_MODULE 468 | ||||
| #define _LOAD_LOCALS LOAD_LOCALS | ||||
| #define _LOAD_NAME LOAD_NAME | ||||
| #define _LOAD_SMALL_INT 466 | ||||
| #define _LOAD_SMALL_INT_0 467 | ||||
| #define _LOAD_SMALL_INT_1 468 | ||||
| #define _LOAD_SMALL_INT_2 469 | ||||
| #define _LOAD_SMALL_INT_3 470 | ||||
| #define _LOAD_SPECIAL 471 | ||||
| #define _LOAD_SMALL_INT 469 | ||||
| #define _LOAD_SMALL_INT_0 470 | ||||
| #define _LOAD_SMALL_INT_1 471 | ||||
| #define _LOAD_SMALL_INT_2 472 | ||||
| #define _LOAD_SMALL_INT_3 473 | ||||
| #define _LOAD_SPECIAL 474 | ||||
| #define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR | ||||
| #define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD | ||||
| #define _MAKE_CALLARGS_A_TUPLE 472 | ||||
| #define _MAKE_CALLARGS_A_TUPLE 475 | ||||
| #define _MAKE_CELL MAKE_CELL | ||||
| #define _MAKE_FUNCTION MAKE_FUNCTION | ||||
| #define _MAKE_WARM 473 | ||||
| #define _MAKE_WARM 476 | ||||
| #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 474 | ||||
| #define _MAYBE_EXPAND_METHOD_KW 475 | ||||
| #define _MONITOR_CALL 476 | ||||
| #define _MONITOR_CALL_KW 477 | ||||
| #define _MONITOR_JUMP_BACKWARD 478 | ||||
| #define _MONITOR_RESUME 479 | ||||
| #define _MAYBE_EXPAND_METHOD 477 | ||||
| #define _MAYBE_EXPAND_METHOD_KW 478 | ||||
| #define _MONITOR_CALL 479 | ||||
| #define _MONITOR_CALL_KW 480 | ||||
| #define _MONITOR_JUMP_BACKWARD 481 | ||||
| #define _MONITOR_RESUME 482 | ||||
| #define _NOP NOP | ||||
| #define _POP_EXCEPT POP_EXCEPT | ||||
| #define _POP_JUMP_IF_FALSE 480 | ||||
| #define _POP_JUMP_IF_TRUE 481 | ||||
| #define _POP_JUMP_IF_FALSE 483 | ||||
| #define _POP_JUMP_IF_TRUE 484 | ||||
| #define _POP_TOP POP_TOP | ||||
| #define _POP_TOP_LOAD_CONST_INLINE 482 | ||||
| #define _POP_TOP_LOAD_CONST_INLINE_BORROW 483 | ||||
| #define _POP_TWO_LOAD_CONST_INLINE_BORROW 484 | ||||
| #define _POP_TOP_LOAD_CONST_INLINE 485 | ||||
| #define _POP_TOP_LOAD_CONST_INLINE_BORROW 486 | ||||
| #define _POP_TWO_LOAD_CONST_INLINE_BORROW 487 | ||||
| #define _PUSH_EXC_INFO PUSH_EXC_INFO | ||||
| #define _PUSH_FRAME 485 | ||||
| #define _PUSH_FRAME 488 | ||||
| #define _PUSH_NULL PUSH_NULL | ||||
| #define _PUSH_NULL_CONDITIONAL 486 | ||||
| #define _PY_FRAME_GENERAL 487 | ||||
| #define _PY_FRAME_KW 488 | ||||
| #define _QUICKEN_RESUME 489 | ||||
| #define _REPLACE_WITH_TRUE 490 | ||||
| #define _PUSH_NULL_CONDITIONAL 489 | ||||
| #define _PY_FRAME_GENERAL 490 | ||||
| #define _PY_FRAME_KW 491 | ||||
| #define _QUICKEN_RESUME 492 | ||||
| #define _REPLACE_WITH_TRUE 493 | ||||
| #define _RESUME_CHECK RESUME_CHECK | ||||
| #define _RETURN_GENERATOR RETURN_GENERATOR | ||||
| #define _RETURN_VALUE RETURN_VALUE | ||||
| #define _SAVE_RETURN_OFFSET 491 | ||||
| #define _SEND 492 | ||||
| #define _SEND_GEN_FRAME 493 | ||||
| #define _SAVE_RETURN_OFFSET 494 | ||||
| #define _SEND 495 | ||||
| #define _SEND_GEN_FRAME 496 | ||||
| #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 494 | ||||
| #define _STORE_ATTR 495 | ||||
| #define _STORE_ATTR_INSTANCE_VALUE 496 | ||||
| #define _STORE_ATTR_SLOT 497 | ||||
| #define _STORE_ATTR_WITH_HINT 498 | ||||
| #define _START_EXECUTOR 497 | ||||
| #define _STORE_ATTR 498 | ||||
| #define _STORE_ATTR_INSTANCE_VALUE 499 | ||||
| #define _STORE_ATTR_SLOT 500 | ||||
| #define _STORE_ATTR_WITH_HINT 501 | ||||
| #define _STORE_DEREF STORE_DEREF | ||||
| #define _STORE_FAST 499 | ||||
| #define _STORE_FAST_0 500 | ||||
| #define _STORE_FAST_1 501 | ||||
| #define _STORE_FAST_2 502 | ||||
| #define _STORE_FAST_3 503 | ||||
| #define _STORE_FAST_4 504 | ||||
| #define _STORE_FAST_5 505 | ||||
| #define _STORE_FAST_6 506 | ||||
| #define _STORE_FAST_7 507 | ||||
| #define _STORE_FAST 502 | ||||
| #define _STORE_FAST_0 503 | ||||
| #define _STORE_FAST_1 504 | ||||
| #define _STORE_FAST_2 505 | ||||
| #define _STORE_FAST_3 506 | ||||
| #define _STORE_FAST_4 507 | ||||
| #define _STORE_FAST_5 508 | ||||
| #define _STORE_FAST_6 509 | ||||
| #define _STORE_FAST_7 510 | ||||
| #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 508 | ||||
| #define _STORE_SUBSCR 509 | ||||
| #define _STORE_SUBSCR_DICT 510 | ||||
| #define _STORE_SUBSCR_LIST_INT 511 | ||||
| #define _STORE_SLICE 511 | ||||
| #define _STORE_SUBSCR 512 | ||||
| #define _STORE_SUBSCR_DICT 513 | ||||
| #define _STORE_SUBSCR_LIST_INT 514 | ||||
| #define _SWAP SWAP | ||||
| #define _TIER2_RESUME_CHECK 512 | ||||
| #define _TO_BOOL 513 | ||||
| #define _TIER2_RESUME_CHECK 515 | ||||
| #define _TO_BOOL 516 | ||||
| #define _TO_BOOL_BOOL TO_BOOL_BOOL | ||||
| #define _TO_BOOL_INT TO_BOOL_INT | ||||
| #define _TO_BOOL_LIST 514 | ||||
| #define _TO_BOOL_LIST 517 | ||||
| #define _TO_BOOL_NONE TO_BOOL_NONE | ||||
| #define _TO_BOOL_STR 515 | ||||
| #define _TO_BOOL_STR 518 | ||||
| #define _UNARY_INVERT UNARY_INVERT | ||||
| #define _UNARY_NEGATIVE UNARY_NEGATIVE | ||||
| #define _UNARY_NOT UNARY_NOT | ||||
| #define _UNPACK_EX UNPACK_EX | ||||
| #define _UNPACK_SEQUENCE 516 | ||||
| #define _UNPACK_SEQUENCE_LIST 517 | ||||
| #define _UNPACK_SEQUENCE_TUPLE 518 | ||||
| #define _UNPACK_SEQUENCE_TWO_TUPLE 519 | ||||
| #define _UNPACK_SEQUENCE 519 | ||||
| #define _UNPACK_SEQUENCE_LIST 520 | ||||
| #define _UNPACK_SEQUENCE_TUPLE 521 | ||||
| #define _UNPACK_SEQUENCE_TWO_TUPLE 522 | ||||
| #define _WITH_EXCEPT_START WITH_EXCEPT_START | ||||
| #define _YIELD_VALUE YIELD_VALUE | ||||
| #define MAX_UOP_ID 519 | ||||
| #define MAX_UOP_ID 522 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
|  |  | |||
							
								
								
									
										8
									
								
								Include/internal/pycore_uop_metadata.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Include/internal/pycore_uop_metadata.h
									
										
									
										generated
									
									
									
								
							|  | @ -247,6 +247,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { | |||
|     [_INIT_CALL_PY_EXACT_ARGS] = HAS_ARG_FLAG | HAS_PURE_FLAG, | ||||
|     [_PUSH_FRAME] = 0, | ||||
|     [_GUARD_NOS_NULL] = HAS_DEOPT_FLAG, | ||||
|     [_GUARD_NOS_NOT_NULL] = HAS_EXIT_FLAG, | ||||
|     [_GUARD_THIRD_NULL] = HAS_DEOPT_FLAG, | ||||
|     [_GUARD_CALLABLE_TYPE_1] = HAS_DEOPT_FLAG, | ||||
|     [_CALL_TYPE_1] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG, | ||||
|  | @ -265,6 +266,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { | |||
|     [_CALL_LEN] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, | ||||
|     [_GUARD_CALLABLE_ISINSTANCE] = HAS_DEOPT_FLAG, | ||||
|     [_CALL_ISINSTANCE] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, | ||||
|     [_GUARD_CALLABLE_LIST_APPEND] = HAS_DEOPT_FLAG, | ||||
|     [_CALL_LIST_APPEND] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, | ||||
|     [_CALL_METHOD_DESCRIPTOR_O] = HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, | ||||
|     [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = HAS_ARG_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, | ||||
|  | @ -429,6 +431,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { | |||
|     [_GUARD_BINARY_OP_EXTEND] = "_GUARD_BINARY_OP_EXTEND", | ||||
|     [_GUARD_CALLABLE_ISINSTANCE] = "_GUARD_CALLABLE_ISINSTANCE", | ||||
|     [_GUARD_CALLABLE_LEN] = "_GUARD_CALLABLE_LEN", | ||||
|     [_GUARD_CALLABLE_LIST_APPEND] = "_GUARD_CALLABLE_LIST_APPEND", | ||||
|     [_GUARD_CALLABLE_STR_1] = "_GUARD_CALLABLE_STR_1", | ||||
|     [_GUARD_CALLABLE_TUPLE_1] = "_GUARD_CALLABLE_TUPLE_1", | ||||
|     [_GUARD_CALLABLE_TYPE_1] = "_GUARD_CALLABLE_TYPE_1", | ||||
|  | @ -444,6 +447,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { | |||
|     [_GUARD_NOS_FLOAT] = "_GUARD_NOS_FLOAT", | ||||
|     [_GUARD_NOS_INT] = "_GUARD_NOS_INT", | ||||
|     [_GUARD_NOS_LIST] = "_GUARD_NOS_LIST", | ||||
|     [_GUARD_NOS_NOT_NULL] = "_GUARD_NOS_NOT_NULL", | ||||
|     [_GUARD_NOS_NULL] = "_GUARD_NOS_NULL", | ||||
|     [_GUARD_NOS_TUPLE] = "_GUARD_NOS_TUPLE", | ||||
|     [_GUARD_NOS_UNICODE] = "_GUARD_NOS_UNICODE", | ||||
|  | @ -1072,6 +1076,8 @@ int _PyUop_num_popped(int opcode, int oparg) | |||
|             return 1; | ||||
|         case _GUARD_NOS_NULL: | ||||
|             return 0; | ||||
|         case _GUARD_NOS_NOT_NULL: | ||||
|             return 0; | ||||
|         case _GUARD_THIRD_NULL: | ||||
|             return 0; | ||||
|         case _GUARD_CALLABLE_TYPE_1: | ||||
|  | @ -1108,6 +1114,8 @@ int _PyUop_num_popped(int opcode, int oparg) | |||
|             return 0; | ||||
|         case _CALL_ISINSTANCE: | ||||
|             return 4; | ||||
|         case _GUARD_CALLABLE_LIST_APPEND: | ||||
|             return 0; | ||||
|         case _CALL_LIST_APPEND: | ||||
|             return 3; | ||||
|         case _CALL_METHOD_DESCRIPTOR_O: | ||||
|  |  | |||
|  | @ -1959,6 +1959,21 @@ def testfunc(n): | |||
|         self.assertNotIn("_GUARD_THIRD_NULL", uops) | ||||
|         self.assertNotIn("_GUARD_CALLABLE_ISINSTANCE", uops) | ||||
| 
 | ||||
|     def test_call_list_append(self): | ||||
|         def testfunc(n): | ||||
|             a = [] | ||||
|             for i in range(n): | ||||
|                 a.append(i) | ||||
|             return sum(a) | ||||
| 
 | ||||
|         res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD) | ||||
|         self.assertEqual(res, sum(range(TIER2_THRESHOLD))) | ||||
|         uops = get_opnames(ex) | ||||
|         self.assertIn("_CALL_LIST_APPEND", uops) | ||||
|         # We should remove these in the future | ||||
|         self.assertIn("_GUARD_NOS_LIST", uops) | ||||
|         self.assertIn("_GUARD_CALLABLE_LIST_APPEND", uops) | ||||
| 
 | ||||
|     def test_call_isinstance_is_true(self): | ||||
|         def testfunc(n): | ||||
|             x = 0 | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| Split ``CALL_LIST_APPEND`` into several uops. Patch by Diego Russo. | ||||
|  | @ -4041,6 +4041,11 @@ dummy_func( | |||
|             DEOPT_IF(!PyStackRef_IsNull(null)); | ||||
|         } | ||||
| 
 | ||||
|         op(_GUARD_NOS_NOT_NULL, (nos, unused -- nos, unused)) { | ||||
|             PyObject *o = PyStackRef_AsPyObjectBorrow(nos); | ||||
|             EXIT_IF(o == NULL); | ||||
|         } | ||||
| 
 | ||||
|         op(_GUARD_THIRD_NULL, (null, unused, unused -- null, unused, unused)) { | ||||
|             DEOPT_IF(!PyStackRef_IsNull(null)); | ||||
|         } | ||||
|  | @ -4394,16 +4399,26 @@ dummy_func( | |||
|             _GUARD_CALLABLE_ISINSTANCE + | ||||
|             _CALL_ISINSTANCE; | ||||
| 
 | ||||
|         // This is secretly a super-instruction
 | ||||
|         inst(CALL_LIST_APPEND, (unused/1, unused/2, callable, self, arg -- )) { | ||||
|             assert(oparg == 1); | ||||
|             PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable); | ||||
|             PyObject *self_o = PyStackRef_AsPyObjectBorrow(self); | ||||
|         macro(CALL_LIST_APPEND) = | ||||
|             unused/1 + | ||||
|             unused/2 + | ||||
|             _GUARD_CALLABLE_LIST_APPEND + | ||||
|             _GUARD_NOS_NOT_NULL + | ||||
|             _GUARD_NOS_LIST + | ||||
|             _CALL_LIST_APPEND; | ||||
| 
 | ||||
|         op(_GUARD_CALLABLE_LIST_APPEND, (callable, unused, unused -- callable, unused, unused)){ | ||||
|             PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable); | ||||
|             PyInterpreterState *interp = tstate->interp; | ||||
|             DEOPT_IF(callable_o != interp->callable_cache.list_append); | ||||
|             DEOPT_IF(self_o == NULL); | ||||
|             DEOPT_IF(!PyList_Check(self_o)); | ||||
|         } | ||||
| 
 | ||||
|         // This is secretly a super-instruction
 | ||||
|         op(_CALL_LIST_APPEND, (callable, self, arg -- )) { | ||||
|             assert(oparg == 1); | ||||
|             PyObject *self_o = PyStackRef_AsPyObjectBorrow(self); | ||||
| 
 | ||||
|             DEOPT_IF(!PyList_CheckExact(self_o)); | ||||
|             DEOPT_IF(!LOCK_OBJECT(self_o)); | ||||
|             STAT_INC(CALL, hit); | ||||
|             int err = _PyList_AppendTakeRef((PyListObject *)self_o, PyStackRef_AsPyObjectSteal(arg)); | ||||
|  |  | |||
							
								
								
									
										35
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										35
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -5276,6 +5276,17 @@ | |||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_NOS_NOT_NULL: { | ||||
|             _PyStackRef nos; | ||||
|             nos = stack_pointer[-2]; | ||||
|             PyObject *o = PyStackRef_AsPyObjectBorrow(nos); | ||||
|             if (o == NULL) { | ||||
|                 UOP_STAT_INC(uopcode, miss); | ||||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_THIRD_NULL: { | ||||
|             _PyStackRef null; | ||||
|             null = stack_pointer[-3]; | ||||
|  | @ -5920,6 +5931,18 @@ | |||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_CALLABLE_LIST_APPEND: { | ||||
|             _PyStackRef callable; | ||||
|             callable = stack_pointer[-3]; | ||||
|             PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable); | ||||
|             PyInterpreterState *interp = tstate->interp; | ||||
|             if (callable_o != interp->callable_cache.list_append) { | ||||
|                 UOP_STAT_INC(uopcode, miss); | ||||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _CALL_LIST_APPEND: { | ||||
|             _PyStackRef arg; | ||||
|             _PyStackRef self; | ||||
|  | @ -5929,18 +5952,8 @@ | |||
|             self = stack_pointer[-2]; | ||||
|             callable = stack_pointer[-3]; | ||||
|             assert(oparg == 1); | ||||
|             PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable); | ||||
|             PyObject *self_o = PyStackRef_AsPyObjectBorrow(self); | ||||
|             PyInterpreterState *interp = tstate->interp; | ||||
|             if (callable_o != interp->callable_cache.list_append) { | ||||
|                 UOP_STAT_INC(uopcode, miss); | ||||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             if (self_o == NULL) { | ||||
|                 UOP_STAT_INC(uopcode, miss); | ||||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|             if (!PyList_Check(self_o)) { | ||||
|             if (!PyList_CheckExact(self_o)) { | ||||
|                 UOP_STAT_INC(uopcode, miss); | ||||
|                 JUMP_TO_JUMP_TARGET(); | ||||
|             } | ||||
|  |  | |||
							
								
								
									
										109
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										109
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -3475,58 +3475,79 @@ | |||
|             INSTRUCTION_STATS(CALL_LIST_APPEND); | ||||
|             static_assert(INLINE_CACHE_ENTRIES_CALL == 3, "incorrect cache size"); | ||||
|             _PyStackRef callable; | ||||
|             _PyStackRef nos; | ||||
|             _PyStackRef self; | ||||
|             _PyStackRef arg; | ||||
|             /* Skip 1 cache entry */ | ||||
|             /* Skip 2 cache entries */ | ||||
|             arg = stack_pointer[-1]; | ||||
|             self = stack_pointer[-2]; | ||||
|             callable = stack_pointer[-3]; | ||||
|             assert(oparg == 1); | ||||
|             PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable); | ||||
|             PyObject *self_o = PyStackRef_AsPyObjectBorrow(self); | ||||
|             PyInterpreterState *interp = tstate->interp; | ||||
|             if (callable_o != interp->callable_cache.list_append) { | ||||
|                 UPDATE_MISS_STATS(CALL); | ||||
|                 assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                 JUMP_TO_PREDICTED(CALL); | ||||
|             // _GUARD_CALLABLE_LIST_APPEND
 | ||||
|             { | ||||
|                 callable = stack_pointer[-3]; | ||||
|                 PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable); | ||||
|                 PyInterpreterState *interp = tstate->interp; | ||||
|                 if (callable_o != interp->callable_cache.list_append) { | ||||
|                     UPDATE_MISS_STATS(CALL); | ||||
|                     assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                     JUMP_TO_PREDICTED(CALL); | ||||
|                 } | ||||
|             } | ||||
|             if (self_o == NULL) { | ||||
|                 UPDATE_MISS_STATS(CALL); | ||||
|                 assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                 JUMP_TO_PREDICTED(CALL); | ||||
|             // _GUARD_NOS_NOT_NULL
 | ||||
|             { | ||||
|                 nos = stack_pointer[-2]; | ||||
|                 PyObject *o = PyStackRef_AsPyObjectBorrow(nos); | ||||
|                 if (o == NULL) { | ||||
|                     UPDATE_MISS_STATS(CALL); | ||||
|                     assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                     JUMP_TO_PREDICTED(CALL); | ||||
|                 } | ||||
|             } | ||||
|             if (!PyList_Check(self_o)) { | ||||
|                 UPDATE_MISS_STATS(CALL); | ||||
|                 assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                 JUMP_TO_PREDICTED(CALL); | ||||
|             // _GUARD_NOS_LIST
 | ||||
|             { | ||||
|                 PyObject *o = PyStackRef_AsPyObjectBorrow(nos); | ||||
|                 if (!PyList_CheckExact(o)) { | ||||
|                     UPDATE_MISS_STATS(CALL); | ||||
|                     assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                     JUMP_TO_PREDICTED(CALL); | ||||
|                 } | ||||
|             } | ||||
|             if (!LOCK_OBJECT(self_o)) { | ||||
|                 UPDATE_MISS_STATS(CALL); | ||||
|                 assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                 JUMP_TO_PREDICTED(CALL); | ||||
|             } | ||||
|             STAT_INC(CALL, hit); | ||||
|             int err = _PyList_AppendTakeRef((PyListObject *)self_o, PyStackRef_AsPyObjectSteal(arg)); | ||||
|             UNLOCK_OBJECT(self_o); | ||||
|             stack_pointer += -2; | ||||
|             assert(WITHIN_STACK_BOUNDS()); | ||||
|             _PyFrame_SetStackPointer(frame, stack_pointer); | ||||
|             PyStackRef_CLOSE(self); | ||||
|             stack_pointer = _PyFrame_GetStackPointer(frame); | ||||
|             stack_pointer += -1; | ||||
|             assert(WITHIN_STACK_BOUNDS()); | ||||
|             _PyFrame_SetStackPointer(frame, stack_pointer); | ||||
|             PyStackRef_CLOSE(callable); | ||||
|             stack_pointer = _PyFrame_GetStackPointer(frame); | ||||
|             if (err) { | ||||
|                 JUMP_TO_LABEL(error); | ||||
|             } | ||||
|             #if TIER_ONE | ||||
|             // _CALL_LIST_APPEND
 | ||||
|             { | ||||
|                 arg = stack_pointer[-1]; | ||||
|                 self = nos; | ||||
|                 assert(oparg == 1); | ||||
|                 PyObject *self_o = PyStackRef_AsPyObjectBorrow(self); | ||||
|                 if (!PyList_CheckExact(self_o)) { | ||||
|                     UPDATE_MISS_STATS(CALL); | ||||
|                     assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                     JUMP_TO_PREDICTED(CALL); | ||||
|                 } | ||||
|                 if (!LOCK_OBJECT(self_o)) { | ||||
|                     UPDATE_MISS_STATS(CALL); | ||||
|                     assert(_PyOpcode_Deopt[opcode] == (CALL)); | ||||
|                     JUMP_TO_PREDICTED(CALL); | ||||
|                 } | ||||
|                 STAT_INC(CALL, hit); | ||||
|                 int err = _PyList_AppendTakeRef((PyListObject *)self_o, PyStackRef_AsPyObjectSteal(arg)); | ||||
|                 UNLOCK_OBJECT(self_o); | ||||
|                 stack_pointer += -2; | ||||
|                 assert(WITHIN_STACK_BOUNDS()); | ||||
|                 _PyFrame_SetStackPointer(frame, stack_pointer); | ||||
|                 PyStackRef_CLOSE(self); | ||||
|                 stack_pointer = _PyFrame_GetStackPointer(frame); | ||||
|                 stack_pointer += -1; | ||||
|                 assert(WITHIN_STACK_BOUNDS()); | ||||
|                 _PyFrame_SetStackPointer(frame, stack_pointer); | ||||
|                 PyStackRef_CLOSE(callable); | ||||
|                 stack_pointer = _PyFrame_GetStackPointer(frame); | ||||
|                 if (err) { | ||||
|                     JUMP_TO_LABEL(error); | ||||
|                 } | ||||
|                 #if TIER_ONE | ||||
| 
 | ||||
|             assert(next_instr->op.code == POP_TOP); | ||||
|             SKIP_OVER(1); | ||||
|             #endif | ||||
|                 assert(next_instr->op.code == POP_TOP); | ||||
|                 SKIP_OVER(1); | ||||
|                 #endif | ||||
|             } | ||||
|             DISPATCH(); | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1087,6 +1087,13 @@ dummy_func(void) { | |||
|         sym_set_null(null); | ||||
|     } | ||||
| 
 | ||||
|     op(_GUARD_NOS_NOT_NULL, (nos, unused -- nos, unused)) { | ||||
|         if (sym_is_not_null(nos)) { | ||||
|             REPLACE_OP(this_instr, _NOP, 0, 0); | ||||
|         } | ||||
|         sym_set_non_null(nos); | ||||
|     } | ||||
| 
 | ||||
|     op(_GUARD_THIRD_NULL, (null, unused, unused -- null, unused, unused)) { | ||||
|         if (sym_is_null(null)) { | ||||
|             REPLACE_OP(this_instr, _NOP, 0, 0); | ||||
|  | @ -1135,6 +1142,14 @@ dummy_func(void) { | |||
|         sym_set_const(callable, isinstance); | ||||
|     } | ||||
| 
 | ||||
|     op(_GUARD_CALLABLE_LIST_APPEND, (callable, unused, unused -- callable, unused, unused)) { | ||||
|         PyObject *list_append = _PyInterpreterState_GET()->callable_cache.list_append; | ||||
|         if (sym_get_const(ctx, callable) == list_append) { | ||||
|             REPLACE_OP(this_instr, _NOP, 0, 0); | ||||
|         } | ||||
|         sym_set_const(callable, list_append); | ||||
|     } | ||||
| 
 | ||||
| // END BYTECODES //
 | ||||
| 
 | ||||
| } | ||||
|  |  | |||
							
								
								
									
										21
									
								
								Python/optimizer_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										21
									
								
								Python/optimizer_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -1935,6 +1935,16 @@ | |||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_NOS_NOT_NULL: { | ||||
|             JitOptSymbol *nos; | ||||
|             nos = stack_pointer[-2]; | ||||
|             if (sym_is_not_null(nos)) { | ||||
|                 REPLACE_OP(this_instr, _NOP, 0, 0); | ||||
|             } | ||||
|             sym_set_non_null(nos); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_THIRD_NULL: { | ||||
|             JitOptSymbol *null; | ||||
|             null = stack_pointer[-3]; | ||||
|  | @ -2146,6 +2156,17 @@ | |||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_CALLABLE_LIST_APPEND: { | ||||
|             JitOptSymbol *callable; | ||||
|             callable = stack_pointer[-3]; | ||||
|             PyObject *list_append = _PyInterpreterState_GET()->callable_cache.list_append; | ||||
|             if (sym_get_const(ctx, callable) == list_append) { | ||||
|                 REPLACE_OP(this_instr, _NOP, 0, 0); | ||||
|             } | ||||
|             sym_set_const(callable, list_append); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _CALL_LIST_APPEND: { | ||||
|             stack_pointer += -3; | ||||
|             assert(WITHIN_STACK_BOUNDS()); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Diego Russo
						Diego Russo