On Fri, Dec 15, 2023 at 8:22 AM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: > > On Thu, 2023-12-14 at 21:20 -0800, Andrii Nakryiko wrote: > [...] > > > > can we detect that any register link is broken and force checkpoint here? > > > > > > Should be possible. I'll try this in the morning and check veristat results. > > {still working on this} > > > > By the way, I added some stats collection for find_equal_scalars() and see > > > the following results when run on ./test_progs: > > > - maximal number of registers with same id per call: 3 > > > - average number of registers with same id per call: 1.4 > > > > What if we keep 8 extra bytes in jump/instruction history and encode > > up to 8 linked registers/slots: > > > > 1. 1 bit to mark whether it's a src_reg set, or dst_reg set > > 2. 1 bit to mark whether it's a stack slot or register > > 3. 6 bits (0..63 values) to record register or slot number > > > > If we ever need more than 8 linked registers, we can just forcefully > > some "links" by resetting some IDs? > > That should work as well. > Probably don't need src/dst bit, as backtracker marks both as precise > when processing conditional jump. yeah, probably > > You mean "just forcefully [breaking] some "links" by resetting ...", right? yeah, breaking, sorry, inattentive brain :) > > > BTW, is it only conditional jumps that need to record this linked > > register sets? Did we previously discuss why we don't need this for > > any other operation? > > Don't think that we discussed it. > Here is my reasoning: the range transfer happens at find_equal_scalars() > which is called only from check_cond_jmp_op(). > I think there are no other effects IDs have for scalar values. > Thus, covering conditional jumps seems sufficient. > > yep, makes sense, any other operation is breaking the link