@@ -614,15 +614,25 @@ static inline int32_t
614614compute_exit_quality (_Py_CODEUNIT * target_instr , int opcode ,
615615 const _PyJitTracerState * tracer )
616616{
617- if (target_instr == tracer -> initial_state .start_instr ||
618- target_instr == tracer -> initial_state .close_loop_instr ) {
619- return EXIT_QUALITY_CLOSE_LOOP ;
620- }
621- if (target_instr -> op .code == ENTER_EXECUTOR && !_PyJit_EnterExecutorShouldStopTracing (opcode )) {
622- return EXIT_QUALITY_ENTER_EXECUTOR ;
623- }
624- else if (_PyOpcode_Caches [_PyOpcode_Deopt [opcode ]] > 0 ) {
625- return EXIT_QUALITY_SPECIALIZABLE ;
617+ // We need to check for this, otherwise the first instruction (JUMP_BACKWARD usually)
618+ // is mistakenly thought of as an exit.
619+ if (uop_buffer_length ((_PyJitUopBuffer * )& tracer -> code_buffer ) > CODE_SIZE_NO_PROGRESS ) {
620+ if (target_instr == tracer -> initial_state .start_instr ||
621+ target_instr == tracer -> initial_state .close_loop_instr ) {
622+ return EXIT_QUALITY_CLOSE_LOOP ;
623+ }
624+ else if (target_instr -> op .code == ENTER_EXECUTOR && !_PyJit_EnterExecutorShouldStopTracing (opcode )) {
625+ return EXIT_QUALITY_ENTER_EXECUTOR ;
626+ }
627+ else if (opcode == JUMP_BACKWARD_JIT || opcode == JUMP_BACKWARD ) {
628+ return EXIT_QUALITY_BACKWARD_EDGE ;
629+ }
630+ else if (opcode == JUMP_BACKWARD_NO_INTERRUPT ) {
631+ return EXIT_QUALITY_BACKWARD_EDGE_COROUTINE ;
632+ }
633+ else if (_PyOpcode_Caches [_PyOpcode_Deopt [opcode ]] > 0 ) {
634+ return EXIT_QUALITY_SPECIALIZABLE ;
635+ }
626636 }
627637 return EXIT_QUALITY_DEFAULT ;
628638}
@@ -820,8 +830,6 @@ _PyJit_translate_single_bytecode_to_trace(
820830 // One for possible _DEOPT, one because _CHECK_VALIDITY itself might _DEOPT
821831 trace -> end -= 2 ;
822832
823- const struct opcode_macro_expansion * expansion = & _PyOpcode_macro_expansion [opcode ];
824-
825833 assert (opcode != ENTER_EXECUTOR && opcode != EXTENDED_ARG );
826834 assert (!_PyErr_Occurred (tstate ));
827835
@@ -843,6 +851,7 @@ _PyJit_translate_single_bytecode_to_trace(
843851 trace -> end -= needs_guard_ip ;
844852
845853#if Py_DEBUG
854+ const struct opcode_macro_expansion * expansion = & _PyOpcode_macro_expansion [opcode ];
846855 int space_needed = expansion -> nuops + needs_guard_ip + 2 + (!OPCODE_HAS_NO_SAVE_IP (opcode ));
847856 assert (uop_buffer_remaining_space (trace ) > space_needed );
848857#endif
@@ -880,15 +889,8 @@ _PyJit_translate_single_bytecode_to_trace(
880889 case JUMP_BACKWARD_NO_JIT :
881890 case JUMP_BACKWARD :
882891 ADD_TO_TRACE (_CHECK_PERIODIC , 0 , 0 , target );
883- tracer -> translator_state .fitness -= FITNESS_BACKWARD_EDGE ;
884- DPRINTF (3 , " backward edge penalty: -%d -> fitness=%d\n" ,
885- FITNESS_BACKWARD_EDGE , tracer -> translator_state .fitness );
886892 break ;
887893 case JUMP_BACKWARD_NO_INTERRUPT :
888- tracer -> translator_state .fitness -= FITNESS_BACKWARD_EDGE_COROUTINE ;
889- DPRINTF (3 , " coroutine backward edge penalty: -%d -> fitness=%d\n" ,
890- FITNESS_BACKWARD_EDGE_COROUTINE ,
891- tracer -> translator_state .fitness );
892894 break ;
893895
894896 case RESUME :
0 commit comments