-
-
Notifications
You must be signed in to change notification settings - Fork 30.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
compiler can incorrectly optimize a run of stores to the same name preceded by a SWAP #104615
Comments
I see two options for fixing this:
Probably the ideal is to do both; (2) because it results in the best compiler output, and (1) because it is more robust and avoids implicit dependency of one optimization on another. |
This is definitely a bug in 3.10: >>> def f(x, y):
... a, a = x, y
... return a
...
>>> f(True, False)
False 3.11: >>> def f(x, y):
... a, a = x, y
... return a
...
>>> f(True, False)
True |
I'm considering this issue fixed by the merged PR. I filed #104635 for the separate question of improving compiler output in these cases with dead store elimination. |
* main: pythongh-74690: Don't set special protocol attributes on non-protocol subclasses of protocols (python#104622) pythongh-104623: Update Windows installer to use SQLite 3.42.0 (python#104625) pythongh-104050: Add more type annotations to Argument Clinic (python#104628) pythongh-104629: Don't skip test_clinic if _testclinic is missing (python#104630) pythongh-104549: Set __module__ on TypeAliasType (python#104550) pythongh-104050: Improve some typing around `default`s and sentinel values (python#104626) pythongh-104146: Remove unused vars from Argument Clinic (python#104627) pythongh-104615: don't make unsafe swaps in apply_static_swaps (python#104620) pythonGH-104484: Add case_sensitive argument to `pathlib.PurePath.match()` (pythonGH-104565) pythonGH-96803: Document and test new unstable internal frame API functions (pythonGH-104211) pythonGH-104580: Don't cache eval breaker in interpreter (pythonGH-104581)
…pythonGH-104620). (cherry picked from commit 0589c6a) Co-authored-by: Carl Meyer <[email protected]>
If the
apply_static_swaps
optimization in the compiler sees the instruction sequenceSWAP 2; STORE_FAST a; STORE_FAST a
, it will optimize that by removing theSWAP
and swapping the two instructions, resulting inSTORE_FAST a; STORE_FAST a
.But of course, in this case the two instructions are identical, and their ordering matters because they store to the same location. So this change results in the wrong value being stored to
a
.This was exposed by comprehension inlining, since it can result in this bytecode sequence for code in the form
a = [1 for a in [0]]
(where the firstSTORE_FAST a
is restoring the previous value ofa
from before the comprehension, if any, and the secondSTORE_FAST a
is storing the result of the comprehension toa
.).Linked PRs
The text was updated successfully, but these errors were encountered: