Skip to content

Commit 219db3d

Browse files
committed
Refactor optimizer symbols
1 parent f48702d commit 219db3d

File tree

8 files changed

+649
-515
lines changed

8 files changed

+649
-515
lines changed

Include/internal/pycore_optimizer.h

Lines changed: 84 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,6 @@ extern PyTypeObject _PyDefaultOptimizer_Type;
156156
extern PyTypeObject _PyUOpExecutor_Type;
157157
extern PyTypeObject _PyUOpOptimizer_Type;
158158

159-
/* Symbols */
160-
/* See explanation in optimizer_symbols.c */
161-
162-
struct _Py_UopsSymbol {
163-
int flags; // 0 bits: Top; 2 or more bits: Bottom
164-
PyTypeObject *typ; // Borrowed reference
165-
PyObject *const_val; // Owned reference (!)
166-
unsigned int type_version; // currently stores type version
167-
};
168159

169160
#define UOP_FORMAT_TARGET 0
170161
#define UOP_FORMAT_JUMP 1
@@ -201,27 +192,72 @@ static inline uint16_t uop_get_error_target(const _PyUOpInstruction *inst)
201192
// handle before rejoining the rest of the program.
202193
#define MAX_CHAIN_DEPTH 4
203194

204-
typedef struct _Py_UopsSymbol _Py_UopsSymbol;
195+
/* Symbols */
196+
/* See explanation in optimizer_symbols.c */
197+
198+
199+
typedef enum _JitSymType {
200+
JIT_SYM_UNKNOWN_TAG = 0,
201+
202+
JIT_SYM_NULL_TAG = 2,
203+
JIT_SYM_NON_NULL_TAG = 3,
204+
JIT_SYM_BOTTOM_TAG = 4,
205+
JIT_SYM_TYPE_VERSION_TAG = 5,
206+
JIT_SYM_KNOWN_CLASS_TAG = 6,
207+
JIT_SYM_KNOWN_VALUE_TAG = 7,
208+
JIT_SYM_TUPLE_TAG = 8,
209+
} JitSymType;
210+
211+
typedef struct _jit_opt_known_class {
212+
uint8_t tag;
213+
uint32_t version;
214+
PyTypeObject *type;
215+
} JitOptKnownClass;
216+
217+
typedef struct _jit_opt_known_version {
218+
uint8_t tag;
219+
uint32_t version;
220+
} JitOptKnownVersion;
221+
222+
typedef struct _jit_opt_known_value {
223+
uint8_t tag;
224+
PyObject *value;
225+
} JitOptKnownValue;
226+
227+
typedef struct _jit_opt_tuple {
228+
uint8_t tag;
229+
uint8_t length;
230+
uint16_t items[6];
231+
} JitOptTuple;
232+
233+
typedef union _jit_opt_symbol {
234+
uint8_t tag;
235+
JitOptKnownClass cls;
236+
JitOptKnownValue value;
237+
JitOptKnownVersion version;
238+
JitOptTuple tuple;
239+
} JitOptSymbol;
240+
205241

206242
struct _Py_UOpsAbstractFrame {
207243
// Max stacklen
208244
int stack_len;
209245
int locals_len;
210246

211-
_Py_UopsSymbol **stack_pointer;
212-
_Py_UopsSymbol **stack;
213-
_Py_UopsSymbol **locals;
247+
JitOptSymbol **stack_pointer;
248+
JitOptSymbol **stack;
249+
JitOptSymbol **locals;
214250
};
215251

216252
typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame;
217253

218254
typedef struct ty_arena {
219255
int ty_curr_number;
220256
int ty_max_number;
221-
_Py_UopsSymbol arena[TY_ARENA_SIZE];
257+
JitOptSymbol arena[TY_ARENA_SIZE];
222258
} ty_arena;
223259

224-
struct _Py_UOpsContext {
260+
typedef struct _JitOptContext {
225261
char done;
226262
char out_of_space;
227263
bool contradiction;
@@ -233,46 +269,44 @@ struct _Py_UOpsContext {
233269
// Arena for the symbolic types.
234270
ty_arena t_arena;
235271

236-
_Py_UopsSymbol **n_consumed;
237-
_Py_UopsSymbol **limit;
238-
_Py_UopsSymbol *locals_and_stack[MAX_ABSTRACT_INTERP_SIZE];
239-
};
240-
241-
typedef struct _Py_UOpsContext _Py_UOpsContext;
242-
243-
extern bool _Py_uop_sym_is_null(_Py_UopsSymbol *sym);
244-
extern bool _Py_uop_sym_is_not_null(_Py_UopsSymbol *sym);
245-
extern bool _Py_uop_sym_is_const(_Py_UopsSymbol *sym);
246-
extern PyObject *_Py_uop_sym_get_const(_Py_UopsSymbol *sym);
247-
extern _Py_UopsSymbol *_Py_uop_sym_new_unknown(_Py_UOpsContext *ctx);
248-
extern _Py_UopsSymbol *_Py_uop_sym_new_not_null(_Py_UOpsContext *ctx);
249-
extern _Py_UopsSymbol *_Py_uop_sym_new_type(
250-
_Py_UOpsContext *ctx, PyTypeObject *typ);
251-
extern _Py_UopsSymbol *_Py_uop_sym_new_const(_Py_UOpsContext *ctx, PyObject *const_val);
252-
extern _Py_UopsSymbol *_Py_uop_sym_new_null(_Py_UOpsContext *ctx);
253-
extern bool _Py_uop_sym_has_type(_Py_UopsSymbol *sym);
254-
extern bool _Py_uop_sym_matches_type(_Py_UopsSymbol *sym, PyTypeObject *typ);
255-
extern bool _Py_uop_sym_matches_type_version(_Py_UopsSymbol *sym, unsigned int version);
256-
extern void _Py_uop_sym_set_null(_Py_UOpsContext *ctx, _Py_UopsSymbol *sym);
257-
extern void _Py_uop_sym_set_non_null(_Py_UOpsContext *ctx, _Py_UopsSymbol *sym);
258-
extern void _Py_uop_sym_set_type(_Py_UOpsContext *ctx, _Py_UopsSymbol *sym, PyTypeObject *typ);
259-
extern bool _Py_uop_sym_set_type_version(_Py_UOpsContext *ctx, _Py_UopsSymbol *sym, unsigned int version);
260-
extern void _Py_uop_sym_set_const(_Py_UOpsContext *ctx, _Py_UopsSymbol *sym, PyObject *const_val);
261-
extern bool _Py_uop_sym_is_bottom(_Py_UopsSymbol *sym);
262-
extern int _Py_uop_sym_truthiness(_Py_UopsSymbol *sym);
263-
extern PyTypeObject *_Py_uop_sym_get_type(_Py_UopsSymbol *sym);
264-
265-
266-
extern void _Py_uop_abstractcontext_init(_Py_UOpsContext *ctx);
267-
extern void _Py_uop_abstractcontext_fini(_Py_UOpsContext *ctx);
272+
JitOptSymbol **n_consumed;
273+
JitOptSymbol **limit;
274+
JitOptSymbol *locals_and_stack[MAX_ABSTRACT_INTERP_SIZE];
275+
} JitOptContext;
276+
277+
extern bool _Py_uop_sym_is_null(JitOptSymbol *sym);
278+
extern bool _Py_uop_sym_is_not_null(JitOptSymbol *sym);
279+
extern bool _Py_uop_sym_is_const(JitOptSymbol *sym);
280+
extern PyObject *_Py_uop_sym_get_const(JitOptSymbol *sym);
281+
extern JitOptSymbol *_Py_uop_sym_new_unknown(JitOptContext *ctx);
282+
extern JitOptSymbol *_Py_uop_sym_new_not_null(JitOptContext *ctx);
283+
extern JitOptSymbol *_Py_uop_sym_new_type(
284+
JitOptContext *ctx, PyTypeObject *typ);
285+
extern JitOptSymbol *_Py_uop_sym_new_const(JitOptContext *ctx, PyObject *const_val);
286+
extern JitOptSymbol *_Py_uop_sym_new_null(JitOptContext *ctx);
287+
extern bool _Py_uop_sym_has_type(JitOptSymbol *sym);
288+
extern bool _Py_uop_sym_matches_type(JitOptSymbol *sym, PyTypeObject *typ);
289+
extern bool _Py_uop_sym_matches_type_version(JitOptSymbol *sym, unsigned int version);
290+
extern void _Py_uop_sym_set_null(JitOptContext *ctx, JitOptSymbol *sym);
291+
extern void _Py_uop_sym_set_non_null(JitOptContext *ctx, JitOptSymbol *sym);
292+
extern void _Py_uop_sym_set_type(JitOptContext *ctx, JitOptSymbol *sym, PyTypeObject *typ);
293+
extern bool _Py_uop_sym_set_type_version(JitOptContext *ctx, JitOptSymbol *sym, unsigned int version);
294+
extern void _Py_uop_sym_set_const(JitOptContext *ctx, JitOptSymbol *sym, PyObject *const_val);
295+
extern bool _Py_uop_sym_is_bottom(JitOptSymbol *sym);
296+
extern int _Py_uop_sym_truthiness(JitOptSymbol *sym);
297+
extern PyTypeObject *_Py_uop_sym_get_type(JitOptSymbol *sym);
298+
299+
300+
extern void _Py_uop_abstractcontext_init(JitOptContext *ctx);
301+
extern void _Py_uop_abstractcontext_fini(JitOptContext *ctx);
268302

269303
extern _Py_UOpsAbstractFrame *_Py_uop_frame_new(
270-
_Py_UOpsContext *ctx,
304+
JitOptContext *ctx,
271305
PyCodeObject *co,
272306
int curr_stackentries,
273-
_Py_UopsSymbol **args,
307+
JitOptSymbol **args,
274308
int arg_len);
275-
extern int _Py_uop_frame_pop(_Py_UOpsContext *ctx);
309+
extern int _Py_uop_frame_pop(JitOptContext *ctx);
276310

277311
PyAPI_FUNC(PyObject *) _Py_uop_symbols_test(PyObject *self, PyObject *ignored);
278312

Lib/test/test_generated_cases.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,16 +1842,16 @@ def test_overridden_abstract_args(self):
18421842
"""
18431843
output = """
18441844
case OP: {
1845-
_Py_UopsSymbol *arg1;
1846-
_Py_UopsSymbol *out;
1845+
JitOptSymbol *arg1;
1846+
JitOptSymbol *out;
18471847
arg1 = stack_pointer[-1];
18481848
out = EGGS(arg1);
18491849
stack_pointer[-1] = out;
18501850
break;
18511851
}
18521852
18531853
case OP2: {
1854-
_Py_UopsSymbol *out;
1854+
JitOptSymbol *out;
18551855
out = sym_new_not_null(ctx);
18561856
stack_pointer[-1] = out;
18571857
break;
@@ -1876,14 +1876,14 @@ def test_no_overridden_case(self):
18761876
"""
18771877
output = """
18781878
case OP: {
1879-
_Py_UopsSymbol *out;
1879+
JitOptSymbol *out;
18801880
out = sym_new_not_null(ctx);
18811881
stack_pointer[-1] = out;
18821882
break;
18831883
}
18841884
18851885
case OP2: {
1886-
_Py_UopsSymbol *out;
1886+
JitOptSymbol *out;
18871887
out = NULL;
18881888
stack_pointer[-1] = out;
18891889
break;

Modules/_testinternalcapi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
#include "pycore_interp.h" // _PyInterpreterState_GetConfigCopy()
2929
#include "pycore_long.h" // _PyLong_Sign()
3030
#include "pycore_object.h" // _PyObject_IsFreed()
31-
#include "pycore_optimizer.h" // _Py_UopsSymbol, etc.
31+
#include "pycore_optimizer.h" // JitOptSymbol, etc.
3232
#include "pycore_pathconfig.h" // _PyPathConfig_ClearGlobal()
3333
#include "pycore_pyerrors.h" // _PyErr_ChainExceptions1()
3434
#include "pycore_pylifecycle.h" // _PyInterpreterConfig_AsDict()

Python/optimizer_analysis.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -372,9 +372,9 @@ remove_globals(_PyInterpreterFrame *frame, _PyUOpInstruction *buffer,
372372
static int
373373
optimize_to_bool(
374374
_PyUOpInstruction *this_instr,
375-
_Py_UOpsContext *ctx,
376-
_Py_UopsSymbol *value,
377-
_Py_UopsSymbol **result_ptr)
375+
JitOptContext *ctx,
376+
JitOptSymbol *value,
377+
JitOptSymbol **result_ptr)
378378
{
379379
if (sym_matches_type(value, &PyBool_Type)) {
380380
REPLACE_OP(this_instr, _NOP, 0, 0);
@@ -460,8 +460,8 @@ optimize_uops(
460460
)
461461
{
462462

463-
_Py_UOpsContext context;
464-
_Py_UOpsContext *ctx = &context;
463+
JitOptContext context;
464+
JitOptContext *ctx = &context;
465465
uint32_t opcode = UINT16_MAX;
466466
int curr_space = 0;
467467
int max_space = 0;
@@ -486,7 +486,7 @@ optimize_uops(
486486

487487
int oparg = this_instr->oparg;
488488
opcode = this_instr->opcode;
489-
_Py_UopsSymbol **stack_pointer = ctx->frame->stack_pointer;
489+
JitOptSymbol **stack_pointer = ctx->frame->stack_pointer;
490490

491491
#ifdef Py_DEBUG
492492
if (get_lltrace() >= 3) {

Python/optimizer_bytecodes.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66

77
#define op(name, ...) /* NAME is ignored */
88

9-
typedef struct _Py_UopsSymbol _Py_UopsSymbol;
10-
typedef struct _Py_UOpsContext _Py_UOpsContext;
119
typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame;
1210

1311
/* Shortened forms for convenience */
@@ -36,9 +34,9 @@ typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame;
3634
extern int
3735
optimize_to_bool(
3836
_PyUOpInstruction *this_instr,
39-
_Py_UOpsContext *ctx,
40-
_Py_UopsSymbol *value,
41-
_Py_UopsSymbol **result_ptr);
37+
JitOptContext *ctx,
38+
JitOptSymbol *value,
39+
JitOptSymbol **result_ptr);
4240

4341
extern void
4442
eliminate_pop_guard(_PyUOpInstruction *this_instr, bool exit);
@@ -50,17 +48,17 @@ dummy_func(void) {
5048

5149
PyCodeObject *co;
5250
int oparg;
53-
_Py_UopsSymbol *flag;
54-
_Py_UopsSymbol *left;
55-
_Py_UopsSymbol *right;
56-
_Py_UopsSymbol *value;
57-
_Py_UopsSymbol *res;
58-
_Py_UopsSymbol *iter;
59-
_Py_UopsSymbol *top;
60-
_Py_UopsSymbol *bottom;
51+
JitOptSymbol *flag;
52+
JitOptSymbol *left;
53+
JitOptSymbol *right;
54+
JitOptSymbol *value;
55+
JitOptSymbol *res;
56+
JitOptSymbol *iter;
57+
JitOptSymbol *top;
58+
JitOptSymbol *bottom;
6159
_Py_UOpsAbstractFrame *frame;
6260
_Py_UOpsAbstractFrame *new_frame;
63-
_Py_UOpsContext *ctx;
61+
JitOptContext *ctx;
6462
_PyUOpInstruction *this_instr;
6563
_PyBloomFilter *dependencies;
6664
int modified;
@@ -85,7 +83,7 @@ dummy_func(void) {
8583

8684
op(_LOAD_FAST_AND_CLEAR, (-- value)) {
8785
value = GETLOCAL(oparg);
88-
_Py_UopsSymbol *temp = sym_new_null(ctx);
86+
JitOptSymbol *temp = sym_new_null(ctx);
8987
GETLOCAL(oparg) = temp;
9088
}
9189

@@ -365,7 +363,7 @@ dummy_func(void) {
365363
}
366364

367365
op(_BINARY_OP_INPLACE_ADD_UNICODE, (left, right -- )) {
368-
_Py_UopsSymbol *res;
366+
JitOptSymbol *res;
369367
if (sym_is_const(left) && sym_is_const(right) &&
370368
sym_matches_type(left, &PyUnicode_Type) && sym_matches_type(right, &PyUnicode_Type)) {
371369
PyObject *temp = PyUnicode_Concat(sym_get_const(left), sym_get_const(right));

0 commit comments

Comments
 (0)