You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
JIT: register operand must be loaded before the typed reference check #24386
With the tracing JIT and low hot thresholds, a by-ref foreach over an array argument plus a function using global and static, called from a hot loop, hits an assertion in ir_gcm_schedule_late() when the trace is compiled.
I expected the script to run and exit normally, as it does on the release build and with opcache.jit=0.
It reproduces at 5ccc56b (latest upstream when checked). It is assertion-only: the build with assertions enabled aborts (rc 134, SIGABRT), the release build exits 0 with correct output. The same assertion was reported in #17190 (closed); I did not check whether it is the same cause. opcache.jit=1252, 1253 and 0153 with the same thresholds also fail; jit=function does not. With the default hot thresholds the loop never gets hot and nothing fails.
Looks like the trace IR built in zend_jit_trace.c/zend_jit_ir.c has a value used in a block that its early-scheduled block does not dominate, which ir_gcm_schedule_late() then catches. I did not find the exact node. It still fails with PR #24298 (Update IR) applied. PR #18392 (JIT: Don't reuse IP register for EX(call)) may be related; not tested here, its diff does not apply on the latest commit.
Found with an LLM-based testing tool; I used Claude to reduce it and look for the cause.
changed the title [-]JIT: ir_gcm_schedule_late assertion "Early placement doesn't dominate the late" with tracing JIT[/-][+]JIT: register operand must be loaded before the typed reference check[/+]on Oct 17, 2026
Activity
[-]JIT: ir_gcm_schedule_late assertion "Early placement doesn't dominate the late" with tracing JIT[/-][+]JIT: register operand must be loaded before the typed reference check[/+]