GH-115685: Split _TO_BOOL_ALWAYS_TRUE into micro-ops (GH-116352)

This commit is contained in:
Mark Shannon 2024-03-05 15:23:08 +00:00 committed by GitHub
parent 0c81ce1360
commit 23db9c6227
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 50 additions and 44 deletions

View file

@ -382,15 +382,16 @@ dummy_func(
}
}
inst(TO_BOOL_ALWAYS_TRUE, (unused/1, version/2, value -- res)) {
// This one is a bit weird, because we expect *some* failures:
assert(version);
EXIT_IF(Py_TYPE(value)->tp_version_tag != version);
STAT_INC(TO_BOOL, hit);
DECREF_INPUTS();
op(_REPLACE_WITH_TRUE, (value -- res)) {
Py_DECREF(value);
res = Py_True;
}
macro(TO_BOOL_ALWAYS_TRUE) =
unused/1 +
_GUARD_TYPE_VERSION +
_REPLACE_WITH_TRUE;
inst(UNARY_INVERT, (value -- res)) {
res = PyNumber_Invert(value);
DECREF_INPUTS();

View file

@ -383,15 +383,10 @@
break;
}
case _TO_BOOL_ALWAYS_TRUE: {
case _REPLACE_WITH_TRUE: {
PyObject *value;
PyObject *res;
value = stack_pointer[-1];
uint32_t version = (uint32_t)CURRENT_OPERAND();
// This one is a bit weird, because we expect *some* failures:
assert(version);
if (Py_TYPE(value)->tp_version_tag != version) goto side_exit;
STAT_INC(TO_BOOL, hit);
Py_DECREF(value);
res = Py_True;
stack_pointer[-1] = res;

View file

@ -5580,17 +5580,24 @@
next_instr += 4;
INSTRUCTION_STATS(TO_BOOL_ALWAYS_TRUE);
static_assert(INLINE_CACHE_ENTRIES_TO_BOOL == 3, "incorrect cache size");
PyObject *owner;
PyObject *value;
PyObject *res;
/* Skip 1 cache entry */
value = stack_pointer[-1];
uint32_t version = read_u32(&this_instr[2].cache);
// This one is a bit weird, because we expect *some* failures:
assert(version);
DEOPT_IF(Py_TYPE(value)->tp_version_tag != version, TO_BOOL);
STAT_INC(TO_BOOL, hit);
Py_DECREF(value);
res = Py_True;
// _GUARD_TYPE_VERSION
owner = stack_pointer[-1];
{
uint32_t type_version = read_u32(&this_instr[2].cache);
PyTypeObject *tp = Py_TYPE(owner);
assert(type_version != 0);
DEOPT_IF(tp->tp_version_tag != type_version, TO_BOOL);
}
// _REPLACE_WITH_TRUE
value = owner;
{
Py_DECREF(value);
res = Py_True;
}
stack_pointer[-1] = res;
DISPATCH();
}

View file

@ -456,6 +456,9 @@ remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size)
last->opcode = _NOP;
buffer[pc].opcode = NOP;
}
if (last->opcode == _REPLACE_WITH_TRUE) {
last->opcode = _NOP;
}
break;
}
case _JUMP_TO_TOP:

View file

@ -203,7 +203,7 @@
break;
}
case _TO_BOOL_ALWAYS_TRUE: {
case _REPLACE_WITH_TRUE: {
_Py_UopsSymbol *res;
res = sym_new_unknown(ctx);
if (res == NULL) goto out_of_space;