mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
GH-115685: Split _TO_BOOL_ALWAYS_TRUE
into micro-ops (GH-116352)
This commit is contained in:
parent
0c81ce1360
commit
23db9c6227
8 changed files with 50 additions and 44 deletions
|
@ -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();
|
||||
|
|
7
Python/executor_cases.c.h
generated
7
Python/executor_cases.c.h
generated
|
@ -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;
|
||||
|
|
23
Python/generated_cases.c.h
generated
23
Python/generated_cases.c.h
generated
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
2
Python/optimizer_cases.c.h
generated
2
Python/optimizer_cases.c.h
generated
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue