The patch itself is fairly straight-forward, it simply extends LVI conservative meet operator to remember non-null facts when merging non-null constants.
However, the fact I had to write this is really making me question the value of pointer types in LVI as a whole. The lack of any decent meet rule basically means that pointer handling in LVI reduces to equality propagation and a dereferenceability based non-null analysis. Given GVN implements a version of the former (minus the meet of two constants case), I'm wondering whether pointers should just be removed from LVI and handled separately. I want to stew on that a bit further before actually landing this patch.