Uh oh!
There was an error while loading. Please reload this page.
GH-132508: Use tagged integers on the evaluation stack for the last instruction offset - #132545
Conversation
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
markshannon
commented
Apr 15, 2025
As expected, performance is neutral. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
brandtbucher
left a comment
There was a problem hiding this comment.
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: |
markshannon
commented
Apr 15, 2025
Nothing has changed in terms of stack effects. The only change is that we push a tagged int instead of a boxed one. |
markshannon
commented
Apr 16, 2025
The failure on JIT/ARM64 look like a JIT bug. The assertion errors seem impossible and do not occur on any other platform. |
Fidget-Spinner
commented
Apr 16, 2025
I think I've seen that JIT failure before on my old PR when I used a different tagging scheme. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
markshannon
commented
Apr 16, 2025
The JIT ARM 64 windows failure is just a timeout for the int repr test that sometimes happens. |
brandtbucher
commented
Apr 17, 2025
This isn't a JIT problem, it's a tier two problem (I can reproduce on an M2 Mac with |
brandtbucher
commented
Apr 17, 2025
When entering tier two, the current frame's |
brandtbucher
commented
Apr 18, 2025
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 |
brandtbucher
commented
Apr 18, 2025
@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 |
brandtbucher
commented
Apr 18, 2025
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: |
brandtbucher
commented
Apr 28, 2025
@markshannon, you applied my patch to the wrong line. |
Uh oh!
There was an error while loading. Please reload this page.
| PyObject *obj = _Py_stackref_get_object(ref); | ||
| Py_INCREF(obj); | ||
| return _Py_stackref_create(obj, filename, linenumber); | ||
| if (ref.index & 1) { |
There was a problem hiding this comment.
| if (ref.index&1) { | |
| if (is_tagged_int(ref)) { |
When reraising in a
finallyblock, 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