summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2023-11-17 19:49:42 (GMT)
committerGitHub <noreply@github.com>2023-11-17 19:49:42 (GMT)
commitbe0bd54c6b3b2382d03f2073070353c8b946902b (patch)
treec92d1dacbfd1fe3e7e9bf538538cf48b66c5a4d3
parentb4144979934d7b8448f80c1fbee65dc3bfbce005 (diff)
downloadcpython-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.h2
-rw-r--r--Makefile.pre.in1
-rw-r--r--Python/bytecodes.c1
-rw-r--r--Python/generated_cases.c.h1
-rw-r--r--Python/optimizer.c21
-rw-r--r--Tools/cases_generator/flags.py7
-rw-r--r--Tools/cases_generator/parsing.py4
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]