aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/flowgraph.c
diff options
context:
space:
mode:
authorCarl Meyer <carl@oddbird.net>2023-05-09 11:02:14 -0600
committerGitHub <noreply@github.com>2023-05-09 11:02:14 -0600
commitc3b595e73efac59360d6dc869802abc752092460 (patch)
tree5095460e4d502af2688c132562b7d8570f33d7b0 /Python/flowgraph.c
parent0aeda297931820436a50b78f4f7f0597274b5df4 (diff)
downloadcpython-c3b595e73efac59360d6dc869802abc752092460.tar.gz
cpython-c3b595e73efac59360d6dc869802abc752092460.zip
gh-97933: (PEP 709) inline list/dict/set comprehensions (#101441)
Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
Diffstat (limited to 'Python/flowgraph.c')
-rw-r--r--Python/flowgraph.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/Python/flowgraph.c b/Python/flowgraph.c
index f79afb4c66c..7f790b79d28 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -1289,7 +1289,9 @@ swaptimize(basicblock *block, int *ix)
// - can't invoke arbitrary code (besides finalizers)
// - only touch the TOS (and pop it when finished)
#define SWAPPABLE(opcode) \
- ((opcode) == STORE_FAST || (opcode) == POP_TOP)
+ ((opcode) == STORE_FAST || \
+ (opcode) == STORE_FAST_MAYBE_NULL || \
+ (opcode) == POP_TOP)
static int
next_swappable_instruction(basicblock *block, int i, int lineno)
@@ -1600,6 +1602,8 @@ scan_block_for_locals(basicblock *b, basicblock ***sp)
uint64_t bit = (uint64_t)1 << instr->i_oparg;
switch (instr->i_opcode) {
case DELETE_FAST:
+ case LOAD_FAST_AND_CLEAR:
+ case STORE_FAST_MAYBE_NULL:
unsafe_mask |= bit;
break;
case STORE_FAST:
@@ -1639,7 +1643,8 @@ fast_scan_many_locals(basicblock *entryblock, int nlocals)
Py_ssize_t blocknum = 0;
// state[i - 64] == blocknum if local i is guaranteed to
// be initialized, i.e., if it has had a previous LOAD_FAST or
- // STORE_FAST within that basicblock (not followed by DELETE_FAST).
+ // STORE_FAST within that basicblock (not followed by
+ // DELETE_FAST/LOAD_FAST_AND_CLEAR/STORE_FAST_MAYBE_NULL).
for (basicblock *b = entryblock; b != NULL; b = b->b_next) {
blocknum++;
for (int i = 0; i < b->b_iused; i++) {
@@ -1653,6 +1658,8 @@ fast_scan_many_locals(basicblock *entryblock, int nlocals)
assert(arg >= 0);
switch (instr->i_opcode) {
case DELETE_FAST:
+ case LOAD_FAST_AND_CLEAR:
+ case STORE_FAST_MAYBE_NULL:
states[arg - 64] = blocknum - 1;
break;
case STORE_FAST:
@@ -1975,7 +1982,7 @@ push_cold_blocks_to_end(cfg_builder *g, int code_flags) {
}
void
-_PyCfg_ConvertExceptionHandlersToNops(basicblock *entryblock)
+_PyCfg_ConvertPseudoOps(basicblock *entryblock)
{
for (basicblock *b = entryblock; b != NULL; b = b->b_next) {
for (int i = 0; i < b->b_iused; i++) {
@@ -1983,6 +1990,9 @@ _PyCfg_ConvertExceptionHandlersToNops(basicblock *entryblock)
if (is_block_push(instr) || instr->i_opcode == POP_BLOCK) {
INSTR_SET_OP0(instr, NOP);
}
+ else if (instr->i_opcode == STORE_FAST_MAYBE_NULL) {
+ instr->i_opcode = STORE_FAST;
+ }
}
}
for (basicblock *b = entryblock; b != NULL; b = b->b_next) {