mirror of
https://github.com/python/cpython
synced 2024-09-18 21:11:40 +00:00
Normalize jumps in compiler. All forward jumps to use JUMP_FORWARD. (GH-28755)
This commit is contained in:
parent
c379bc5ec9
commit
f6eafe18c0
|
@ -1046,7 +1046,7 @@ def _prepare_test_cases():
|
||||||
Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=34, starts_line=None, is_jump_target=False, positions=None),
|
Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=34, starts_line=None, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=21, argval=42, argrepr='to 42', offset=36, starts_line=None, is_jump_target=False, positions=None),
|
Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=21, argval=42, argrepr='to 42', offset=36, starts_line=None, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=38, starts_line=8, is_jump_target=False, positions=None),
|
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=38, starts_line=8, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=26, argval=52, argrepr='to 52', offset=40, starts_line=None, is_jump_target=False, positions=None),
|
Instruction(opname='JUMP_FORWARD', opcode=110, arg=5, argval=52, argrepr='to 52', offset=40, starts_line=None, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=4, argval=8, argrepr='to 8', offset=42, starts_line=7, is_jump_target=True, positions=None),
|
Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=4, argval=8, argrepr='to 8', offset=42, starts_line=7, is_jump_target=True, positions=None),
|
||||||
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=44, starts_line=10, is_jump_target=True, positions=None),
|
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=44, starts_line=10, is_jump_target=True, positions=None),
|
||||||
Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=46, starts_line=None, is_jump_target=False, positions=None),
|
Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=46, starts_line=None, is_jump_target=False, positions=None),
|
||||||
|
@ -1071,7 +1071,7 @@ def _prepare_test_cases():
|
||||||
Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=84, starts_line=None, is_jump_target=False, positions=None),
|
Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=84, starts_line=None, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=86, starts_line=None, is_jump_target=False, positions=None),
|
Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=86, starts_line=None, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=46, argval=92, argrepr='to 92', offset=88, starts_line=None, is_jump_target=False, positions=None),
|
Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=46, argval=92, argrepr='to 92', offset=88, starts_line=None, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=52, argval=104, argrepr='to 104', offset=90, starts_line=17, is_jump_target=False, positions=None),
|
Instruction(opname='JUMP_FORWARD', opcode=110, arg=6, argval=104, argrepr='to 104', offset=90, starts_line=17, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=92, starts_line=11, is_jump_target=True, positions=None),
|
Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=92, starts_line=11, is_jump_target=True, positions=None),
|
||||||
Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=28, argval=56, argrepr='to 56', offset=94, starts_line=None, is_jump_target=False, positions=None),
|
Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=28, argval=56, argrepr='to 56', offset=94, starts_line=None, is_jump_target=False, positions=None),
|
||||||
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=96, starts_line=19, is_jump_target=True, positions=None),
|
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=96, starts_line=19, is_jump_target=True, positions=None),
|
||||||
|
|
|
@ -4051,19 +4051,18 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
|
||||||
|
|
||||||
TARGET(JUMP_ABSOLUTE) {
|
TARGET(JUMP_ABSOLUTE) {
|
||||||
PREDICTED(JUMP_ABSOLUTE);
|
PREDICTED(JUMP_ABSOLUTE);
|
||||||
if (oparg < INSTR_OFFSET()) {
|
assert(oparg < INSTR_OFFSET());
|
||||||
/* Increment the warmup counter and quicken if warm enough
|
/* Increment the warmup counter and quicken if warm enough
|
||||||
* _Py_Quicken is idempotent so we don't worry about overflow */
|
* _Py_Quicken is idempotent so we don't worry about overflow */
|
||||||
if (!PyCodeObject_IsWarmedUp(co)) {
|
if (!PyCodeObject_IsWarmedUp(co)) {
|
||||||
PyCodeObject_IncrementWarmup(co);
|
PyCodeObject_IncrementWarmup(co);
|
||||||
if (PyCodeObject_IsWarmedUp(co)) {
|
if (PyCodeObject_IsWarmedUp(co)) {
|
||||||
if (_Py_Quicken(co)) {
|
if (_Py_Quicken(co)) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
|
||||||
int nexti = INSTR_OFFSET();
|
|
||||||
first_instr = co->co_firstinstr;
|
|
||||||
next_instr = first_instr + nexti;
|
|
||||||
}
|
}
|
||||||
|
int nexti = INSTR_OFFSET();
|
||||||
|
first_instr = co->co_firstinstr;
|
||||||
|
next_instr = first_instr + nexti;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
JUMPTO(oparg);
|
JUMPTO(oparg);
|
||||||
|
@ -4072,6 +4071,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
|
||||||
}
|
}
|
||||||
|
|
||||||
TARGET(JUMP_ABSOLUTE_QUICK) {
|
TARGET(JUMP_ABSOLUTE_QUICK) {
|
||||||
|
assert(oparg < INSTR_OFFSET());
|
||||||
JUMPTO(oparg);
|
JUMPTO(oparg);
|
||||||
CHECK_EVAL_BREAKER();
|
CHECK_EVAL_BREAKER();
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
|
|
|
@ -7220,6 +7220,26 @@ assemble_emit(struct assembler *a, struct instr *i)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
normalize_jumps(struct assembler *a)
|
||||||
|
{
|
||||||
|
for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
|
||||||
|
b->b_visited = 0;
|
||||||
|
}
|
||||||
|
for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
|
||||||
|
b->b_visited = 1;
|
||||||
|
if (b->b_iused == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
struct instr *last = &b->b_instr[b->b_iused-1];
|
||||||
|
if (last->i_opcode == JUMP_ABSOLUTE &&
|
||||||
|
last->i_target->b_visited == 0
|
||||||
|
) {
|
||||||
|
last->i_opcode = JUMP_FORWARD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
assemble_jump_offsets(struct assembler *a, struct compiler *c)
|
assemble_jump_offsets(struct assembler *a, struct compiler *c)
|
||||||
{
|
{
|
||||||
|
@ -7897,6 +7917,9 @@ assemble(struct compiler *c, int addNone)
|
||||||
clean_basic_block(b);
|
clean_basic_block(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Order of basic blocks must have been determined by now */
|
||||||
|
normalize_jumps(&a);
|
||||||
|
|
||||||
/* Can't modify the bytecode after computing jump offsets. */
|
/* Can't modify the bytecode after computing jump offsets. */
|
||||||
assemble_jump_offsets(&a, c);
|
assemble_jump_offsets(&a, c);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue