mirror of
https://github.com/python/cpython.git
synced 2025-07-23 19:25:40 +00:00
[3.11] gh-104615: don't make unsafe swaps in apply_static_swaps (GH-104620). (#104636)
(cherry picked from commit 0589c6a4d3
)
This commit is contained in:
parent
d78c3bcf6f
commit
667e4ece98
3 changed files with 40 additions and 0 deletions
|
@ -8690,6 +8690,9 @@ swaptimize(basicblock *block, int *ix)
|
|||
#define SWAPPABLE(opcode) \
|
||||
((opcode) == STORE_FAST || (opcode) == POP_TOP)
|
||||
|
||||
#define STORES_TO(instr) \
|
||||
(((instr).i_opcode == STORE_FAST) ? (instr).i_oparg : -1)
|
||||
|
||||
static int
|
||||
next_swappable_instruction(basicblock *block, int i, int lineno)
|
||||
{
|
||||
|
@ -8741,6 +8744,23 @@ apply_static_swaps(basicblock *block, int i)
|
|||
return;
|
||||
}
|
||||
}
|
||||
// The reordering is not safe if the two instructions to be swapped
|
||||
// store to the same location, or if any intervening instruction stores
|
||||
// to the same location as either of them.
|
||||
int store_j = STORES_TO(block->b_instr[j]);
|
||||
int store_k = STORES_TO(block->b_instr[k]);
|
||||
if (store_j >= 0 || store_k >= 0) {
|
||||
if (store_j == store_k) {
|
||||
return;
|
||||
}
|
||||
for (int idx = j + 1; idx < k; idx++) {
|
||||
int store_idx = STORES_TO(block->b_instr[idx]);
|
||||
if (store_idx >= 0 && (store_idx == store_j || store_idx == store_k)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Success!
|
||||
swap->i_opcode = NOP;
|
||||
struct instr temp = block->b_instr[j];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue