mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-106149: move unconditional jump direction resolution from optimizer to assembler (#106291)
This commit is contained in:
parent
d3abc9b516
commit
200f255411
4 changed files with 44 additions and 20 deletions
|
@ -393,24 +393,17 @@ no_redundant_jumps(cfg_builder *g) {
|
|||
static int
|
||||
normalize_jumps_in_block(cfg_builder *g, basicblock *b) {
|
||||
cfg_instr *last = _PyCfg_BasicblockLastInstr(b);
|
||||
if (last == NULL || !is_jump(last)) {
|
||||
if (last == NULL || !is_jump(last) ||
|
||||
IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode)) {
|
||||
return SUCCESS;
|
||||
}
|
||||
assert(!IS_ASSEMBLER_OPCODE(last->i_opcode));
|
||||
|
||||
bool is_forward = last->i_target->b_visited == 0;
|
||||
switch(last->i_opcode) {
|
||||
case JUMP:
|
||||
assert(SAME_OPCODE_METADATA(JUMP, JUMP_FORWARD));
|
||||
assert(SAME_OPCODE_METADATA(JUMP, JUMP_BACKWARD));
|
||||
last->i_opcode = is_forward ? JUMP_FORWARD : JUMP_BACKWARD;
|
||||
return SUCCESS;
|
||||
case JUMP_NO_INTERRUPT:
|
||||
assert(SAME_OPCODE_METADATA(JUMP_NO_INTERRUPT, JUMP_FORWARD));
|
||||
assert(SAME_OPCODE_METADATA(JUMP_NO_INTERRUPT, JUMP_BACKWARD_NO_INTERRUPT));
|
||||
last->i_opcode = is_forward ?
|
||||
JUMP_FORWARD : JUMP_BACKWARD_NO_INTERRUPT;
|
||||
return SUCCESS;
|
||||
if (is_forward) {
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
int reversed_opcode = 0;
|
||||
switch(last->i_opcode) {
|
||||
case POP_JUMP_IF_NOT_NONE:
|
||||
|
@ -426,9 +419,6 @@ normalize_jumps_in_block(cfg_builder *g, basicblock *b) {
|
|||
reversed_opcode = POP_JUMP_IF_FALSE;
|
||||
break;
|
||||
}
|
||||
if (is_forward) {
|
||||
return SUCCESS;
|
||||
}
|
||||
/* transform 'conditional jump T' to
|
||||
* 'reversed_jump b_next' followed by 'jump_backwards T'
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue