diff options
author | Guido van Rossum <guido@python.org> | 2023-11-17 19:49:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-17 19:49:42 (GMT) |
commit | be0bd54c6b3b2382d03f2073070353c8b946902b (patch) | |
tree | c92d1dacbfd1fe3e7e9bf538538cf48b66c5a4d3 | |
parent | b4144979934d7b8448f80c1fbee65dc3bfbce005 (diff) | |
download | cpython-be0bd54c6b3b2382d03f2073070353c8b946902b.zip cpython-be0bd54c6b3b2382d03f2073070353c8b946902b.tar.gz cpython-be0bd54c6b3b2382d03f2073070353c8b946902b.tar.bz2 |
gh-106529: Cleanups split off gh-112134 (#112214)
- Double max trace size to 256
- Add a dependency on executor_cases.c.h for ceval.o
- Mark `_SPECIALIZE_UNPACK_SEQUENCE` as `TIER_ONE_ONLY`
- Add debug output back showing the optimized trace
- Bunch of cleanups to Tools/cases_generator/
-rw-r--r-- | Include/internal/pycore_uops.h | 2 | ||||
-rw-r--r-- | Makefile.pre.in | 1 | ||||
-rw-r--r-- | Python/bytecodes.c | 1 | ||||
-rw-r--r-- | Python/generated_cases.c.h | 1 | ||||
-rw-r--r-- | Python/optimizer.c | 21 | ||||
-rw-r--r-- | Tools/cases_generator/flags.py | 7 | ||||
-rw-r--r-- | Tools/cases_generator/parsing.py | 4 |
7 files changed, 29 insertions, 8 deletions
diff --git a/Include/internal/pycore_uops.h b/Include/internal/pycore_uops.h index 0ecbd2d..8ab9aaf 100644 --- a/Include/internal/pycore_uops.h +++ b/Include/internal/pycore_uops.h @@ -10,7 +10,7 @@ extern "C" { #include "pycore_frame.h" // _PyInterpreterFrame -#define _Py_UOP_MAX_TRACE_LENGTH 128 +#define _Py_UOP_MAX_TRACE_LENGTH 256 typedef struct { uint16_t opcode; diff --git a/Makefile.pre.in b/Makefile.pre.in index 2174ec3..3d76642 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1609,6 +1609,7 @@ Python/ceval.o: \ $(srcdir)/Python/ceval_macros.h \ $(srcdir)/Python/condvar.h \ $(srcdir)/Python/generated_cases.c.h \ + $(srcdir)/Python/executor_cases.c.h \ $(srcdir)/Python/opcode_targets.h Python/flowgraph.o: \ diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 8a7dcb8..bd81dc1 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1210,6 +1210,7 @@ dummy_func( }; specializing op(_SPECIALIZE_UNPACK_SEQUENCE, (counter/1, seq -- seq)) { + TIER_ONE_ONLY #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { next_instr = this_instr; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index fe0cbfe..a74529d 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -1731,6 +1731,7 @@ seq = stack_pointer[-1]; { uint16_t counter = read_u16(&this_instr[1].cache); + TIER_ONE_ONLY #if ENABLE_SPECIALIZATION if (ADAPTIVE_COUNTER_IS_ZERO(counter)) { next_instr = this_instr; diff --git a/Python/optimizer.c b/Python/optimizer.c index e14ad89..5d1ef8a 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -325,7 +325,8 @@ uop_dealloc(_PyUOpExecutorObject *self) { } static const char * -uop_name(int index) { +uop_name(int index) +{ if (index <= MAX_REAL_OPCODE) { return _PyOpcode_OpName[index]; } @@ -832,6 +833,24 @@ make_executor_from_uops(_PyUOpInstruction *buffer, _PyBloomFilter *dependencies) assert(dest == -1); executor->base.execute = _PyUopExecute; _Py_ExecutorInit((_PyExecutorObject *)executor, dependencies); +#ifdef Py_DEBUG + char *python_lltrace = Py_GETENV("PYTHON_LLTRACE"); + int lltrace = 0; + if (python_lltrace != NULL && *python_lltrace >= '0') { + lltrace = *python_lltrace - '0'; // TODO: Parse an int and all that + } + if (lltrace >= 2) { + printf("Optimized executor (length %d):\n", length); + for (int i = 0; i < length; i++) { + printf("%4d %s(%d, %d, %" PRIu64 ")\n", + i, + uop_name(executor->trace[i].opcode), + executor->trace[i].oparg, + executor->trace[i].target, + executor->trace[i].operand); + } + } +#endif return (_PyExecutorObject *)executor; } diff --git a/Tools/cases_generator/flags.py b/Tools/cases_generator/flags.py index 0066c9e..808c9e8 100644 --- a/Tools/cases_generator/flags.py +++ b/Tools/cases_generator/flags.py @@ -53,7 +53,7 @@ ESCAPING_FUNCTIONS = ( def makes_escaping_api_call(instr: parsing.InstDef) -> bool: if "CALL_INTRINSIC" in instr.name: - return True; + return True tkns = iter(instr.tokens) for tkn in tkns: if tkn.kind != lx.IDENTIFIER: @@ -79,6 +79,7 @@ def makes_escaping_api_call(instr: parsing.InstDef) -> bool: return True return False + @dataclasses.dataclass class InstructionFlags: """Construct and manipulate instruction flags""" @@ -124,9 +125,7 @@ class InstructionFlags: or variable_used(instr, "exception_unwind") or variable_used(instr, "resume_with_error") ), - HAS_ESCAPES_FLAG=( - makes_escaping_api_call(instr) - ), + HAS_ESCAPES_FLAG=makes_escaping_api_call(instr), ) @staticmethod diff --git a/Tools/cases_generator/parsing.py b/Tools/cases_generator/parsing.py index 49459be..d36bd52 100644 --- a/Tools/cases_generator/parsing.py +++ b/Tools/cases_generator/parsing.py @@ -105,7 +105,7 @@ UOp = OpName | CacheEffect @dataclass class InstHeader(Node): - annotations : list[str] + annotations: list[str] kind: Literal["inst", "op"] name: str inputs: list[InputEffect] @@ -114,7 +114,7 @@ class InstHeader(Node): @dataclass class InstDef(Node): - annotations : list[str] + annotations: list[str] kind: Literal["inst", "op"] name: str inputs: list[InputEffect] |