#include "pycore_frame.h" // _PyInterpreterFrame
-#define _Py_UOP_MAX_TRACE_LENGTH 128
+#define _Py_UOP_MAX_TRACE_LENGTH 256
typedef struct {
uint16_t opcode;
$(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: \
};
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;
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;
}
static const char *
-uop_name(int index) {
+uop_name(int index)
+{
if (index <= MAX_REAL_OPCODE) {
return _PyOpcode_OpName[index];
}
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;
}
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:
return True
return False
+
@dataclasses.dataclass
class InstructionFlags:
"""Construct and manipulate instruction flags"""
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
@dataclass
class InstHeader(Node):
- annotations : list[str]
+ annotations: list[str]
kind: Literal["inst", "op"]
name: str
inputs: list[InputEffect]
@dataclass
class InstDef(Node):
- annotations : list[str]
+ annotations: list[str]
kind: Literal["inst", "op"]
name: str
inputs: list[InputEffect]