Closed edsrzf closed 1 year ago
Hey @edsrzf, can you reproduce the issue on https://psalm.dev ?
Can confirm this problem m1 pro. On older intel macs the problem does not seem to appear.
Yep, this is an issue with the ARM64 JIT, can reproduce on my pi4 by scanning psalm itself
I'm afraid switching to tracing JIT will not fix the issue, only postpone it until the JIT decides to compile that code segment when it gets hot enough.
The only workaround I see is running (function (int $_): void {})($combinations);
before the assertions, or turning them into explicit ifs.
Anecdotally, I'm able to type-check a large code base using opcache.jit=1205
. I don't know if there's a way to tell whether the code segment is getting hot enough to be JIT compiled.
~Is this reported to / fixed in https://github.com/php/php-src?~
Yes it is: https://github.com/php/php-src/issues/10635
After updating from 5.6.0 to 5.7.1, I'm seeing an assertion when type-checking my code. It happens often, but not 100% of the time.
If I change
opcache.jit
from1205
to1254
(which is the default), the assertion goes away.System Information
OS: MacOS 13.2.1 CPU: arm64 PHP: 8.1.15
Stack Trace
Code
The code that triggers this assertion is:
(This can't be reproduced with a snippet because the snippet likely runs on a different platform.)
Further Debugging
This is probably a JIT bug in PHP. If I add some debug logging I see some truly unexplainable behavior:
Original code:
With added debugging:
When the assertion triggers, the output of this code is:
So, it's saying 1 !== 1, which is...puzzling, to say the least. Also, if I change the order of the logging and move
var_dump($combinations)
first, the output becomes: