-
-
Notifications
You must be signed in to change notification settings - Fork 31.7k
GH-132508: Use tagged integers on the evaluation stack for the last instruction offset #132545
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
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
2 comments
As expected, performance is neutral. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe the magic number needs to be updated (and everything regenerated too) since the exception_unwind
label now pushes tagged ints.
When you're done making the requested changes, leave the comment: |
Nothing has changed in terms of stack effects. The only change is that we push a tagged int instead of a boxed one. |
The failure on JIT/ARM64 look like a JIT bug. The assertion errors seem impossible and do not occur on any other platform. |
I think I've seen that JIT failure before on my old PR when I used a different tagging scheme. |
The JIT ARM 64 windows failure is just a timeout for the int repr test that sometimes happens. |
This isn't a JIT problem, it's a tier two problem (I can reproduce on an M2 Mac with |
When entering tier two, the current frame's |
Never mind, it looks like the bug is in the JIT code. I believe this is because the Clang is not actually inlining the some |
@markshannon, this fixes it: diff --git a/Tools/jit/_stencils.py b/Tools/jit/_stencils.py
index 8faa9e8cac2..639e4bcc793 100644
--- a/Tools/jit/_stencils.py
+++ b/Tools/jit/_stencils.py
@@ -291,6 +291,7 @@ def process_relocations(
hole.kind
in {"R_AARCH64_CALL26", "R_AARCH64_JUMP26", "ARM64_RELOC_BRANCH26"}
and hole.value is HoleValue.ZERO
+ and hole.symbol not in self.symbols
):
hole.func = "patch_aarch64_trampoline"
hole.need_state = True |
For anyone curious: on this particular build, Clang doesn't inline one of the calls to Though they both should be identical, my guess is that Clang realized that the function was static and only called in one place by the bytecode, and didn't use an ABI-conforming calling convention. If we change the logic to check for duplicate local symbols in the template before trying to link to the main executable (which is what my change does), then we end up calling the intended version of the function. (And, in case anyone was wondering: |
When reraising in a
finally
block, the exception needs to look as if it were raised from an earlier point in the code.To do this we save the earlier instruction offset as an integer on the evaluation stack.
Currently, this requires boxing the integer, which can (extremely rarely) fail.
By using a tagged integer we can avoid that failure mode.
This is might seem like an elaborate fix for a very minor issue, and it is, but we will want tagged integers/pointers for many other things and this is a nice small step to that larger change.
See #132509