[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:
Carl Meyer 2023-05-19 12:04:04 -06:00 committed by GitHub
parent d78c3bcf6f
commit 667e4ece98
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 0 deletions

View file

@ -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];