Skip to content

Commit 8b19379

Browse files
committed
Add immortality test to symbols
1 parent 56149ae commit 8b19379

File tree

4 files changed

+19
-1
lines changed

4 files changed

+19
-1
lines changed

Include/internal/pycore_optimizer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ extern void _Py_uop_sym_set_const(JitOptContext *ctx, JitOptSymbol *sym, PyObjec
289289
extern bool _Py_uop_sym_is_bottom(JitOptSymbol *sym);
290290
extern int _Py_uop_sym_truthiness(JitOptSymbol *sym);
291291
extern PyTypeObject *_Py_uop_sym_get_type(JitOptSymbol *sym);
292-
292+
extern bool _Py_uop_sym_is_immortal(JitOptSymbol *sym);
293293
extern JitOptSymbol *_Py_uop_sym_new_tuple(JitOptContext *ctx, int size, JitOptSymbol **args);
294294
extern JitOptSymbol *_Py_uop_sym_tuple_getitem(JitOptContext *ctx, JitOptSymbol *sym, int item);
295295
extern int _Py_uop_sym_tuple_length(JitOptSymbol *sym);

Python/optimizer_analysis.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ remove_globals(_PyInterpreterFrame *frame, _PyUOpInstruction *buffer,
371371
#define sym_new_tuple _Py_uop_sym_new_tuple
372372
#define sym_tuple_getitem _Py_uop_sym_tuple_getitem
373373
#define sym_tuple_length _Py_uop_sym_tuple_length
374+
#define sym_is_immortal _Py_uop_sym_is_immortal
374375

375376
static int
376377
optimize_to_bool(

Python/optimizer_bytecodes.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame;
3333
#define sym_new_tuple _Py_uop_sym_new_tuple
3434
#define sym_tuple_getitem _Py_uop_sym_tuple_getitem
3535
#define sym_tuple_length _Py_uop_sym_tuple_length
36+
#define sym_is_immortal _Py_uop_sym_is_immortal
3637

3738
extern int
3839
optimize_to_bool(

Python/optimizer_symbols.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,18 @@ _Py_uop_sym_tuple_length(JitOptSymbol *sym)
493493
return -1;
494494
}
495495

496+
// Return true if known to be immortal.
497+
bool
498+
_Py_uop_sym_is_immortal(JitOptSymbol *sym)
499+
{
500+
if (sym->tag == JIT_SYM_KNOWN_VALUE_TAG) {
501+
return _Py_IsImmortal(sym->value.value);
502+
}
503+
if (sym->tag == JIT_SYM_KNOWN_CLASS_TAG) {
504+
return sym->cls.type == &PyBool_Type;
505+
}
506+
return false;
507+
}
496508

497509
// 0 on success, -1 on error.
498510
_Py_UOpsAbstractFrame *
@@ -675,6 +687,7 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
675687
TEST_PREDICATE(_Py_uop_sym_is_const(sym), "42 is not a constant");
676688
TEST_PREDICATE(_Py_uop_sym_get_const(sym) != NULL, "42 as constant is NULL");
677689
TEST_PREDICATE(_Py_uop_sym_get_const(sym) == val_42, "42 as constant isn't 42");
690+
TEST_PREDICATE(_Py_uop_sym_is_immortal(sym), "42 is not immortal");
678691

679692
_Py_uop_sym_set_type(ctx, sym, &PyLong_Type); // Should be a no-op
680693
TEST_PREDICATE(_Py_uop_sym_matches_type(sym, &PyLong_Type), "(42 and 42) isn't an int");
@@ -683,6 +696,9 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
683696
_Py_uop_sym_set_type(ctx, sym, &PyFloat_Type); // Should make it bottom
684697
TEST_PREDICATE(_Py_uop_sym_is_bottom(sym), "(42 and float) isn't bottom");
685698

699+
sym = _Py_uop_sym_new_type(ctx, &PyBool_Type);
700+
TEST_PREDICATE(_Py_uop_sym_is_immortal(sym), "a bool is not immortal");
701+
686702
sym = _Py_uop_sym_new_type(ctx, &PyLong_Type);
687703
if (sym == NULL) {
688704
goto fail;

0 commit comments

Comments
 (0)