Visitar URL original
Merge pull request #26 from JuliaPoo/type_propagator_improved · pylbbv/pylbbv@01721eb · GitHub
Skip to content

Commit 01721eb

Browse files
Merge pull request #26 from JuliaPoo/type_propagator_improved
Feat: Reference-based type propagator
2 parents 183d009 + 702ee98 commit 01721eb

6 files changed

Lines changed: 495 additions & 1209 deletions

File tree

‎Include/cpython/code.h‎

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,36 @@ typedef struct {
5656
PyObject *_co_freevars;
5757
} _PyCoCached;
5858

59+
// TYPENODE is a tagged pointer that uses the last 2 LSB as the tag
60+
#define _Py_TYPENODE_t uintptr_t
61+
62+
// TYPENODE Tags
63+
typedef enum _Py_TypeNodeTags {
64+
// Node is unused
65+
TYPE_NULL = 0,
66+
// TYPE_ROOT can point to a PyTypeObject or be a NULL
67+
TYPE_ROOT = 1,
68+
// TYPE_REF points to a TYPE_ROOT or a TYPE_REF
69+
TYPE_REF = 2
70+
} _Py_TypeNodeTags;
71+
72+
#define _Py_TYPENODE_GET_TAG(typenode) ((typenode) & (0b11))
73+
#define _Py_TYPENODE_CLEAR_TAG(typenode) ((typenode) & (~(uintptr_t)(0b11)))
74+
75+
#define _Py_TYPENODE_MAKE_ROOT(ptr) (_Py_TYPENODE_CLEAR_TAG(ptr) | TYPE_ROOT)
76+
#define _Py_TYPENODE_MAKE_REF(ptr) (_Py_TYPENODE_CLEAR_TAG(ptr) | TYPE_REF)
77+
78+
#define _Py_TYPENODE_NULL 0
79+
#define _Py_TYPENODE_NULLROOT _Py_TYPENODE_MAKE_ROOT(_Py_TYPENODE_NULL)
80+
5981
// Tier 2 types meta interpreter
6082
typedef struct _PyTier2TypeContext {
6183
// points into type_stack, points to one element after the stack
62-
PyTypeObject** type_stack_ptr;
84+
_Py_TYPENODE_t *type_stack_ptr;
6385
int type_locals_len;
6486
int type_stack_len;
65-
PyTypeObject** type_stack;
66-
PyTypeObject** type_locals;
87+
_Py_TYPENODE_t *type_stack;
88+
_Py_TYPENODE_t *type_locals;
6789
} _PyTier2TypeContext;
6890

6991
// Tier 2 interpreter information

‎Python/bytecodes.c‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,11 @@ dummy_func(
300300
DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dsum, sum);
301301
}
302302

303-
inst(BINARY_CHECK_FLOAT, (left, right -- left_unboxed : PyRawFloat_Type, right_unboxed : PyRawFloat_Type)) {
303+
inst(BINARY_CHECK_FLOAT, (
304+
left, right
305+
-- left_unboxed : {<<= PyFloat_Type, PyRawFloat_Type},
306+
right_unboxed: {<<= PyFloat_Type, PyRawFloat_Type})
307+
) {
304308
assert(cframe.use_tracing == 0);
305309
bb_test = PyFloat_CheckExact(left) && (Py_TYPE(left) == Py_TYPE(right));
306310
left_unboxed = (bb_test
@@ -338,7 +342,7 @@ dummy_func(
338342
U_INST(BINARY_OP_ADD_INT_REST);
339343
}
340344

341-
inst(BINARY_CHECK_INT, (left, right -- left : PyLong_Type, right : PyLong_Type)) {
345+
inst(BINARY_CHECK_INT, (left, right -- left : <<= PyLong_Type, right : <<= PyLong_Type)) {
342346
assert(cframe.use_tracing == 0);
343347
bb_test = PyLong_CheckExact(left) && (Py_TYPE(left) == Py_TYPE(right));
344348
}

0 commit comments

Comments
 (0)