diff options
Diffstat (limited to 'Python')
-rw-r--r-- | Python/optimizer_analysis.c | 53 | ||||
-rw-r--r-- | Python/optimizer_bytecodes.c | 1 | ||||
-rw-r--r-- | Python/optimizer_cases.c.h | 1 |
3 files changed, 40 insertions, 15 deletions
diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c index ab28fae94a9..387ebc813ab 100644 --- a/Python/optimizer_analysis.c +++ b/Python/optimizer_analysis.c @@ -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; - } - if (last->opcode == _REPLACE_WITH_TRUE) { - last->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; + } } - 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(); diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index c5d8b536bc6..6f7f9b03d3b 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -912,6 +912,7 @@ dummy_func(void) { } op(_REPLACE_WITH_TRUE, (value -- res)) { + REPLACE_OP(this_instr, _POP_TOP_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); res = sym_new_const(ctx, Py_True); } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 828f0943a8d..983af081e2f 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -274,6 +274,7 @@ case _REPLACE_WITH_TRUE: { JitOptSymbol *res; + REPLACE_OP(this_instr, _POP_TOP_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); res = sym_new_const(ctx, Py_True); stack_pointer[-1] = res; break; |