On Fri, 2026-08-14 at 16:19 -0700, Vineet Gupta wrote:
> The verifier's linked-scalar machinery tracks register equality only for the
> full 64 bits (optionally with a constant delta). There is no way to record
> "these two registers share just their low 32 bits", so a 32-bit mov from a
> source with unknown high bits has to drop the relationship entirely, and a
> later narrowing of the source never reaches the destination:
> 
> >  r6 = ...                    /* full 64-bit unknown */
> >  w7 = w6                     /* 32-bit zero-extending mov          */
> >  if w6 != 0 goto .Lxx        /* not taken: r6's low 32 bits are 0  */
> >  if w7 == 0 goto .Lok   <-- not deduced today
> 
> The same gap exists for the 32-bit sign extension and was the
> motivation for this patchset.
> 
> >  0: (61) r2 = *(u32 *)(r1 +24)
> >  1: (bf) r0 = (s32)r2
> >  2: (56) if w2 != 0x0 goto pc+10       ; R2=0 (branch taken)
> >     ...
> > 12: (95) exit

Note that ldx instructions have similar structure: one can either zero
or sign extend on 32-bit load. I think this series should be expanded
to cover these cases.

Also, please drop RFC tag when submitting v2.

Reply via email to