mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
GH-130415: Improve the JIT's unneeded uop removal pass (GH-132333)
This commit is contained in:
parent
9be3645688
commit
4f7f72ce34
5 changed files with 46 additions and 18 deletions
|
@ -555,28 +555,47 @@ remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size)
|
|||
}
|
||||
break;
|
||||
case _POP_TOP:
|
||||
case _POP_TOP_LOAD_CONST_INLINE:
|
||||
case _POP_TOP_LOAD_CONST_INLINE_BORROW:
|
||||
case _POP_TWO_LOAD_CONST_INLINE_BORROW:
|
||||
optimize_pop_top_again:
|
||||
{
|
||||
_PyUOpInstruction *last = &buffer[pc-1];
|
||||
while (last->opcode == _NOP) {
|
||||
last--;
|
||||
}
|
||||
if (last->opcode == _LOAD_CONST_INLINE ||
|
||||
last->opcode == _LOAD_CONST_INLINE_BORROW ||
|
||||
last->opcode == _LOAD_FAST ||
|
||||
last->opcode == _LOAD_FAST_BORROW ||
|
||||
last->opcode == _COPY
|
||||
) {
|
||||
last->opcode = _NOP;
|
||||
buffer[pc].opcode = _NOP;
|
||||
switch (last->opcode) {
|
||||
case _POP_TWO_LOAD_CONST_INLINE_BORROW:
|
||||
last->opcode = _POP_TOP;
|
||||
break;
|
||||
case _POP_TOP_LOAD_CONST_INLINE:
|
||||
case _POP_TOP_LOAD_CONST_INLINE_BORROW:
|
||||
last->opcode = _NOP;
|
||||
goto optimize_pop_top_again;
|
||||
case _COPY:
|
||||
case _LOAD_CONST_INLINE:
|
||||
case _LOAD_CONST_INLINE_BORROW:
|
||||
case _LOAD_FAST:
|
||||
case _LOAD_FAST_BORROW:
|
||||
case _LOAD_SMALL_INT:
|
||||
last->opcode = _NOP;
|
||||
if (opcode == _POP_TOP) {
|
||||
opcode = buffer[pc].opcode = _NOP;
|
||||
}
|
||||
else if (opcode == _POP_TOP_LOAD_CONST_INLINE) {
|
||||
opcode = buffer[pc].opcode = _LOAD_CONST_INLINE;
|
||||
}
|
||||
else if (opcode == _POP_TOP_LOAD_CONST_INLINE_BORROW) {
|
||||
opcode = buffer[pc].opcode = _LOAD_CONST_INLINE_BORROW;
|
||||
}
|
||||
else {
|
||||
assert(opcode == _POP_TWO_LOAD_CONST_INLINE_BORROW);
|
||||
opcode = buffer[pc].opcode = _POP_TOP_LOAD_CONST_INLINE_BORROW;
|
||||
goto optimize_pop_top_again;
|
||||
}
|
||||
}
|
||||
if (last->opcode == _REPLACE_WITH_TRUE) {
|
||||
last->opcode = _NOP;
|
||||
}
|
||||
break;
|
||||
_Py_FALLTHROUGH;
|
||||
}
|
||||
case _JUMP_TO_TOP:
|
||||
case _EXIT_TRACE:
|
||||
return pc + 1;
|
||||
default:
|
||||
{
|
||||
/* _PUSH_FRAME doesn't escape or error, but it
|
||||
|
@ -591,7 +610,11 @@ remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size)
|
|||
buffer[last_set_ip].opcode = _SET_IP;
|
||||
last_set_ip = -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case _JUMP_TO_TOP:
|
||||
case _EXIT_TRACE:
|
||||
return pc + 1;
|
||||
}
|
||||
}
|
||||
Py_UNREACHABLE();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue