gh-148211: refactor bool to explicit uops in JIT (GH-148258)

This commit is contained in:
Neko Asakura 2026-04-09 13:20:31 +08:00 committed by GitHub
parent efde4333bf
commit b5ccf00bd6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 64 additions and 57 deletions

View file

@ -155,7 +155,8 @@ type_watcher_callback(PyTypeObject* type)
}
static PyObject *
convert_global_to_const(_PyUOpInstruction *inst, PyObject *obj, bool insert)
convert_global_to_const(_PyUOpInstruction *inst, PyObject *obj,
uint16_t immortal_op, uint16_t mortal_op)
{
assert(inst->opcode == _LOAD_GLOBAL_MODULE || inst->opcode == _LOAD_GLOBAL_BUILTINS || inst->opcode == _LOAD_ATTR_MODULE);
assert(PyDict_CheckExact(obj));
@ -175,18 +176,12 @@ convert_global_to_const(_PyUOpInstruction *inst, PyObject *obj, bool insert)
if (res == NULL) {
return NULL;
}
if (insert) {
if (_Py_IsImmortal(res)) {
inst->opcode = _INSERT_1_LOAD_CONST_INLINE_BORROW;
} else {
inst->opcode = _INSERT_1_LOAD_CONST_INLINE;
}
if (_Py_IsImmortal(res)) {
inst->opcode = immortal_op;
} else {
if (_Py_IsImmortal(res)) {
inst->opcode = _LOAD_CONST_INLINE_BORROW;
} else {
inst->opcode = _LOAD_CONST_INLINE;
}
inst->opcode = mortal_op;
}
if (inst->opcode == _LOAD_CONST_INLINE_BORROW || inst->opcode == _LOAD_CONST_INLINE) {
if (inst->oparg & 1) {
assert(inst[1].opcode == _PUSH_NULL_CONDITIONAL);
assert(inst[1].oparg & 1);
@ -330,7 +325,7 @@ optimize_to_bool(
JitOptContext *ctx,
JitOptRef value,
JitOptRef *result_ptr,
bool insert_mode)
uint16_t prefix, uint16_t load_op)
{
if (sym_matches_type(value, &PyBool_Type)) {
ADD_OP(_NOP, 0, 0);
@ -340,12 +335,10 @@ optimize_to_bool(
int truthiness = sym_truthiness(ctx, value);
if (truthiness >= 0) {
PyObject *load = truthiness ? Py_True : Py_False;
if (insert_mode) {
ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)load);
} else {
ADD_OP(_POP_TOP, 0, 0);
ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)load);
if (prefix != _NOP) {
ADD_OP(prefix, 0, 0);
}
ADD_OP(load_op, 0, (uintptr_t)load);
*result_ptr = sym_new_const(ctx, load);
return 1;
}
@ -391,22 +384,18 @@ eliminate_pop_guard(_PyUOpInstruction *this_instr, JitOptContext *ctx, bool exit
static JitOptRef
lookup_attr(JitOptContext *ctx, _PyBloomFilter *dependencies, _PyUOpInstruction *this_instr,
PyTypeObject *type, PyObject *name, bool pop)
PyTypeObject *type, PyObject *name,
uint16_t prefix, uint16_t immortal_op, uint16_t mortal_op)
{
// The cached value may be dead, so we need to do the lookup again... :(
if (type && PyType_Check(type)) {
PyObject *lookup = _PyType_Lookup(type, name);
if (lookup) {
bool immortal = _Py_IsImmortal(lookup) || (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE);
if (pop) {
ADD_OP(_POP_TOP, 0, 0);
ADD_OP(immortal ? _LOAD_CONST_INLINE_BORROW : _LOAD_CONST_INLINE,
0, (uintptr_t)lookup);
}
else {
ADD_OP(immortal ? _INSERT_1_LOAD_CONST_INLINE_BORROW : _INSERT_1_LOAD_CONST_INLINE,
0, (uintptr_t)lookup);
if (prefix != _NOP) {
ADD_OP(prefix, 0, 0);
}
ADD_OP(immortal ? immortal_op : mortal_op, 0, (uintptr_t)lookup);
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
_Py_BloomFilter_Add(dependencies, type);
return sym_new_const(ctx, lookup);