-
-
Notifications
You must be signed in to change notification settings - Fork 31.9k
GH-115816: Make tier2 optimizer symbols testable, and add a few tests. #115953
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
63d087c
bc4583c
11b0e43
b10960f
62c544e
2b3a72b
c656141
694d7aa
7e054bc
91ad8ab
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
|
@@ -9,6 +9,7 @@ extern "C" { | |||||||
#endif | ||||||||
|
||||||||
#include "pycore_uop_ids.h" | ||||||||
#include <stdbool.h> | ||||||||
|
||||||||
// This is the length of the trace we project initially. | ||||||||
#define UOP_MAX_TRACE_LENGTH 512 | ||||||||
|
@@ -25,6 +26,90 @@ extern PyTypeObject _PyDefaultOptimizer_Type; | |||||||
extern PyTypeObject _PyUOpExecutor_Type; | ||||||||
extern PyTypeObject _PyUOpOptimizer_Type; | ||||||||
|
||||||||
/* Symbols */ | ||||||||
|
||||||||
struct _Py_UOpsSymType { | ||||||||
int flags; | ||||||||
PyTypeObject *typ; | ||||||||
// constant propagated value (might be NULL) | ||||||||
PyObject *const_val; | ||||||||
Comment on lines
+33
to
+35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd rename these to |
||||||||
}; | ||||||||
|
||||||||
// Holds locals, stack, locals, stack ... co_consts (in that order) | ||||||||
#define MAX_ABSTRACT_INTERP_SIZE 4096 | ||||||||
|
||||||||
#define OVERALLOCATE_FACTOR 5 | ||||||||
|
||||||||
#define TY_ARENA_SIZE (UOP_MAX_TRACE_LENGTH * OVERALLOCATE_FACTOR) | ||||||||
Comment on lines
+41
to
+43
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd just "inline" |
||||||||
|
||||||||
// Need extras for root frame and for overflow frame (see TRACE_STACK_PUSH()) | ||||||||
#define MAX_ABSTRACT_FRAME_DEPTH (TRACE_STACK_SIZE + 2) | ||||||||
|
||||||||
typedef struct _Py_UOpsSymType _Py_UOpsSymType; | ||||||||
|
||||||||
struct _Py_UOpsAbstractFrame { | ||||||||
// Max stacklen | ||||||||
int stack_len; | ||||||||
int locals_len; | ||||||||
|
||||||||
_Py_UOpsSymType **stack_pointer; | ||||||||
_Py_UOpsSymType **stack; | ||||||||
_Py_UOpsSymType **locals; | ||||||||
}; | ||||||||
|
||||||||
typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame; | ||||||||
|
||||||||
typedef struct ty_arena { | ||||||||
int ty_curr_number; | ||||||||
int ty_max_number; | ||||||||
_Py_UOpsSymType arena[TY_ARENA_SIZE]; | ||||||||
} ty_arena; | ||||||||
Comment on lines
+62
to
+66
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The naming of this struct, type, and its members could use some improvements. |
||||||||
|
||||||||
struct _Py_UOpsAbstractInterpContext { | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe just |
||||||||
PyObject_HEAD | ||||||||
// The current "executing" frame. | ||||||||
_Py_UOpsAbstractFrame *frame; | ||||||||
_Py_UOpsAbstractFrame frames[MAX_ABSTRACT_FRAME_DEPTH]; | ||||||||
int curr_frame_depth; | ||||||||
|
||||||||
// Arena for the symbolic types. | ||||||||
ty_arena t_arena; | ||||||||
|
||||||||
_Py_UOpsSymType **n_consumed; | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This name is misleading ( |
||||||||
_Py_UOpsSymType **limit; | ||||||||
_Py_UOpsSymType *locals_and_stack[MAX_ABSTRACT_INTERP_SIZE]; | ||||||||
}; | ||||||||
|
||||||||
typedef struct _Py_UOpsAbstractInterpContext _Py_UOpsAbstractInterpContext; | ||||||||
|
||||||||
extern bool _Py_uop_sym_is_null(_Py_UOpsSymType *sym); | ||||||||
extern bool _Py_uop_sym_is_not_null(_Py_UOpsSymType *sym); | ||||||||
extern bool _Py_uop_sym_is_const(_Py_UOpsSymType *sym); | ||||||||
extern PyObject *_Py_uop_sym_get_const(_Py_UOpsSymType *sym); | ||||||||
extern _Py_UOpsSymType *_Py_uop_sym_new_unknown(_Py_UOpsAbstractInterpContext *ctx); | ||||||||
extern _Py_UOpsSymType *_Py_uop_sym_new_not_null(_Py_UOpsAbstractInterpContext *ctx); | ||||||||
extern _Py_UOpsSymType *_Py_uop_sym_new_type( | ||||||||
_Py_UOpsAbstractInterpContext *ctx, PyTypeObject *typ); | ||||||||
extern _Py_UOpsSymType *_Py_uop_sym_new_const(_Py_UOpsAbstractInterpContext *ctx, PyObject *const_val); | ||||||||
extern _Py_UOpsSymType *_Py_uop_sym_new_null(_Py_UOpsAbstractInterpContext *ctx); | ||||||||
extern bool _Py_uop_sym_matches_type(_Py_UOpsSymType *sym, PyTypeObject *typ); | ||||||||
extern void _Py_uop_sym_set_null(_Py_UOpsSymType *sym); | ||||||||
extern void _Py_uop_sym_set_type(_Py_UOpsSymType *sym, PyTypeObject *tp); | ||||||||
|
||||||||
extern int _Py_uop_abstractcontext_init(_Py_UOpsAbstractInterpContext *ctx); | ||||||||
extern void _Py_uop_abstractcontext_fini(_Py_UOpsAbstractInterpContext *ctx); | ||||||||
|
||||||||
extern _Py_UOpsAbstractFrame *_Py_uop_ctx_frame_new( | ||||||||
_Py_UOpsAbstractInterpContext *ctx, | ||||||||
PyCodeObject *co, | ||||||||
_Py_UOpsSymType **localsplus_start, | ||||||||
int n_locals_already_filled, | ||||||||
int curr_stackentries); | ||||||||
extern int _Py_uop_ctx_frame_pop(_Py_UOpsAbstractInterpContext *ctx); | ||||||||
|
||||||||
PyAPI_FUNC(PyObject *) | ||||||||
_Py_uop_symbols_test(PyObject *self, PyObject *ignored); | ||||||||
Comment on lines
+110
to
+111
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. One line:
Suggested change
|
||||||||
|
||||||||
#ifdef __cplusplus | ||||||||
} | ||||||||
#endif | ||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My personal preference would be to name this
_Py_UopsSymbol
.