Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
169e08d
bring over changes from old branch
Fidget-Spinner Feb 6, 2024
e270364
Port over to Mark's DSL
Fidget-Spinner Feb 6, 2024
e8a8b78
reduce diff
Fidget-Spinner Feb 6, 2024
bb6137a
fix passthrough
Fidget-Spinner Feb 6, 2024
9b15f9e
fix tests
Fidget-Spinner Feb 6, 2024
66bfce5
fix mypy issues
Fidget-Spinner Feb 6, 2024
3789cd9
fix tests and address review
Fidget-Spinner Feb 6, 2024
20d087b
add tests for abstract cases generator
Fidget-Spinner Feb 6, 2024
0f58526
patchcheck
Fidget-Spinner Feb 6, 2024
c55ba14
Address review
Fidget-Spinner Feb 7, 2024
e34a0f5
reduce diff, add tests
Fidget-Spinner Feb 7, 2024
229aab0
fix compilation problems
Fidget-Spinner Feb 7, 2024
3c8def4
don't needlessly clear aliasing information
Fidget-Spinner Feb 7, 2024
649b0c7
remove is_const for now
Fidget-Spinner Feb 7, 2024
2805755
remove type prop (address review)
Fidget-Spinner Feb 7, 2024
54e2f64
Add back SELF_OR_NULL :(
Fidget-Spinner Feb 7, 2024
dcddb2d
remove broken tests
Fidget-Spinner Feb 7, 2024
6e5ed12
address most reviews (except LOAD_ATTR todo)
Fidget-Spinner Feb 8, 2024
a8b27fc
implement NOT_NULL for attributes
Fidget-Spinner Feb 8, 2024
e00ec6f
revert function version cache size
Fidget-Spinner Feb 8, 2024
b8f0af1
remove unused stats
Fidget-Spinner Feb 8, 2024
9a9033f
remove unused macro
Fidget-Spinner Feb 8, 2024
710f609
remove unused types
Fidget-Spinner Feb 8, 2024
eaeb293
remove unused import
Fidget-Spinner Feb 8, 2024
0bb9539
rename file to tier2_redundancy_eliminator
Fidget-Spinner Feb 8, 2024
82405fa
fix the type system
Fidget-Spinner Feb 8, 2024
2e31906
fix cases generator
Fidget-Spinner Feb 8, 2024
ed25ce0
remove whitespace
Fidget-Spinner Feb 8, 2024
3bf3c7d
check all overridden uops are originally defined
Fidget-Spinner Feb 8, 2024
2af5b74
error -> out of space
Fidget-Spinner Feb 8, 2024
cb1d5fe
fix test cases
Fidget-Spinner Feb 8, 2024
5013027
remove extra lines
Fidget-Spinner Feb 8, 2024
1283660
fix out_of_space vs error
Fidget-Spinner Feb 8, 2024
d14dac6
fix CI
Fidget-Spinner Feb 8, 2024
5394cdd
move macros out, remove temp writebuffer
Fidget-Spinner Feb 9, 2024
0729778
update comment
Fidget-Spinner Feb 10, 2024
35227f8
Address review
Fidget-Spinner Feb 12, 2024
40a19f7
set IS_NULL as a flag
Fidget-Spinner Feb 12, 2024
0a4b6be
Merge remote-tracking branch 'upstream/main' into tier2_redundancy_el…
Fidget-Spinner Feb 12, 2024
aaeb4cd
Fix a bug
Fidget-Spinner Feb 12, 2024
6143256
fix a bug in frames
Fidget-Spinner Feb 12, 2024
35fff8f
address review
Fidget-Spinner Feb 12, 2024
2b6eff4
remove sym sharing
Fidget-Spinner Feb 12, 2024
3b5b498
Address changes
Fidget-Spinner Feb 12, 2024
702a6fc
Address review
Fidget-Spinner Feb 12, 2024
77e56ff
address review
Fidget-Spinner Feb 13, 2024
c457098
Merge remote-tracking branch 'upstream/main' into tier2_redundancy_el…
Fidget-Spinner Feb 13, 2024
fcd31af
rename inst -> this_instr
Fidget-Spinner Feb 13, 2024
92b211c
address review
Fidget-Spinner Feb 13, 2024
1bf6ef8
remove whitespace
Fidget-Spinner Feb 13, 2024
ea3755f
remove assert
Fidget-Spinner Feb 13, 2024
f09e3c3
remove enabled
Fidget-Spinner Feb 13, 2024
9670b23
fix up error codes
Fidget-Spinner Feb 13, 2024
38420c3
fix error code again
Fidget-Spinner Feb 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
reduce diff
Co-Authored-By: Jules <57632293+JuliaPoo@users.noreply.github.com>
Co-Authored-By: Guido van Rossum <gvanrossum@users.noreply.github.com>
  • Loading branch information
3 people committed Feb 6, 2024
commit e8a8b78962999874510863ae92bf80686f9563c5
36 changes: 17 additions & 19 deletions Include/internal/pycore_opcode_metadata.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

42 changes: 21 additions & 21 deletions Include/internal/pycore_uop_metadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,21 @@ extern const char * const _PyOpcode_uop_name[MAX_UOP_ID+1];

#ifdef NEED_OPCODE_METADATA
const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_NOP] = HAS_PURE_FLAG,
[_NOP] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_RESUME_CHECK] = HAS_DEOPT_FLAG,
[_LOAD_FAST_CHECK] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG,
[_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG,
[_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_LOAD_FAST_AND_CLEAR] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
[_LOAD_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
[_LOAD_CONST] = HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_PURE_FLAG,
[_LOAD_CONST] = HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_STORE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
[_STORE_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
[_STORE_FAST_STORE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
[_POP_TOP] = HAS_PURE_FLAG,
[_PUSH_NULL] = HAS_PURE_FLAG,
[_END_SEND] = HAS_PURE_FLAG,
[_POP_TOP] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_PUSH_NULL] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_END_SEND] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_UNARY_NEGATIVE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_UNARY_NOT] = HAS_PURE_FLAG,
[_UNARY_NOT] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_TO_BOOL] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_TO_BOOL_BOOL] = HAS_DEOPT_FLAG,
[_TO_BOOL_INT] = HAS_DEOPT_FLAG,
Expand All @@ -40,15 +40,15 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_TO_BOOL_ALWAYS_TRUE] = HAS_DEOPT_FLAG,
[_UNARY_INVERT] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_GUARD_BOTH_INT] = HAS_DEOPT_FLAG,
[_BINARY_OP_MULTIPLY_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
[_BINARY_OP_ADD_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
[_BINARY_OP_SUBTRACT_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
[_BINARY_OP_MULTIPLY_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_BINARY_OP_ADD_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_BINARY_OP_SUBTRACT_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_GUARD_BOTH_FLOAT] = HAS_DEOPT_FLAG,
[_BINARY_OP_MULTIPLY_FLOAT] = HAS_PURE_FLAG,
[_BINARY_OP_ADD_FLOAT] = HAS_PURE_FLAG,
[_BINARY_OP_SUBTRACT_FLOAT] = HAS_PURE_FLAG,
[_BINARY_OP_MULTIPLY_FLOAT] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_BINARY_OP_ADD_FLOAT] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_BINARY_OP_SUBTRACT_FLOAT] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_GUARD_BOTH_UNICODE] = HAS_DEOPT_FLAG,
[_BINARY_OP_ADD_UNICODE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
[_BINARY_OP_ADD_UNICODE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_BINARY_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
Expand Down Expand Up @@ -168,7 +168,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_CHECK_PEP_523] = HAS_DEOPT_FLAG,
[_CHECK_FUNCTION_EXACT_ARGS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
[_CHECK_STACK_SPACE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
[_INIT_CALL_PY_EXACT_ARGS] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
[_INIT_CALL_PY_EXACT_ARGS] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_PUSH_FRAME] = HAS_ESCAPES_FLAG,
[_CALL_TYPE_1] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
[_CALL_STR_1] = HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
Expand All @@ -190,9 +190,9 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_CONVERT_VALUE] = HAS_ARG_FLAG | HAS_ERROR_FLAG,
[_FORMAT_SIMPLE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_FORMAT_WITH_SPEC] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_COPY] = HAS_ARG_FLAG | HAS_PURE_FLAG,
[_COPY] = HAS_ARG_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_BINARY_OP] = HAS_ARG_FLAG | HAS_ERROR_FLAG,
[_SWAP] = HAS_ARG_FLAG | HAS_PURE_FLAG,
[_SWAP] = HAS_ARG_FLAG | HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_GUARD_IS_TRUE_POP] = HAS_DEOPT_FLAG,
[_GUARD_IS_FALSE_POP] = HAS_DEOPT_FLAG,
[_GUARD_IS_NONE_POP] = HAS_DEOPT_FLAG,
Expand All @@ -204,10 +204,10 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_JUMP_ABSOLUTE] = HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG,
[_JUMP_ABSOLUTE_HEADER] = 0,
[_CHECK_VALIDITY] = HAS_DEOPT_FLAG,
[_LOAD_CONST_INLINE] = HAS_PURE_FLAG,
[_LOAD_CONST_INLINE_BORROW] = HAS_PURE_FLAG,
[_LOAD_CONST_INLINE_WITH_NULL] = HAS_PURE_FLAG,
[_LOAD_CONST_INLINE_BORROW_WITH_NULL] = HAS_PURE_FLAG,
[_LOAD_CONST_INLINE] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_LOAD_CONST_INLINE_BORROW] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_LOAD_CONST_INLINE_WITH_NULL] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_LOAD_CONST_INLINE_BORROW_WITH_NULL] = HAS_PURE_FLAG | HAS_PASSTHROUGH_FLAG,
[_CHECK_GLOBALS] = HAS_DEOPT_FLAG,
[_CHECK_BUILTINS] = HAS_DEOPT_FLAG,
[_INTERNAL_INCREMENT_OPT_COUNTER] = 0,
Expand Down
18 changes: 0 additions & 18 deletions Python/optimizer.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,26 +222,8 @@ static PyMethodDef executor_methods[] = {
///////////////////// Experimental UOp Optimizer /////////////////////


static void
clear_strong_refs_in_uops(_PyUOpInstruction *trace, Py_ssize_t uop_len)
{
for (Py_ssize_t i = 0; i < uop_len; i++) {
if (trace[i].opcode == _LOAD_CONST_INLINE ||
trace[i].opcode == _LOAD_CONST_INLINE_WITH_NULL) {
PyObject *c = (PyObject*)trace[i].operand;
Py_CLEAR(c);
}
if (trace[i].opcode == _JUMP_ABSOLUTE ||
trace[i].opcode == _JUMP_TO_TOP ||
trace[i].opcode == _EXIT_TRACE) {
return;
}
}
}

static void
uop_dealloc(_PyExecutorObject *self) {
clear_strong_refs_in_uops(&self->trace[0], Py_SIZE(self));
_Py_ExecutorClear(self);
#ifdef _Py_JIT
_PyJIT_Free(self);
Expand Down
3 changes: 1 addition & 2 deletions Python/optimizer_analysis.c
Original file line number Diff line number Diff line change
Expand Up @@ -884,9 +884,8 @@ uop_abstract_interpret(
while (curr < end && !op_is_end(curr->opcode)) {
Comment thread
Fidget-Spinner marked this conversation as resolved.
Outdated

if (!(_PyUop_Flags[curr->opcode] & HAS_PURE_FLAG) &&
!(_PyUop_Flags[curr->opcode] & HAS_SPECIAL_OPT_FLAG) &&
!op_is_bookkeeping(curr->opcode) &&
!(_PyUop_Flags[curr->opcode] & HAS_GUARD_FLAG)) {
!(_PyUop_Flags[curr->opcode] & HAS_PASSTHROUGH_FLAG)) {
DPRINTF(3, "Impure %s\n", _PyOpcode_uop_name[curr->opcode]);
if (needs_clear_locals) {
if (clear_locals_type_info(&ctx) < 0) {
Expand Down
2 changes: 1 addition & 1 deletion Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -1252,7 +1252,7 @@ init_interp_main(PyThreadState *tstate)
if (_Py_get_xoption(&config->xoptions, L"uops") != NULL) {
enabled = 1;
}
// enabled = 1; // TEMPORARY: always enable
enabled = 1; // TEMPORARY: always enable
if (enabled) {
#else
// Always enable tier two for JIT builds (ignoring the environment
Expand Down
28 changes: 2 additions & 26 deletions Python/tier2_redundancy_eliminator_bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,6 @@ typedef struct _Py_UOpsSymType _Py_UOpsSymType;
typedef struct _Py_UOpsAbstractInterpContext _Py_UOpsAbstractInterpContext;
typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame;

extern _Py_UOpsSymType *get_local(_Py_UOpsAbstractFrame *frame, int index);
extern void set_local(_Py_UOpsAbstractFrame *frame, int index, _Py_UOpsSymType *value);

extern _Py_UOpsSymType *new_constant(PyObject *k, _Py_UOpsAbstractInterpContext *ctx);
extern _Py_UOpsSymType *new_null(_Py_UOpsAbstractInterpContext *ctx);
extern PyObject *get_constant(_Py_UOpsSymType *o);
extern PyTypeObject *get_type(_Py_UOpsSymType *o);

extern int is_constant(_Py_UOpsSymType *o);
extern int is_int(_Py_UOpsSymType *o);
extern int is_bool(_Py_UOpsSymType *o);
extern int is_float(_Py_UOpsSymType *o);

extern int is_not_none(_Py_UOpsSymType *o);
extern int is_none(_Py_UOpsSymType *o);

extern _Py_UOpsSymType *new_unknown(_Py_UOpsAbstractInterpContext *ctx);

extern void promote_to_const(_Py_UOpsSymType *o, PyObject *k);
extern void promote_to_type(_Py_UOpsSymType *o, PyTypeObject *t);

extern SpecializerSpace *initialize_space(void *memory, int size);


static int
dummy_func(void) {

Expand All @@ -46,8 +22,8 @@ dummy_func(void) {
_Py_UOpsSymType *top;
_Py_UOpsSymType *bottom;
_Py_UOpsAbstractFrame *frame;
SpecializerSpace *space;
_PyUOpInstruction *this_instr;
_Py_UOpsAbstractInterpContext *ctx;
_PyUOpInstruction *inst;
_PyBloomFilter *dependencies;
int modified;

Expand Down
2 changes: 2 additions & 0 deletions Tools/cases_generator/generators_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,8 @@ def cflags(p: Properties) -> str:
flags.append("HAS_ESCAPES_FLAG")
if p.pure:
flags.append("HAS_PURE_FLAG")
if p.pure:
flags.append("HAS_PASSTHROUGH_FLAG")
if flags:
return " | ".join(flags)
else:
Expand Down
3 changes: 1 addition & 2 deletions Tools/cases_generator/opcode_metadata_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@
"ERROR",
"ESCAPES",
"PURE",
"GUARD",
"SPECIAL_OPT",
"PASSTHROUGH",
]


Expand Down
1 change: 1 addition & 0 deletions Tools/cases_generator/uop_metadata_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ def generate_names_and_flags(analysis: Analysis, out: CWriter) -> None:
out.emit("};\n")
out.emit("#endif // NEED_OPCODE_METADATA\n\n")


def generate_uop_metadata(
filenames: list[str], analysis: Analysis, outfile: TextIO
) -> None:
Expand Down