mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00
GH-111646: Simplify optimizer, by compacting uops when making executor. (GH-111647)
This commit is contained in:
parent
c8faa3568a
commit
d78c872e0d
2 changed files with 119 additions and 117 deletions
|
@ -13,13 +13,42 @@
|
|||
#include "pycore_optimizer.h"
|
||||
|
||||
|
||||
static void
|
||||
remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size)
|
||||
{
|
||||
// Note that we don't enter stubs, those SET_IPs are needed.
|
||||
int last_set_ip = -1;
|
||||
bool need_ip = true;
|
||||
for (int pc = 0; pc < buffer_size; pc++) {
|
||||
int opcode = buffer[pc].opcode;
|
||||
if (opcode == _SET_IP) {
|
||||
if (!need_ip && last_set_ip >= 0) {
|
||||
buffer[last_set_ip].opcode = NOP;
|
||||
}
|
||||
need_ip = false;
|
||||
last_set_ip = pc;
|
||||
}
|
||||
else if (opcode == _JUMP_TO_TOP || opcode == _EXIT_TRACE) {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
// If opcode has ERROR or DEOPT, set need_ip to true
|
||||
if (_PyOpcode_opcode_metadata[opcode].flags & (HAS_ERROR_FLAG | HAS_DEOPT_FLAG) || opcode == _PUSH_FRAME) {
|
||||
need_ip = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_Py_uop_analyze_and_optimize(
|
||||
PyCodeObject *co,
|
||||
_PyUOpInstruction *trace,
|
||||
int trace_len,
|
||||
_PyUOpInstruction *buffer,
|
||||
int buffer_size,
|
||||
int curr_stacklen
|
||||
)
|
||||
{
|
||||
return trace_len;
|
||||
remove_unneeded_uops(buffer, buffer_size);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue