From ce66f3b836b5efb61cafab6a41242ec8f7e59ab7 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 24 Oct 2025 19:27:16 +0100 Subject: [PATCH] Remove TIER2_STORE_IP --- Objects/frameobject.c | 1 - Python/bytecodes.c | 20 ++---------------- Python/ceval.c | 15 +------------- Python/ceval_macros.h | 3 ++- Python/executor_cases.c.h | 26 +++++------------------- Python/generated_cases.c.h | 25 ----------------------- Tools/cases_generator/tier2_generator.py | 15 ++++++++++++++ 7 files changed, 25 insertions(+), 80 deletions(-) diff --git a/Objects/frameobject.c b/Objects/frameobject.c index abed4547ffd0..37d30f349fed 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -17,7 +17,6 @@ #include "frameobject.h" // PyFrameLocalsProxyObject #include "opcode.h" // EXTENDED_ARG -#include "../Include/pytypedefs.h" #include "pycore_optimizer.h" #include "clinic/frameobject.c.h" diff --git a/Python/bytecodes.c b/Python/bytecodes.c index ee9d41bd5194..e53621298553 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1249,12 +1249,7 @@ dummy_func( frame = tstate->current_frame = dying->previous; _PyEval_FrameClearAndPop(tstate, dying); RELOAD_STACK(); - #if TIER_ONE LOAD_IP(frame->return_offset); - #endif - #if TIER_TWO - TIER2_STORE_IP(frame->return_offset); - #endif res = temp; LLTRACE_RESUME_FRAME(); } @@ -1441,12 +1436,7 @@ dummy_func( _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR); #endif RELOAD_STACK(); - #if TIER_ONE LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND); - #endif - #if TIER_TWO - TIER2_STORE_IP(1 + INLINE_CACHE_ENTRIES_SEND); - #endif value = PyStackRef_MakeHeapSafe(temp); LLTRACE_RESUME_FRAME(); } @@ -3236,15 +3226,14 @@ dummy_func( } op(_FOR_ITER_TIER_TWO, (iter, null_or_index -- iter, null_or_index, next)) { - TIER2_STORE_IP(1 + INLINE_CACHE_ENTRIES_FOR_ITER); _PyStackRef item = _PyForIter_VirtualIteratorNext(tstate, frame, iter, &null_or_index); if (!PyStackRef_IsValid(item)) { if (PyStackRef_IsError(item)) { ERROR_NO_POP(); } /* iterator ended normally */ - /* This just sets the IP to what it expects */ - TIER2_STORE_IP(oparg + 1); + /* This just sets the IP to what it expects (see normal _FOR_ITER */ + frame->instr_ptr += (oparg + 2 + INLINE_CACHE_ENTRIES_FOR_ITER); EXIT_IF(true); } next = item; @@ -4992,12 +4981,7 @@ dummy_func( _PyInterpreterFrame *prev = frame->previous; _PyThreadState_PopFrame(tstate, frame); frame = tstate->current_frame = prev; - #if TIER_ONE LOAD_IP(frame->return_offset); - #endif - #if TIER_TWO - TIER2_STORE_IP(frame->return_offset); - #endif RELOAD_STACK(); res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen); LLTRACE_RESUME_FRAME(); diff --git a/Python/ceval.c b/Python/ceval.c index 49c1c5986c0f..4597cc5e6416 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1213,20 +1213,7 @@ tier2_dispatch: for (;;) { uopcode = next_uop->opcode; #ifdef Py_DEBUG - if (frame->lltrace >= 4) { - if (next_uop->opcode != _START_EXECUTOR) { - if (next_uop->format == UOP_FORMAT_TARGET) { - _Py_CODEUNIT *aim = _PyFrame_GetBytecode(frame) + next_uop->target; - printf(" aim=[%s]\n", _PyOpcode_OpName[aim->op.code]); - } - else if (next_uop->format == UOP_FORMAT_JUMP) { - _PyUOpInstruction *aim_uop = current_executor->trace + next_uop->jump_target; - if (aim_uop->format == UOP_FORMAT_TARGET) { - _Py_CODEUNIT *aim = _PyFrame_GetBytecode(frame) + aim_uop->target; - printf(" aim=[%s]\n", _PyOpcode_OpName[aim->op.code]); - } - } - } + if (frame->lltrace >= 3) { dump_stack(frame, stack_pointer); if (next_uop->opcode == _START_EXECUTOR) { printf("%4d uop: ", 0); diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index f85a7f9e271a..a29e5d5cbbfd 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -210,12 +210,14 @@ do { \ JUMP_TO_LABEL(start_frame); \ } while (0) #else + #define DISPATCH_SAME_OPARG() \ { \ opcode = next_instr->op.code; \ PRE_DISPATCH_GOTO(); \ DISPATCH_GOTO(); \ } + #define DISPATCH_INLINED(NEW_FRAME) \ do { \ assert(tstate->interp->eval_frame == NULL); \ @@ -257,7 +259,6 @@ GETITEM(PyObject *v, Py_ssize_t i) { * and skipped instructions. */ #define JUMPBY(x) (next_instr += (x)) -#define TIER2_STORE_IP(x) (frame->instr_ptr += (x)) #define SKIP_OVER(x) (next_instr += (x)) #define STACK_LEVEL() ((int)(stack_pointer - _PyFrame_Stackbase(frame))) diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 2fa109b049d1..fafaa7bd12bb 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1930,12 +1930,7 @@ frame = tstate->current_frame = dying->previous; _PyEval_FrameClearAndPop(tstate, dying); stack_pointer = _PyFrame_GetStackPointer(frame); - #if TIER_ONE - LOAD_IP(frame->return_offset); - #endif - #if TIER_TWO - TIER2_STORE_IP(frame->return_offset); - #endif + frame->instr_ptr += (frame->return_offset); res = temp; LLTRACE_RESUME_FRAME(); stack_pointer[0] = res; @@ -2101,12 +2096,7 @@ _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR); #endif stack_pointer = _PyFrame_GetStackPointer(frame); - #if TIER_ONE - LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND); - #endif - #if TIER_TWO - TIER2_STORE_IP(1 + INLINE_CACHE_ENTRIES_SEND); - #endif + frame->instr_ptr += (1 + INLINE_CACHE_ENTRIES_SEND); value = PyStackRef_MakeHeapSafe(temp); LLTRACE_RESUME_FRAME(); stack_pointer[0] = value; @@ -4398,7 +4388,6 @@ oparg = CURRENT_OPARG(); null_or_index = stack_pointer[-1]; iter = stack_pointer[-2]; - TIER2_STORE_IP(1 + INLINE_CACHE_ENTRIES_FOR_ITER); _PyFrame_SetStackPointer(frame, stack_pointer); _PyStackRef item = _PyForIter_VirtualIteratorNext(tstate, frame, iter, &null_or_index); stack_pointer = _PyFrame_GetStackPointer(frame); @@ -4406,7 +4395,7 @@ if (PyStackRef_IsError(item)) { JUMP_TO_ERROR(); } - TIER2_STORE_IP(oparg + 1); + frame->instr_ptr += (oparg + 2 + INLINE_CACHE_ENTRIES_FOR_ITER); if (true) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); @@ -5358,7 +5347,7 @@ frame = tstate->current_frame = temp; tstate->py_recursion_remaining--; LOAD_SP(); - LOAD_IP(0); + frame->instr_ptr += (0); LLTRACE_RESUME_FRAME(); break; } @@ -6763,12 +6752,7 @@ _PyInterpreterFrame *prev = frame->previous; _PyThreadState_PopFrame(tstate, frame); frame = tstate->current_frame = prev; - #if TIER_ONE - LOAD_IP(frame->return_offset); - #endif - #if TIER_TWO - TIER2_STORE_IP(frame->return_offset); - #endif + frame->instr_ptr += (frame->return_offset); stack_pointer = _PyFrame_GetStackPointer(frame); res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen); LLTRACE_RESUME_FRAME(); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 6ed8bce67cc1..4dc2599bff52 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -7873,12 +7873,7 @@ frame = tstate->current_frame = dying->previous; _PyEval_FrameClearAndPop(tstate, dying); stack_pointer = _PyFrame_GetStackPointer(frame); - #if TIER_ONE LOAD_IP(frame->return_offset); - #endif - #if TIER_TWO - TIER2_STORE_IP(frame->return_offset); - #endif res = temp; LLTRACE_RESUME_FRAME(); } @@ -7946,12 +7941,7 @@ _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR); #endif stack_pointer = _PyFrame_GetStackPointer(frame); - #if TIER_ONE LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND); - #endif - #if TIER_TWO - TIER2_STORE_IP(1 + INLINE_CACHE_ENTRIES_SEND); - #endif value = PyStackRef_MakeHeapSafe(temp); LLTRACE_RESUME_FRAME(); } @@ -11045,12 +11035,7 @@ _PyInterpreterFrame *prev = frame->previous; _PyThreadState_PopFrame(tstate, frame); frame = tstate->current_frame = prev; - #if TIER_ONE LOAD_IP(frame->return_offset); - #endif - #if TIER_TWO - TIER2_STORE_IP(frame->return_offset); - #endif stack_pointer = _PyFrame_GetStackPointer(frame); res = PyStackRef_FromPyObjectStealMortal((PyObject *)gen); LLTRACE_RESUME_FRAME(); @@ -11082,12 +11067,7 @@ frame = tstate->current_frame = dying->previous; _PyEval_FrameClearAndPop(tstate, dying); stack_pointer = _PyFrame_GetStackPointer(frame); - #if TIER_ONE LOAD_IP(frame->return_offset); - #endif - #if TIER_TWO - TIER2_STORE_IP(frame->return_offset); - #endif res = temp; LLTRACE_RESUME_FRAME(); stack_pointer[0] = res; @@ -12875,12 +12855,7 @@ _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR); #endif stack_pointer = _PyFrame_GetStackPointer(frame); - #if TIER_ONE LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND); - #endif - #if TIER_TWO - TIER2_STORE_IP(1 + INLINE_CACHE_ENTRIES_SEND); - #endif value = PyStackRef_MakeHeapSafe(temp); LLTRACE_RESUME_FRAME(); stack_pointer[0] = value; diff --git a/Tools/cases_generator/tier2_generator.py b/Tools/cases_generator/tier2_generator.py index 87b26b1c7325..e95a070b163f 100644 --- a/Tools/cases_generator/tier2_generator.py +++ b/Tools/cases_generator/tier2_generator.py @@ -65,6 +65,7 @@ class Tier2Emitter(Emitter): self._replacers["oparg"] = self.oparg self._replacers["JUMPBY"] = self.jumpby self._replacers["DISPATCH"] = self.dispatch + self._replacers["LOAD_IP"] = self.load_ip def goto_error(self, offset: int, storage: Storage) -> str: # To do: Add jump targets for popping values. @@ -169,6 +170,20 @@ class Tier2Emitter(Emitter): next(tkn_iter) return False + def load_ip( + self, + tkn: Token, + tkn_iter: TokenIterator, + uop: CodeSection, + storage: Storage, + inst: Instruction | None, + ) -> bool: + self.out.start_line() + self.emit("frame->instr_ptr += ") + emit_to(self.out, tkn_iter, "SEMI") + self.emit(";\n") + return True + def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack: locals: dict[str, Local] = {} try: -- 2.47.3