Hi Youlin, On Sat, Aug 27, 2022 at 6:57 AM Youlin Li <liulin063@xxxxxxxxx> wrote: > > In adjust_scalar_min_max_vals(), let 32bit bounds learn from 64bit bounds > to get more tight bounds tracking. Similar operation can be found in > reg_set_min_max(). > > Note that we cannot simply add a call to __reg_combine_64_into_32(). In > previous versions of the code, when __reg_combine_64_into_32() was > called, the 32bit boundary was completely deduced from the 64bit > boundary, so there was a call to __mark_reg32_unbounded() in > __reg_combine_64_into_32(). But in adjust_scalar_min_max_vals(), the 32bit > bounds are already calculated to some extent, and __mark_reg32_unbounded() > will eliminate these information. > > Simply copying a code without __mark_reg32_unbounded() should work. > > Also, we can now fold reg_bounds_sync() into zext_32_to_64(). > > Before: > > func#0 @0 > 0: R1=ctx(off=0,imm=0) R10=fp0 > 0: (b7) r0 = 0 ; R0_w=0 > 1: (b7) r1 = 0 ; R1_w=0 > 2: (87) r1 = -r1 ; R1_w=scalar() > 3: (87) r1 = -r1 ; R1_w=scalar() > 4: (c7) r1 s>>= 63 ; R1_w=scalar(smin=-1,smax=0) > 5: (07) r1 += 2 ; R1_w=scalar(umin=1,umax=2,var_off=(0x0; 0xffffffff)) <--- [*] > 6: (95) exit > > It can be seen that even if the 64bit bounds is clear here, the 32bit > bounds is still in the state of 'UNKNOWN'. > > After: > > func#0 @0 > 0: R1=ctx(off=0,imm=0) R10=fp0 > 0: (b7) r0 = 0 ; R0_w=0 > 1: (b7) r1 = 0 ; R1_w=0 > 2: (87) r1 = -r1 ; R1_w=scalar() > 3: (87) r1 = -r1 ; R1_w=scalar() > 4: (c7) r1 s>>= 63 ; R1_w=scalar(smin=-1,smax=0) > 5: (07) r1 += 2 ; R1_w=scalar(umin=1,umax=2,var_off=(0x0; 0x3)) <--- [*] > 6: (95) exit > > Signed-off-by: Youlin Li <liulin063@xxxxxxxxx> > --- It might be better to put the code that performs the actual bounds deduction into a helper function. It avoids code duplication. But the current version looks fine to me. Thanks for the patch! Acked-by: Hao Luo <haoluo@xxxxxxxxxx>