]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-106529: Cleanups split off gh-112134 (#112214)
authorGuido van Rossum <guido@python.org>
Fri, 17 Nov 2023 19:49:42 +0000 (11:49 -0800)
committerGitHub <noreply@github.com>
Fri, 17 Nov 2023 19:49:42 +0000 (11:49 -0800)
- 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/

Include/internal/pycore_uops.h
Makefile.pre.in
Python/bytecodes.c
Python/generated_cases.c.h
Python/optimizer.c
Tools/cases_generator/flags.py
Tools/cases_generator/parsing.py

index 0ecbd2dfd1af730d81ed7d034a4e5d365f3ebf89..8ab9aaf4108079739e90117f269abebbd9d41c57 100644 (file)
@@ -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;
index 2174ec3ac561586f72010ee2149dd932bd80126a..3d766425abba34029c4d4a152583e02c5c48f19c 100644 (file)
@@ -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: \
index 8a7dcb8416eb8c33bf0a8c5c156049d3c879fa23..bd81dc19523598e4468269b803baa8d95b941347 100644 (file)
@@ -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;
index fe0cbfe6330e51c9c8b952336c28a1624d85d8ef..a74529d88557bec52af7466e9af65d4e23abf12c 100644 (file)
             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;
index e14ad89bbe29219e2d97e630780b7abb12f4e30a..5d1ef8a683c250649989172f3a49ca45e55a6437 100644 (file)
@@ -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;
 }
 
index 0066c9e74512c3c34a887ba080f3e2f4f0f75e6b..808c9e82bbce07805b10e2d6f5bdbf73c582dd75 100644 (file)
@@ -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
index 49459be68ae5e8f73813040792dc229254db3730..d36bd52b022ea94c2ea5fbd441c35fb7cd2eabe3 100644 (file)
@@ -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]